taskjuggler 0.0.10 → 0.0.11

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.
Files changed (787) hide show
  1. data/CHANGELOG +115 -0
  2. data/README.rdoc +105 -0
  3. data/examples/tutorial.tjp +21 -16
  4. data/gem_spec.rb +1 -1
  5. data/lib/{Account.rb → taskjuggler/Account.rb} +2 -3
  6. data/lib/{AccountScenario.rb → taskjuggler/AccountScenario.rb} +1 -1
  7. data/lib/taskjuggler/AlgorithmDiff.rb +311 -0
  8. data/lib/{Allocation.rb → taskjuggler/Allocation.rb} +3 -3
  9. data/lib/{AppConfig.rb → taskjuggler/AppConfig.rb} +0 -1
  10. data/lib/{AttributeBase.rb → taskjuggler/AttributeBase.rb} +1 -1
  11. data/lib/{AttributeDefinition.rb → taskjuggler/AttributeDefinition.rb} +0 -0
  12. data/lib/{Attributes.rb → taskjuggler/Attributes.rb} +19 -9
  13. data/lib/{BatchProcessor.rb → taskjuggler/BatchProcessor.rb} +0 -0
  14. data/lib/{Booking.rb → taskjuggler/Booking.rb} +0 -0
  15. data/lib/{Charge.rb → taskjuggler/Charge.rb} +1 -1
  16. data/lib/{ChargeSet.rb → taskjuggler/ChargeSet.rb} +1 -1
  17. data/lib/{DataCache.rb → taskjuggler/DataCache.rb} +0 -0
  18. data/lib/{FileList.rb → taskjuggler/FileList.rb} +0 -0
  19. data/lib/{HTMLDocument.rb → taskjuggler/HTMLDocument.rb} +1 -1
  20. data/lib/{Interval.rb → taskjuggler/Interval.rb} +1 -1
  21. data/lib/{IntervalList.rb → taskjuggler/IntervalList.rb} +1 -1
  22. data/lib/{Journal.rb → taskjuggler/Journal.rb} +2 -2
  23. data/lib/{KeywordArray.rb → taskjuggler/KeywordArray.rb} +0 -0
  24. data/lib/{KeywordDocumentation.rb → taskjuggler/KeywordDocumentation.rb} +5 -5
  25. data/lib/{Limits.rb → taskjuggler/Limits.rb} +1 -1
  26. data/lib/{Log.rb → taskjuggler/Log.rb} +0 -0
  27. data/lib/{LogFile.rb → taskjuggler/LogFile.rb} +0 -0
  28. data/lib/{LogicalExpression.rb → taskjuggler/LogicalExpression.rb} +3 -3
  29. data/lib/{LogicalFunction.rb → taskjuggler/LogicalFunction.rb} +1 -1
  30. data/lib/{LogicalOperation.rb → taskjuggler/LogicalOperation.rb} +1 -1
  31. data/lib/{MessageHandler.rb → taskjuggler/MessageHandler.rb} +3 -1
  32. data/lib/{Project.rb → taskjuggler/Project.rb} +51 -48
  33. data/lib/{ProjectFileParser.rb → taskjuggler/ProjectFileParser.rb} +25 -9
  34. data/lib/{ProjectFileScanner.rb → taskjuggler/ProjectFileScanner.rb} +5 -5
  35. data/lib/{PropertyList.rb → taskjuggler/PropertyList.rb} +0 -0
  36. data/lib/{PropertySet.rb → taskjuggler/PropertySet.rb} +3 -4
  37. data/lib/{PropertyTreeNode.rb → taskjuggler/PropertyTreeNode.rb} +157 -11
  38. data/lib/{Query.rb → taskjuggler/Query.rb} +17 -7
  39. data/lib/{RealFormat.rb → taskjuggler/RealFormat.rb} +0 -0
  40. data/lib/{Resource.rb → taskjuggler/Resource.rb} +8 -6
  41. data/lib/{ResourceScenario.rb → taskjuggler/ResourceScenario.rb} +26 -65
  42. data/lib/{RichText.rb → taskjuggler/RichText.rb} +3 -3
  43. data/lib/{RichTextDocument.rb → taskjuggler/RichText/Document.rb} +3 -3
  44. data/lib/{RichTextElement.rb → taskjuggler/RichText/Element.rb} +10 -4
  45. data/lib/{RichTextFunctionExample.rb → taskjuggler/RichText/FunctionExample.rb} +3 -3
  46. data/lib/{RichTextFunctionHandler.rb → taskjuggler/RichText/FunctionHandler.rb} +0 -0
  47. data/lib/{RichTextParser.rb → taskjuggler/RichText/Parser.rb} +6 -4
  48. data/lib/{RTFHandlers.rb → taskjuggler/RichText/RTFHandlers.rb} +4 -4
  49. data/lib/{RTFNavigator.rb → taskjuggler/RichText/RTFNavigator.rb} +3 -3
  50. data/lib/{RTFQuery.rb → taskjuggler/RichText/RTFQuery.rb} +62 -39
  51. data/lib/{RTFReport.rb → taskjuggler/RichText/RTFReport.rb} +2 -2
  52. data/lib/{RTFReportLink.rb → taskjuggler/RichText/RTFReportLink.rb} +4 -4
  53. data/lib/{RTFWithQuerySupport.rb → taskjuggler/RichText/RTFWithQuerySupport.rb} +1 -1
  54. data/lib/{RichTextScanner.rb → taskjuggler/RichText/Scanner.rb} +18 -5
  55. data/lib/{RichTextSnip.rb → taskjuggler/RichText/Snip.rb} +2 -2
  56. data/lib/{RichTextSyntaxRules.rb → taskjuggler/RichText/SyntaxRules.rb} +14 -0
  57. data/lib/{TOCEntry.rb → taskjuggler/RichText/TOCEntry.rb} +2 -2
  58. data/lib/{TableOfContents.rb → taskjuggler/RichText/TableOfContents.rb} +2 -2
  59. data/lib/{RuntimeConfig.rb → taskjuggler/RuntimeConfig.rb} +18 -18
  60. data/lib/{Scenario.rb → taskjuggler/Scenario.rb} +1 -1
  61. data/lib/{ScenarioData.rb → taskjuggler/ScenarioData.rb} +2 -3
  62. data/lib/{Scoreboard.rb → taskjuggler/Scoreboard.rb} +4 -4
  63. data/lib/{SheetHandlerBase.rb → taskjuggler/SheetHandlerBase.rb} +3 -3
  64. data/lib/{SheetReceiver.rb → taskjuggler/SheetReceiver.rb} +2 -2
  65. data/lib/{SheetSender.rb → taskjuggler/SheetSender.rb} +5 -5
  66. data/lib/{Shift.rb → taskjuggler/Shift.rb} +2 -3
  67. data/lib/{ShiftAssignments.rb → taskjuggler/ShiftAssignments.rb} +1 -1
  68. data/lib/{ShiftScenario.rb → taskjuggler/ShiftScenario.rb} +1 -1
  69. data/lib/{SimpleQueryExpander.rb → taskjuggler/SimpleQueryExpander.rb} +0 -0
  70. data/lib/{StatusSheetReceiver.rb → taskjuggler/StatusSheetReceiver.rb} +1 -1
  71. data/lib/{StatusSheetSender.rb → taskjuggler/StatusSheetSender.rb} +1 -1
  72. data/lib/{SyntaxReference.rb → taskjuggler/SyntaxReference.rb} +4 -4
  73. data/lib/{TableColumnDefinition.rb → taskjuggler/TableColumnDefinition.rb} +0 -0
  74. data/lib/{Task.rb → taskjuggler/Task.rb} +2 -2
  75. data/lib/{TaskDependency.rb → taskjuggler/TaskDependency.rb} +8 -0
  76. data/lib/{TaskJuggler.rb → taskjuggler/TaskJuggler.rb} +6 -4
  77. data/lib/{TaskScenario.rb → taskjuggler/TaskScenario.rb} +211 -150
  78. data/lib/taskjuggler/TernarySearchTree.rb +203 -0
  79. data/lib/{TextFormatter.rb → taskjuggler/TextFormatter.rb} +1 -1
  80. data/lib/{TextParser.rb → taskjuggler/TextParser.rb} +6 -6
  81. data/lib/{MacroTable.rb → taskjuggler/TextParser/MacroTable.rb} +2 -12
  82. data/lib/{TextParser → taskjuggler/TextParser}/Pattern.rb +5 -2
  83. data/lib/{TextParser → taskjuggler/TextParser}/Rule.rb +1 -1
  84. data/lib/{TextScanner.rb → taskjuggler/TextParser/Scanner.rb} +34 -32
  85. data/lib/{SourceFileInfo.rb → taskjuggler/TextParser/SourceFileInfo.rb} +1 -1
  86. data/lib/{TextParser → taskjuggler/TextParser}/StackElement.rb +0 -2
  87. data/lib/{TextParser → taskjuggler/TextParser}/State.rb +0 -0
  88. data/lib/{TextParser → taskjuggler/TextParser}/TokenDoc.rb +0 -0
  89. data/lib/{TimeSheetReceiver.rb → taskjuggler/TimeSheetReceiver.rb} +1 -1
  90. data/lib/{TimeSheetSender.rb → taskjuggler/TimeSheetSender.rb} +1 -1
  91. data/lib/{TimeSheetSummary.rb → taskjuggler/TimeSheetSummary.rb} +1 -1
  92. data/lib/{TimeSheets.rb → taskjuggler/TimeSheets.rb} +23 -16
  93. data/lib/{Tj3AppBase.rb → taskjuggler/Tj3AppBase.rb} +19 -12
  94. data/lib/{Tj3Config.rb → taskjuggler/Tj3Config.rb} +3 -3
  95. data/lib/taskjuggler/Tj3Man.rb +78 -0
  96. data/lib/{Tj3SheetAppBase.rb → taskjuggler/Tj3SheetAppBase.rb} +2 -2
  97. data/lib/{TjException.rb → taskjuggler/TjException.rb} +0 -0
  98. data/lib/{TjTime.rb → taskjuggler/TjTime.rb} +279 -234
  99. data/lib/{TjpExample.rb → taskjuggler/TjpExample.rb} +0 -0
  100. data/lib/{TjpSyntaxRules.rb → taskjuggler/TjpSyntaxRules.rb} +253 -95
  101. data/lib/{URLParameter.rb → taskjuggler/URLParameter.rb} +0 -0
  102. data/lib/{UTF8String.rb → taskjuggler/UTF8String.rb} +0 -0
  103. data/lib/{UserManual.rb → taskjuggler/UserManual.rb} +6 -6
  104. data/lib/{VimSyntax.rb → taskjuggler/VimSyntax.rb} +6 -2
  105. data/lib/{WorkingHours.rb → taskjuggler/WorkingHours.rb} +14 -22
  106. data/lib/{XMLDocument.rb → taskjuggler/XMLDocument.rb} +1 -1
  107. data/lib/{XMLElement.rb → taskjuggler/XMLElement.rb} +1 -1
  108. data/lib/taskjuggler/apps/Tj3.rb +134 -0
  109. data/lib/taskjuggler/apps/Tj3Client.rb +467 -0
  110. data/lib/taskjuggler/apps/Tj3Daemon.rb +142 -0
  111. data/lib/taskjuggler/apps/Tj3SsReceiver.rb +56 -0
  112. data/lib/taskjuggler/apps/Tj3SsSender.rb +90 -0
  113. data/lib/taskjuggler/apps/Tj3TsReceiver.rb +59 -0
  114. data/lib/taskjuggler/apps/Tj3TsSender.rb +77 -0
  115. data/lib/taskjuggler/apps/Tj3TsSummary.rb +86 -0
  116. data/lib/{daemon → taskjuggler/daemon}/Daemon.rb +4 -3
  117. data/lib/{daemon → taskjuggler/daemon}/ProcessIntercom.rb +2 -2
  118. data/lib/{daemon → taskjuggler/daemon}/ProjectBroker.rb +5 -5
  119. data/lib/{daemon → taskjuggler/daemon}/ProjectServer.rb +16 -16
  120. data/lib/{daemon → taskjuggler/daemon}/ReportServer.rb +6 -6
  121. data/lib/{daemon → taskjuggler/daemon}/ReportServlet.rb +2 -2
  122. data/lib/{daemon → taskjuggler/daemon}/WebServer.rb +4 -4
  123. data/lib/{daemon → taskjuggler/daemon}/WelcomePage.rb +2 -1
  124. data/lib/{deep_copy.rb → taskjuggler/deep_copy.rb} +0 -0
  125. data/lib/{reports → taskjuggler/reports}/CSVFile.rb +2 -2
  126. data/lib/{reports → taskjuggler/reports}/CollisionDetector.rb +1 -1
  127. data/lib/{reports → taskjuggler/reports}/ColumnTable.rb +1 -1
  128. data/lib/{reports → taskjuggler/reports}/GanttChart.rb +4 -4
  129. data/lib/{reports → taskjuggler/reports}/GanttContainer.rb +1 -1
  130. data/lib/{reports → taskjuggler/reports}/GanttHeader.rb +1 -1
  131. data/lib/{reports → taskjuggler/reports}/GanttHeaderScaleItem.rb +0 -0
  132. data/lib/{reports → taskjuggler/reports}/GanttLine.rb +6 -6
  133. data/lib/{reports → taskjuggler/reports}/GanttLoadStack.rb +1 -1
  134. data/lib/{reports → taskjuggler/reports}/GanttMilestone.rb +1 -1
  135. data/lib/{reports → taskjuggler/reports}/GanttRouter.rb +1 -1
  136. data/lib/{reports → taskjuggler/reports}/GanttTaskBar.rb +1 -1
  137. data/lib/{reports → taskjuggler/reports}/HTMLGraphics.rb +0 -0
  138. data/lib/{reports → taskjuggler/reports}/Navigator.rb +1 -1
  139. data/lib/{reports → taskjuggler/reports}/NikuReport.rb +3 -6
  140. data/lib/{reports → taskjuggler/reports}/Report.rb +19 -14
  141. data/lib/{reports → taskjuggler/reports}/ReportBase.rb +0 -0
  142. data/lib/{reports → taskjuggler/reports}/ReportContext.rb +0 -0
  143. data/lib/{reports → taskjuggler/reports}/ReportTable.rb +2 -2
  144. data/lib/{reports → taskjuggler/reports}/ReportTableCell.rb +0 -0
  145. data/lib/{reports → taskjuggler/reports}/ReportTableColumn.rb +0 -0
  146. data/lib/{reports → taskjuggler/reports}/ReportTableLegend.rb +0 -0
  147. data/lib/{reports → taskjuggler/reports}/ReportTableLine.rb +1 -1
  148. data/lib/{reports → taskjuggler/reports}/ResourceListRE.rb +4 -4
  149. data/lib/{reports → taskjuggler/reports}/StatusSheetReport.rb +1 -1
  150. data/lib/{reports → taskjuggler/reports}/TableReport.rb +8 -7
  151. data/lib/{reports → taskjuggler/reports}/TaskListRE.rb +4 -4
  152. data/lib/{reports → taskjuggler/reports}/TextReport.rb +1 -1
  153. data/lib/{reports → taskjuggler/reports}/TimeSheetReport.rb +1 -1
  154. data/lib/{reports → taskjuggler/reports}/TjpExportRE.rb +87 -29
  155. data/lib/tj3.rb +2 -144
  156. data/lib/tj3client.rb +2 -442
  157. data/lib/tj3d.rb +1 -133
  158. data/lib/tj3man.rb +2 -75
  159. data/lib/tj3ss_receiver.rb +2 -42
  160. data/lib/tj3ss_sender.rb +1 -76
  161. data/lib/tj3ts_receiver.rb +1 -45
  162. data/lib/tj3ts_sender.rb +1 -63
  163. data/lib/tj3ts_summary.rb +1 -72
  164. data/manual/How_To_Contribute +19 -49
  165. data/manual/Installation +65 -6
  166. data/manual/Reporting_Bugs +6 -20
  167. data/manual/TaskJuggler_Internals +8 -1
  168. data/manual/Tutorial +16 -0
  169. data/prj_cfg.rb +2 -3
  170. data/spec/IntervalList_spec.rb +2 -1
  171. data/spec/ProjectBroker_spec.rb +1 -1
  172. data/spec/TernarySearchTree_spec.rb +131 -0
  173. data/spec/TimeSheets_spec.rb +129 -0
  174. data/spec/Tj3Daemon_spec.rb +51 -0
  175. data/spec/Tj3_spec.rb +36 -0
  176. data/spec/support/DaemonControl.rb +78 -0
  177. data/spec/support/StdIoWrapper.rb +43 -0
  178. data/spec/tj3client.log +23 -0
  179. data/tasks/changelog.rake +17 -2
  180. data/tasks/csts.rake +2 -2
  181. data/tasks/manual.rake +9 -5
  182. data/tasks/missing.rake +0 -4
  183. data/tasks/rdoc.rake +2 -2
  184. data/tasks/vim.rake +9 -0
  185. data/test/TestSuite/CSV-Reports/alert.tjp +9 -0
  186. data/test/TestSuite/CSV-Reports/celltext.tjp +1 -0
  187. data/test/TestSuite/CSV-Reports/inputs.tjp +19 -0
  188. data/test/TestSuite/CSV-Reports/project-1.tji +9 -0
  189. data/test/TestSuite/CSV-Reports/refs/alert.csv +15 -0
  190. data/test/TestSuite/CSV-Reports/refs/celltext.csv +1 -0
  191. data/test/TestSuite/CSV-Reports/refs/inputs.csv +6 -0
  192. data/test/TestSuite/CSV-Reports/refs/resourcereport.csv +4 -4
  193. data/test/TestSuite/CSV-Reports/refs/resourcereport_with_tasks.csv +22 -22
  194. data/test/TestSuite/CSV-Reports/refs/sortByTree.csv +1 -0
  195. data/test/TestSuite/CSV-Reports/refs/sortBy_duration.down.csv +1 -0
  196. data/test/TestSuite/CSV-Reports/refs/sortBy_effort.up.csv +1 -0
  197. data/test/TestSuite/CSV-Reports/refs/sortBy_plan.start.down.csv +14 -13
  198. data/test/TestSuite/CSV-Reports/refs/targets.csv +5 -0
  199. data/test/TestSuite/CSV-Reports/refs/taskreport.csv +15 -14
  200. data/test/TestSuite/CSV-Reports/refs/taskreport_with_resources.csv +33 -32
  201. data/test/TestSuite/CSV-Reports/resourcereport.tjp +1 -0
  202. data/test/TestSuite/CSV-Reports/resourcereport_with_tasks.tjp +1 -0
  203. data/test/TestSuite/CSV-Reports/sortByTree.tjp +1 -0
  204. data/test/TestSuite/CSV-Reports/sortBy_duration.down.tjp +1 -0
  205. data/test/TestSuite/CSV-Reports/sortBy_effort.up.tjp +1 -0
  206. data/test/TestSuite/CSV-Reports/sortBy_plan.start.down.tjp +2 -1
  207. data/test/TestSuite/CSV-Reports/targets.tjp +20 -0
  208. data/test/TestSuite/CSV-Reports/taskreport.tjp +2 -1
  209. data/test/TestSuite/CSV-Reports/taskreport_with_resources.tjp +2 -1
  210. data/test/TestSuite/CSV-Reports/weekly.tjp +5 -2
  211. data/test/TestSuite/Export-Reports/export.tji +6 -0
  212. data/test/TestSuite/Export-Reports/refs/Account.tjp +92 -0
  213. data/test/TestSuite/Export-Reports/refs/AdoptedTasks.tjp +38 -0
  214. data/test/TestSuite/Export-Reports/refs/Allocate-1.tjp +124 -0
  215. data/test/TestSuite/Export-Reports/refs/Alternative.tjp +50 -0
  216. data/test/TestSuite/Export-Reports/refs/AutoID.tjp +45 -0
  217. data/test/TestSuite/Export-Reports/refs/AutoMacros.tjp +18 -0
  218. data/test/TestSuite/Export-Reports/refs/Booking.tjp +48 -0
  219. data/test/TestSuite/Export-Reports/refs/Caption.tjp +65 -0
  220. data/test/TestSuite/Export-Reports/refs/Celltext.tjp +45 -0
  221. data/test/TestSuite/Export-Reports/refs/Comments.tjp +67 -0
  222. data/test/TestSuite/Export-Reports/refs/Complete.tjp +50 -0
  223. data/test/TestSuite/Export-Reports/refs/CriticalPath.tjp +41 -0
  224. data/test/TestSuite/Export-Reports/refs/Currencyformat.tjp +18 -0
  225. data/test/TestSuite/Export-Reports/refs/CustomAttributes.tjp +24 -0
  226. data/test/TestSuite/Export-Reports/refs/DST.tjp +89 -0
  227. data/test/TestSuite/Export-Reports/refs/Depends1.tjp +57 -0
  228. data/test/TestSuite/Export-Reports/refs/Durations.tjp +84 -0
  229. data/test/TestSuite/Export-Reports/refs/Efficiency.tjp +58 -0
  230. data/test/TestSuite/Export-Reports/refs/Flags.tjp +51 -0
  231. data/test/TestSuite/Export-Reports/refs/Gap.tjp +38 -0
  232. data/test/TestSuite/Export-Reports/refs/HtmlTaskReport.tjp +67 -0
  233. data/test/TestSuite/Export-Reports/refs/Include.tjp +58 -0
  234. data/test/TestSuite/Export-Reports/refs/Journal.tjp +28 -0
  235. data/test/TestSuite/Export-Reports/refs/Limits-1.tjp +283 -0
  236. data/test/TestSuite/Export-Reports/refs/LoadUnits.tjp +617 -0
  237. data/test/TestSuite/Export-Reports/refs/LogicalExpression.tjp +18 -0
  238. data/test/TestSuite/Export-Reports/refs/LogicalFunction.tjp +57 -0
  239. data/test/TestSuite/Export-Reports/refs/Macro-1.tjp +91 -0
  240. data/test/TestSuite/Export-Reports/refs/Macro-2.tjp +18 -0
  241. data/test/TestSuite/Export-Reports/refs/Macro-3.tjp +18 -0
  242. data/test/TestSuite/Export-Reports/refs/Manager.tjp +121 -0
  243. data/test/TestSuite/Export-Reports/refs/Mandatory.tjp +59 -0
  244. data/test/TestSuite/Export-Reports/refs/Milestone.tjp +27 -0
  245. data/test/TestSuite/Export-Reports/refs/MinMax.tjp +30 -0
  246. data/test/TestSuite/Export-Reports/refs/Niku.tjp +218 -0
  247. data/test/TestSuite/Export-Reports/refs/Numberformat.tjp +18 -0
  248. data/test/TestSuite/Export-Reports/refs/Period.tjp +25 -0
  249. data/test/TestSuite/Export-Reports/refs/Persistent.tjp +49 -0
  250. data/test/TestSuite/Export-Reports/refs/Precedes1.tjp +46 -0
  251. data/test/TestSuite/Export-Reports/refs/Priority.tjp +141 -0
  252. data/test/TestSuite/Export-Reports/refs/Project.tjp +18 -0
  253. data/test/TestSuite/Export-Reports/refs/ProjectIDs.tjp +36 -0
  254. data/test/TestSuite/Export-Reports/refs/Query.tjp +49 -0
  255. data/test/TestSuite/Export-Reports/refs/ReleasePlan.tjp +79 -0
  256. data/test/TestSuite/Export-Reports/refs/Reports.tjp +130 -0
  257. data/test/TestSuite/Export-Reports/refs/Resource.tjp +59 -0
  258. data/test/TestSuite/Export-Reports/refs/ResourcePrefix.tjp +67 -0
  259. data/test/TestSuite/Export-Reports/refs/ResourceRoot.tjp +90 -0
  260. data/test/TestSuite/Export-Reports/refs/Responsible.tjp +50 -0
  261. data/test/TestSuite/Export-Reports/refs/RollupResource.tjp +90 -0
  262. data/test/TestSuite/Export-Reports/refs/Scenario.tjp +25 -0
  263. data/test/TestSuite/Export-Reports/refs/Scheduling.tjp +55 -0
  264. data/test/TestSuite/Export-Reports/refs/Select.tjp +89 -0
  265. data/test/TestSuite/Export-Reports/refs/Shift.tjp +39 -0
  266. data/test/TestSuite/Export-Reports/refs/Simple.tjp +67 -0
  267. data/test/TestSuite/Export-Reports/refs/StatusSheet.tjp +95 -0
  268. data/test/TestSuite/Export-Reports/refs/String.tjp +33 -0
  269. data/test/TestSuite/Export-Reports/refs/Supplement.tjp +41 -0
  270. data/test/TestSuite/Export-Reports/refs/TaskPrefix.tjp +49 -0
  271. data/test/TestSuite/Export-Reports/refs/TaskRoot.tjp +75 -0
  272. data/test/TestSuite/Export-Reports/refs/TimeFrame.tjp +51 -0
  273. data/test/TestSuite/Export-Reports/refs/TimeSheet1.tjp +81 -0
  274. data/test/TestSuite/Export-Reports/refs/Timezone.tjp +18 -0
  275. data/test/TestSuite/Export-Reports/refs/Vacation.tjp +69 -0
  276. data/test/TestSuite/Export-Reports/refs/tutorial.tjp +1061 -0
  277. data/test/TestSuite/Scheduler/Correct/Container-2.tjp +3 -1
  278. data/test/TestSuite/Scheduler/Correct/InheritStartEnd.tjp +5 -3
  279. data/test/TestSuite/Scheduler/Correct/Precedes.tjp +19 -19
  280. data/test/TestSuite/Scheduler/Correct/PriorityInversion.tjp +32 -0
  281. data/test/TestSuite/Scheduler/Correct/Scenarios.tjp +19 -0
  282. data/test/TestSuite/Scheduler/Correct/TimeSheet2.tjp +11 -0
  283. data/test/TestSuite/Scheduler/Correct/WeakDeps.tjp +14 -14
  284. data/test/TestSuite/Scheduler/Correct/checks.tji +5 -0
  285. data/test/TestSuite/Scheduler/Correct/css/tjmanual.css +20 -0
  286. data/test/TestSuite/StatusSheets/boss_mail +1 -1
  287. data/test/TestSuite/StatusSheets/dev2_mail +1 -1
  288. data/test/TestSuite/StatusSheets/run +2 -3
  289. data/test/TestSuite/Syntax/Correct/Account.tjp +1 -0
  290. data/test/TestSuite/Syntax/Correct/AdoptedTasks.tjp +9 -0
  291. data/test/TestSuite/Syntax/Correct/Allocate-1.tjp +3 -1
  292. data/test/TestSuite/Syntax/Correct/Alternative.tjp +3 -1
  293. data/test/TestSuite/Syntax/Correct/AutoID.tjp +3 -1
  294. data/test/TestSuite/Syntax/Correct/Booking.tjp +1 -0
  295. data/test/TestSuite/Syntax/Correct/Caption.tjp +3 -1
  296. data/test/TestSuite/Syntax/Correct/Celltext.tjp +3 -1
  297. data/test/TestSuite/Syntax/Correct/Comments.tjp +3 -1
  298. data/test/TestSuite/Syntax/Correct/Complete.tjp +1 -0
  299. data/test/TestSuite/Syntax/Correct/CriticalPath.tjp +2 -1
  300. data/test/TestSuite/Syntax/Correct/Currencyformat.tjp +2 -1
  301. data/test/TestSuite/Syntax/Correct/CustomAttributes.tjp +3 -2
  302. data/test/TestSuite/Syntax/Correct/DST.tjp +11 -0
  303. data/test/TestSuite/Syntax/Correct/Depends1.tjp +6 -4
  304. data/test/TestSuite/Syntax/Correct/Durations.tjp +3 -1
  305. data/test/TestSuite/Syntax/Correct/Efficiency.tjp +4 -2
  306. data/test/TestSuite/Syntax/Correct/Export.tjp +6 -4
  307. data/test/TestSuite/Syntax/Correct/Flags.tjp +3 -1
  308. data/test/TestSuite/Syntax/Correct/Freeze.tjp +2 -2
  309. data/test/TestSuite/Syntax/Correct/Gap.tjp +3 -1
  310. data/test/TestSuite/Syntax/Correct/HtmlTaskReport.tjp +4 -2
  311. data/test/TestSuite/Syntax/Correct/Include.tjp +3 -1
  312. data/test/TestSuite/Syntax/Correct/Journal.tjp +2 -1
  313. data/test/TestSuite/Syntax/Correct/Limits-1.tjp +13 -9
  314. data/test/TestSuite/Syntax/Correct/LoadUnits.tjp +1 -0
  315. data/test/TestSuite/Syntax/Correct/LogicalExpression.tjp +3 -1
  316. data/test/TestSuite/Syntax/Correct/LogicalFunction.tjp +3 -1
  317. data/test/TestSuite/Syntax/Correct/Macro-1.tjp +3 -1
  318. data/test/TestSuite/Syntax/Correct/Macro-2.tjp +3 -1
  319. data/test/TestSuite/Syntax/Correct/Macro-3.tjp +1 -0
  320. data/test/TestSuite/Syntax/Correct/Manager.tjp +4 -2
  321. data/test/TestSuite/Syntax/Correct/Mandatory.tjp +3 -1
  322. data/test/TestSuite/Syntax/Correct/Milestone.tjp +3 -1
  323. data/test/TestSuite/Syntax/Correct/MinMax.tjp +3 -1
  324. data/test/TestSuite/Syntax/Correct/Niku.tjp +1 -0
  325. data/test/TestSuite/Syntax/Correct/Numberformat.tjp +3 -2
  326. data/test/TestSuite/Syntax/Correct/Period.tjp +1 -0
  327. data/test/TestSuite/Syntax/Correct/Persistent.tjp +3 -1
  328. data/test/TestSuite/Syntax/Correct/Precedes1.tjp +6 -4
  329. data/test/TestSuite/Syntax/Correct/Priority.tjp +4 -2
  330. data/test/TestSuite/Syntax/Correct/Project.tjp +5 -4
  331. data/test/TestSuite/Syntax/Correct/ProjectIDs.tjp +3 -2
  332. data/test/TestSuite/Syntax/Correct/Query.tjp +1 -0
  333. data/test/TestSuite/Syntax/Correct/ReleasePlan.tjp +3 -1
  334. data/test/TestSuite/Syntax/Correct/Reports.tjp +7 -5
  335. data/test/TestSuite/Syntax/Correct/Resource.tjp +4 -2
  336. data/test/TestSuite/Syntax/Correct/ResourcePrefix.tjp +4 -2
  337. data/test/TestSuite/Syntax/Correct/ResourceRoot.tjp +3 -1
  338. data/test/TestSuite/Syntax/Correct/Responsible.tjp +3 -1
  339. data/test/TestSuite/Syntax/Correct/RollupResource.tjp +3 -1
  340. data/test/TestSuite/Syntax/Correct/Scenario.tjp +2 -1
  341. data/test/TestSuite/Syntax/Correct/Scheduling.tjp +3 -1
  342. data/test/TestSuite/Syntax/Correct/Select.tjp +3 -1
  343. data/test/TestSuite/Syntax/Correct/Shift.tjp +4 -2
  344. data/test/TestSuite/Syntax/Correct/Simple.tjp +3 -1
  345. data/test/TestSuite/Syntax/Correct/StatusSheet.tjp +4 -2
  346. data/test/TestSuite/Syntax/Correct/String.tjp +3 -1
  347. data/test/TestSuite/Syntax/Correct/Supplement.tjp +3 -1
  348. data/test/TestSuite/Syntax/Correct/TaskPrefix.tjp +3 -2
  349. data/test/TestSuite/Syntax/Correct/TaskRoot.tjp +3 -1
  350. data/test/TestSuite/Syntax/Correct/TimeFrame.tjp +3 -1
  351. data/test/TestSuite/Syntax/Correct/TimeSheet1.tjp +4 -2
  352. data/test/TestSuite/Syntax/Correct/Vacation.tjp +5 -3
  353. data/test/TestSuite/Syntax/Correct/tutorial.tjp +23 -16
  354. data/test/TestSuite/Syntax/Errors/adopt_common_root.tjp +10 -0
  355. data/test/TestSuite/Syntax/Errors/adopt_duplicate_child.tjp +10 -0
  356. data/test/TestSuite/Syntax/Errors/adopt_duplicate_parent.tjp +10 -0
  357. data/test/TestSuite/{Scheduler/Errors/milestone_duration.tjp → Syntax/Errors/multiple_durations.tjp} +1 -1
  358. data/test/TestSuite/Syntax/Errors/operand_unkn_scen.tjp +6 -4
  359. data/test/TestSuite/Syntax/Errors/sorting_crit_exptd1.tjp +5 -3
  360. data/test/TestSuite/TimeSheets/dev2_mail1 +1 -1
  361. data/test/TestSuite/TimeSheets/dev2_mail2 +1 -1
  362. data/test/TestSuite/TimeSheets/run +2 -2
  363. data/test/TestSuite/TimeSheets/uu.txt +29 -0
  364. data/test/test_AlgorithmDiff.rb +139 -0
  365. data/test/test_BatchProcessor.rb +2 -1
  366. data/test/test_CSV-Reports.rb +30 -19
  367. data/test/test_CSVFile.rb +2 -1
  368. data/test/test_CollisionDetector.rb +2 -1
  369. data/test/test_Export-Reports.rb +128 -0
  370. data/test/test_Journal.rb +2 -1
  371. data/test/test_Limits.rb +4 -3
  372. data/test/test_LogicalExpression.rb +2 -1
  373. data/test/test_MacroTable.rb +8 -6
  374. data/test/test_Project.rb +2 -1
  375. data/test/test_ProjectFileScanner.rb +4 -3
  376. data/test/test_PropertySet.rb +2 -1
  377. data/test/test_Query.rb +3 -2
  378. data/test/test_RealFormat.rb +2 -1
  379. data/test/test_ReportGenerator.rb +3 -2
  380. data/test/test_RichText.rb +14 -3
  381. data/test/test_Scheduler.rb +2 -1
  382. data/test/test_ShiftAssignments.rb +3 -1
  383. data/test/test_SimpleQueryExpander.rb +3 -2
  384. data/test/test_Syntax.rb +2 -1
  385. data/test/test_TextFormatter.rb +2 -1
  386. data/test/test_TjTime.rb +15 -14
  387. data/test/test_TjpExample.rb +2 -1
  388. data/test/test_URLParameter.rb +2 -1
  389. data/test/test_UTF8String.rb +2 -1
  390. data/test/test_WorkingHours.rb +3 -2
  391. data/test/test_deep_copy.rb +2 -1
  392. metadata +250 -541
  393. data/README +0 -31
  394. data/benchmarks/allocatedSlots.csv +0 -334
  395. data/benchmarks/profile.clt +0 -42974
  396. data/benchmarks/profile.html +0 -61128
  397. data/doc/AppConfig.html +0 -1471
  398. data/doc/Arguments.html +0 -720
  399. data/doc/CHANGELOG.html +0 -1987
  400. data/doc/COPYING.html +0 -879
  401. data/doc/Object.html +0 -1056
  402. data/doc/README.html +0 -565
  403. data/doc/RuntimeConfig.html +0 -804
  404. data/doc/String.html +0 -913
  405. data/doc/TaskJuggler.html +0 -2512
  406. data/doc/TaskJuggler/Account.html +0 -733
  407. data/doc/TaskJuggler/AccountAttribute.html +0 -749
  408. data/doc/TaskJuggler/AccountScenario.html +0 -692
  409. data/doc/TaskJuggler/Allocation.html +0 -943
  410. data/doc/TaskJuggler/AllocationAttribute.html +0 -779
  411. data/doc/TaskJuggler/AttributeBase.html +0 -1308
  412. data/doc/TaskJuggler/AttributeDefinition.html +0 -795
  413. data/doc/TaskJuggler/AttributeOverwrite.html +0 -586
  414. data/doc/TaskJuggler/BatchProcessor.html +0 -1158
  415. data/doc/TaskJuggler/Booking.html +0 -839
  416. data/doc/TaskJuggler/BookingListAttribute.html +0 -749
  417. data/doc/TaskJuggler/BooleanAttribute.html +0 -749
  418. data/doc/TaskJuggler/CSVFile.html +0 -1108
  419. data/doc/TaskJuggler/CellSettingPattern.html +0 -680
  420. data/doc/TaskJuggler/CellSettingPatternList.html +0 -729
  421. data/doc/TaskJuggler/Charge.html +0 -757
  422. data/doc/TaskJuggler/ChargeListAttribute.html +0 -713
  423. data/doc/TaskJuggler/ChargeSet.html +0 -929
  424. data/doc/TaskJuggler/ChargeSetListAttribute.html +0 -758
  425. data/doc/TaskJuggler/CollisionDetector.html +0 -1069
  426. data/doc/TaskJuggler/ColumnListAttribute.html +0 -713
  427. data/doc/TaskJuggler/ColumnTable.html +0 -743
  428. data/doc/TaskJuggler/Daemon.html +0 -798
  429. data/doc/TaskJuggler/DataCache.html +0 -930
  430. data/doc/TaskJuggler/DataCacheEntry.html +0 -717
  431. data/doc/TaskJuggler/DateAttribute.html +0 -717
  432. data/doc/TaskJuggler/DefinitionListAttribute.html +0 -635
  433. data/doc/TaskJuggler/DependencyListAttribute.html +0 -753
  434. data/doc/TaskJuggler/DurationAttribute.html +0 -750
  435. data/doc/TaskJuggler/FileList.html +0 -731
  436. data/doc/TaskJuggler/FileRecord.html +0 -682
  437. data/doc/TaskJuggler/FixnumAttribute.html +0 -671
  438. data/doc/TaskJuggler/FlagListAttribute.html +0 -749
  439. data/doc/TaskJuggler/FloatAttribute.html +0 -713
  440. data/doc/TaskJuggler/FormatListAttribute.html +0 -677
  441. data/doc/TaskJuggler/GanttChart.html +0 -1467
  442. data/doc/TaskJuggler/GanttContainer.html +0 -925
  443. data/doc/TaskJuggler/GanttHeader.html +0 -928
  444. data/doc/TaskJuggler/GanttHeaderScaleItem.html +0 -742
  445. data/doc/TaskJuggler/GanttLine.html +0 -1305
  446. data/doc/TaskJuggler/GanttLoadStack.html +0 -808
  447. data/doc/TaskJuggler/GanttMilestone.html +0 -906
  448. data/doc/TaskJuggler/GanttRouter.html +0 -1118
  449. data/doc/TaskJuggler/GanttTaskBar.html +0 -927
  450. data/doc/TaskJuggler/HTMLDocument.html +0 -761
  451. data/doc/TaskJuggler/HTMLGraphics.html +0 -817
  452. data/doc/TaskJuggler/Interval.html +0 -1056
  453. data/doc/TaskJuggler/IntervalList.html +0 -777
  454. data/doc/TaskJuggler/IntervalListAttribute.html +0 -753
  455. data/doc/TaskJuggler/JobInfo.html +0 -923
  456. data/doc/TaskJuggler/Journal.html +0 -1158
  457. data/doc/TaskJuggler/JournalEntry.html +0 -821
  458. data/doc/TaskJuggler/JournalEntryList.html +0 -1071
  459. data/doc/TaskJuggler/KeywordArray.html +0 -676
  460. data/doc/TaskJuggler/KeywordDocumentation.html +0 -1838
  461. data/doc/TaskJuggler/Limits.html +0 -1016
  462. data/doc/TaskJuggler/Limits/Limit.html +0 -927
  463. data/doc/TaskJuggler/LimitsAttribute.html +0 -714
  464. data/doc/TaskJuggler/ListAttributeBase.html +0 -683
  465. data/doc/TaskJuggler/Log.html +0 -1143
  466. data/doc/TaskJuggler/LogFile.html +0 -960
  467. data/doc/TaskJuggler/LogicalAttribute.html +0 -740
  468. data/doc/TaskJuggler/LogicalExpression.html +0 -781
  469. data/doc/TaskJuggler/LogicalExpressionAttribute.html +0 -671
  470. data/doc/TaskJuggler/LogicalExpressionListAttribute.html +0 -671
  471. data/doc/TaskJuggler/LogicalFlag.html +0 -723
  472. data/doc/TaskJuggler/LogicalFunction.html +0 -1306
  473. data/doc/TaskJuggler/LogicalOperation.html +0 -1124
  474. data/doc/TaskJuggler/Macro.html +0 -688
  475. data/doc/TaskJuggler/MacroTable.html +0 -852
  476. data/doc/TaskJuggler/ManagerResponsibilities.html +0 -716
  477. data/doc/TaskJuggler/ManagerStatusRecord.html +0 -720
  478. data/doc/TaskJuggler/Message.html +0 -817
  479. data/doc/TaskJuggler/MessageHandler.html +0 -1036
  480. data/doc/TaskJuggler/Navigator.html +0 -922
  481. data/doc/TaskJuggler/NavigatorElement.html +0 -974
  482. data/doc/TaskJuggler/NikuProject.html +0 -704
  483. data/doc/TaskJuggler/NikuReport.html +0 -1449
  484. data/doc/TaskJuggler/NikuResource.html +0 -674
  485. data/doc/TaskJuggler/NodeListAttribute.html +0 -635
  486. data/doc/TaskJuggler/PlaceHolderCell.html +0 -728
  487. data/doc/TaskJuggler/ProcessIntercom.html +0 -997
  488. data/doc/TaskJuggler/ProcessIntercomIface.html +0 -753
  489. data/doc/TaskJuggler/Project.html +0 -3333
  490. data/doc/TaskJuggler/ProjectBroker.html +0 -1656
  491. data/doc/TaskJuggler/ProjectBrokerIface.html +0 -831
  492. data/doc/TaskJuggler/ProjectFileParser.html +0 -2033
  493. data/doc/TaskJuggler/ProjectFileScanner.html +0 -1816
  494. data/doc/TaskJuggler/ProjectRecord.html +0 -958
  495. data/doc/TaskJuggler/ProjectServer.html +0 -1229
  496. data/doc/TaskJuggler/ProjectServerIface.html +0 -848
  497. data/doc/TaskJuggler/PropertyAttribute.html +0 -671
  498. data/doc/TaskJuggler/PropertyList.html +0 -1379
  499. data/doc/TaskJuggler/PropertySet.html +0 -1799
  500. data/doc/TaskJuggler/PropertyTreeNode.html +0 -2579
  501. data/doc/TaskJuggler/Query.html +0 -1663
  502. data/doc/TaskJuggler/RTFHandlers.html +0 -644
  503. data/doc/TaskJuggler/RTFNavigator.html +0 -772
  504. data/doc/TaskJuggler/RTFQuery.html +0 -1040
  505. data/doc/TaskJuggler/RTFReport.html +0 -800
  506. data/doc/TaskJuggler/RTFReportLink.html +0 -792
  507. data/doc/TaskJuggler/RTFWithQuerySupport.html +0 -682
  508. data/doc/TaskJuggler/RealFormat.html +0 -785
  509. data/doc/TaskJuggler/RealFormatAttribute.html +0 -635
  510. data/doc/TaskJuggler/ReferenceAttribute.html +0 -824
  511. data/doc/TaskJuggler/Report.html +0 -1477
  512. data/doc/TaskJuggler/ReportBase.html +0 -1246
  513. data/doc/TaskJuggler/ReportContext.html +0 -816
  514. data/doc/TaskJuggler/ReportServer.html +0 -1048
  515. data/doc/TaskJuggler/ReportServerIface.html +0 -882
  516. data/doc/TaskJuggler/ReportServerRecord.html +0 -761
  517. data/doc/TaskJuggler/ReportServlet.html +0 -1024
  518. data/doc/TaskJuggler/ReportTable.html +0 -1159
  519. data/doc/TaskJuggler/ReportTableCell.html +0 -1646
  520. data/doc/TaskJuggler/ReportTableColumn.html +0 -870
  521. data/doc/TaskJuggler/ReportTableLegend.html +0 -1040
  522. data/doc/TaskJuggler/ReportTableLine.html +0 -1047
  523. data/doc/TaskJuggler/Resource.html +0 -972
  524. data/doc/TaskJuggler/ResourceListAttribute.html +0 -810
  525. data/doc/TaskJuggler/ResourceListRE.html +0 -717
  526. data/doc/TaskJuggler/ResourceScenario.html +0 -2599
  527. data/doc/TaskJuggler/RichText.html +0 -859
  528. data/doc/TaskJuggler/RichTextAttribute.html +0 -785
  529. data/doc/TaskJuggler/RichTextDocument.html +0 -1018
  530. data/doc/TaskJuggler/RichTextElement.html +0 -1754
  531. data/doc/TaskJuggler/RichTextFunctionExample.html +0 -779
  532. data/doc/TaskJuggler/RichTextFunctionHandler.html +0 -730
  533. data/doc/TaskJuggler/RichTextImage.html +0 -692
  534. data/doc/TaskJuggler/RichTextIntermediate.html +0 -1265
  535. data/doc/TaskJuggler/RichTextParser.html +0 -847
  536. data/doc/TaskJuggler/RichTextScanner.html +0 -1469
  537. data/doc/TaskJuggler/RichTextSnip.html +0 -980
  538. data/doc/TaskJuggler/RichTextSyntaxRules.html +0 -2018
  539. data/doc/TaskJuggler/Scenario.html +0 -636
  540. data/doc/TaskJuggler/ScenarioData.html +0 -818
  541. data/doc/TaskJuggler/ScenarioListAttribute.html +0 -713
  542. data/doc/TaskJuggler/Scoreboard.html +0 -1181
  543. data/doc/TaskJuggler/SheetHandlerBase.html +0 -1275
  544. data/doc/TaskJuggler/SheetReceiver.html +0 -1368
  545. data/doc/TaskJuggler/SheetSender.html +0 -1134
  546. data/doc/TaskJuggler/Shift.html +0 -731
  547. data/doc/TaskJuggler/ShiftAssignment.html +0 -988
  548. data/doc/TaskJuggler/ShiftAssignments.html +0 -1393
  549. data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +0 -714
  550. data/doc/TaskJuggler/ShiftScenario.html +0 -762
  551. data/doc/TaskJuggler/SimpleQueryExpander.html +0 -713
  552. data/doc/TaskJuggler/SortListAttribute.html +0 -671
  553. data/doc/TaskJuggler/SourceFileInfo.html +0 -740
  554. data/doc/TaskJuggler/StatusSheetReceiver.html +0 -658
  555. data/doc/TaskJuggler/StatusSheetReport.html +0 -910
  556. data/doc/TaskJuggler/StatusSheetSender.html +0 -788
  557. data/doc/TaskJuggler/StringAttribute.html +0 -713
  558. data/doc/TaskJuggler/SymbolAttribute.html +0 -671
  559. data/doc/TaskJuggler/SyntaxReference.html +0 -1220
  560. data/doc/TaskJuggler/TOCEntry.html +0 -816
  561. data/doc/TaskJuggler/TSResourceRecord.html +0 -712
  562. data/doc/TaskJuggler/TSTaskRecord.html +0 -724
  563. data/doc/TaskJuggler/TableColumnDefinition.html +0 -928
  564. data/doc/TaskJuggler/TableOfContents.html +0 -770
  565. data/doc/TaskJuggler/TableReport.html +0 -2533
  566. data/doc/TaskJuggler/Task.html +0 -865
  567. data/doc/TaskJuggler/TaskDependency.html +0 -772
  568. data/doc/TaskJuggler/TaskListAttribute.html +0 -753
  569. data/doc/TaskJuggler/TaskListRE.html +0 -716
  570. data/doc/TaskJuggler/TaskScenario.html +0 -4959
  571. data/doc/TaskJuggler/TextFormatter.html +0 -953
  572. data/doc/TaskJuggler/TextParser.html +0 -1773
  573. data/doc/TaskJuggler/TextParser/Pattern.html +0 -1717
  574. data/doc/TaskJuggler/TextParser/Rule.html +0 -1399
  575. data/doc/TaskJuggler/TextParser/StackElement.html +0 -922
  576. data/doc/TaskJuggler/TextParser/State.html +0 -995
  577. data/doc/TaskJuggler/TextParser/StateTransition.html +0 -788
  578. data/doc/TaskJuggler/TextParser/TextParserResultArray.html +0 -691
  579. data/doc/TaskJuggler/TextParser/TokenDoc.html +0 -722
  580. data/doc/TaskJuggler/TextReport.html +0 -901
  581. data/doc/TaskJuggler/TextScanner.html +0 -1482
  582. data/doc/TaskJuggler/TextScanner/BufferStreamHandle.html +0 -641
  583. data/doc/TaskJuggler/TextScanner/FileStreamHandle.html +0 -707
  584. data/doc/TaskJuggler/TextScanner/MacroStackEntry.html +0 -704
  585. data/doc/TaskJuggler/TextScanner/StreamHandle.html +0 -1036
  586. data/doc/TaskJuggler/TimeSheet.html +0 -1232
  587. data/doc/TaskJuggler/TimeSheetReceiver.html +0 -655
  588. data/doc/TaskJuggler/TimeSheetRecord.html +0 -1395
  589. data/doc/TaskJuggler/TimeSheetReport.html +0 -991
  590. data/doc/TaskJuggler/TimeSheetSender.html +0 -680
  591. data/doc/TaskJuggler/TimeSheetSummary.html +0 -935
  592. data/doc/TaskJuggler/TimeSheets.html +0 -716
  593. data/doc/TaskJuggler/Tj3AppBase.html +0 -831
  594. data/doc/TaskJuggler/Tj3Client.html +0 -1477
  595. data/doc/TaskJuggler/Tj3Daemon.html +0 -884
  596. data/doc/TaskJuggler/Tj3SheetAppBase.html +0 -738
  597. data/doc/TaskJuggler/Tj3SsReceiver.html +0 -724
  598. data/doc/TaskJuggler/Tj3SsSender.html +0 -757
  599. data/doc/TaskJuggler/Tj3TsReceiver.html +0 -724
  600. data/doc/TaskJuggler/Tj3TsSender.html +0 -744
  601. data/doc/TaskJuggler/Tj3TsSummary.html +0 -752
  602. data/doc/TaskJuggler/TjException.html +0 -672
  603. data/doc/TaskJuggler/TjTime.html +0 -2807
  604. data/doc/TaskJuggler/TjpExample.html +0 -877
  605. data/doc/TaskJuggler/TjpExportRE.html +0 -1598
  606. data/doc/TaskJuggler/TjpSyntaxRules.html +0 -13611
  607. data/doc/TaskJuggler/URLParameter.html +0 -671
  608. data/doc/TaskJuggler/UserManual.html +0 -1188
  609. data/doc/TaskJuggler/VimSyntax.html +0 -1044
  610. data/doc/TaskJuggler/WebServer.html +0 -737
  611. data/doc/TaskJuggler/WelcomePage.html +0 -769
  612. data/doc/TaskJuggler/WorkingHours.html +0 -1207
  613. data/doc/TaskJuggler/WorkingHoursAttribute.html +0 -736
  614. data/doc/TaskJuggler/XMLBlob.html +0 -687
  615. data/doc/TaskJuggler/XMLComment.html +0 -682
  616. data/doc/TaskJuggler/XMLDocument.html +0 -774
  617. data/doc/TaskJuggler/XMLElement.html +0 -942
  618. data/doc/TaskJuggler/XMLNamedText.html +0 -643
  619. data/doc/TaskJuggler/XMLText.html +0 -697
  620. data/doc/index.html +0 -4127
  621. data/doc/lib/AccountScenario_rb.html +0 -69
  622. data/doc/lib/Account_rb.html +0 -71
  623. data/doc/lib/Allocation_rb.html +0 -71
  624. data/doc/lib/AppConfig_rb.html +0 -71
  625. data/doc/lib/AttributeBase_rb.html +0 -69
  626. data/doc/lib/AttributeDefinition_rb.html +0 -67
  627. data/doc/lib/Attributes_rb.html +0 -83
  628. data/doc/lib/BatchProcessor_rb.html +0 -71
  629. data/doc/lib/Booking_rb.html +0 -67
  630. data/doc/lib/ChargeSet_rb.html +0 -69
  631. data/doc/lib/Charge_rb.html +0 -69
  632. data/doc/lib/DataCache_rb.html +0 -71
  633. data/doc/lib/FileList_rb.html +0 -67
  634. data/doc/lib/HTMLDocument_rb.html +0 -69
  635. data/doc/lib/IntervalList_rb.html +0 -69
  636. data/doc/lib/Interval_rb.html +0 -69
  637. data/doc/lib/Journal_rb.html +0 -67
  638. data/doc/lib/KeywordArray_rb.html +0 -67
  639. data/doc/lib/KeywordDocumentation_rb.html +0 -77
  640. data/doc/lib/Limits_rb.html +0 -69
  641. data/doc/lib/LogFile_rb.html +0 -69
  642. data/doc/lib/Log_rb.html +0 -71
  643. data/doc/lib/LogicalExpression_rb.html +0 -73
  644. data/doc/lib/LogicalFunction_rb.html +0 -69
  645. data/doc/lib/LogicalOperation_rb.html +0 -69
  646. data/doc/lib/MacroTable_rb.html +0 -73
  647. data/doc/lib/MessageHandler_rb.html +0 -67
  648. data/doc/lib/ProjectFileParser_rb.html +0 -77
  649. data/doc/lib/ProjectFileScanner_rb.html +0 -69
  650. data/doc/lib/Project_rb.html +0 -113
  651. data/doc/lib/PropertyList_rb.html +0 -67
  652. data/doc/lib/PropertySet_rb.html +0 -71
  653. data/doc/lib/PropertyTreeNode_rb.html +0 -67
  654. data/doc/lib/Query_rb.html +0 -69
  655. data/doc/lib/RTFHandlers_rb.html +0 -75
  656. data/doc/lib/RTFNavigator_rb.html +0 -73
  657. data/doc/lib/RTFQuery_rb.html +0 -73
  658. data/doc/lib/RTFReportLink_rb.html +0 -75
  659. data/doc/lib/RTFReport_rb.html +0 -71
  660. data/doc/lib/RTFWithQuerySupport_rb.html +0 -69
  661. data/doc/lib/RealFormat_rb.html +0 -67
  662. data/doc/lib/ResourceScenario_rb.html +0 -69
  663. data/doc/lib/Resource_rb.html +0 -71
  664. data/doc/lib/RichTextDocument_rb.html +0 -73
  665. data/doc/lib/RichTextElement_rb.html +0 -75
  666. data/doc/lib/RichTextFunctionExample_rb.html +0 -73
  667. data/doc/lib/RichTextFunctionHandler_rb.html +0 -67
  668. data/doc/lib/RichTextParser_rb.html +0 -73
  669. data/doc/lib/RichTextScanner_rb.html +0 -71
  670. data/doc/lib/RichTextSnip_rb.html +0 -71
  671. data/doc/lib/RichTextSyntaxRules_rb.html +0 -67
  672. data/doc/lib/RichText_rb.html +0 -73
  673. data/doc/lib/RuntimeConfig_rb.html +0 -69
  674. data/doc/lib/ScenarioData_rb.html +0 -71
  675. data/doc/lib/Scenario_rb.html +0 -69
  676. data/doc/lib/Scoreboard_rb.html +0 -69
  677. data/doc/lib/SheetHandlerBase_rb.html +0 -75
  678. data/doc/lib/SheetReceiver_rb.html +0 -79
  679. data/doc/lib/SheetSender_rb.html +0 -77
  680. data/doc/lib/ShiftAssignments_rb.html +0 -71
  681. data/doc/lib/ShiftScenario_rb.html +0 -69
  682. data/doc/lib/Shift_rb.html +0 -71
  683. data/doc/lib/SimpleQueryExpander_rb.html +0 -69
  684. data/doc/lib/SourceFileInfo_rb.html +0 -67
  685. data/doc/lib/StatusSheetReceiver_rb.html +0 -69
  686. data/doc/lib/StatusSheetSender_rb.html +0 -69
  687. data/doc/lib/SyntaxReference_rb.html +0 -75
  688. data/doc/lib/TOCEntry_rb.html +0 -71
  689. data/doc/lib/TableColumnDefinition_rb.html +0 -67
  690. data/doc/lib/TableOfContents_rb.html +0 -71
  691. data/doc/lib/TaskDependency_rb.html +0 -67
  692. data/doc/lib/TaskJuggler_rb.html +0 -75
  693. data/doc/lib/TaskScenario_rb.html +0 -71
  694. data/doc/lib/Task_rb.html +0 -71
  695. data/doc/lib/TextFormatter_rb.html +0 -69
  696. data/doc/lib/TextParser/Pattern_rb.html +0 -71
  697. data/doc/lib/TextParser/Rule_rb.html +0 -69
  698. data/doc/lib/TextParser/StackElement_rb.html +0 -69
  699. data/doc/lib/TextParser/State_rb.html +0 -67
  700. data/doc/lib/TextParser/TokenDoc_rb.html +0 -67
  701. data/doc/lib/TextParser_rb.html +0 -79
  702. data/doc/lib/TextScanner_rb.html +0 -83
  703. data/doc/lib/TimeSheetReceiver_rb.html +0 -69
  704. data/doc/lib/TimeSheetSender_rb.html +0 -69
  705. data/doc/lib/TimeSheetSummary_rb.html +0 -69
  706. data/doc/lib/TimeSheets_rb.html +0 -67
  707. data/doc/lib/Tj3AppBase_rb.html +0 -79
  708. data/doc/lib/Tj3Config_rb.html +0 -71
  709. data/doc/lib/Tj3SheetAppBase_rb.html +0 -69
  710. data/doc/lib/TjException_rb.html +0 -67
  711. data/doc/lib/TjTime_rb.html +0 -71
  712. data/doc/lib/TjpExample_rb.html +0 -69
  713. data/doc/lib/TjpSyntaxRules_rb.html +0 -67
  714. data/doc/lib/URLParameter_rb.html +0 -69
  715. data/doc/lib/UTF8String_rb.html +0 -67
  716. data/doc/lib/UserManual_rb.html +0 -79
  717. data/doc/lib/VimSyntax_rb.html +0 -69
  718. data/doc/lib/WorkingHours_rb.html +0 -71
  719. data/doc/lib/XMLDocument_rb.html +0 -69
  720. data/doc/lib/XMLElement_rb.html +0 -69
  721. data/doc/lib/daemon/Daemon_rb.html +0 -69
  722. data/doc/lib/daemon/ProcessIntercom_rb.html +0 -71
  723. data/doc/lib/daemon/ProjectBroker_rb.html +0 -83
  724. data/doc/lib/daemon/ProjectServer_rb.html +0 -85
  725. data/doc/lib/daemon/ReportServer_rb.html +0 -73
  726. data/doc/lib/daemon/ReportServlet_rb.html +0 -69
  727. data/doc/lib/daemon/WebServer_rb.html +0 -81
  728. data/doc/lib/daemon/WelcomePage_rb.html +0 -71
  729. data/doc/lib/deep_copy_rb.html +0 -67
  730. data/doc/lib/exchangebug_rb.html +0 -69
  731. data/doc/lib/reports/CSVFile_rb.html +0 -69
  732. data/doc/lib/reports/CollisionDetector_rb.html +0 -69
  733. data/doc/lib/reports/ColumnTable_rb.html +0 -69
  734. data/doc/lib/reports/GanttChart_rb.html +0 -75
  735. data/doc/lib/reports/GanttContainer_rb.html +0 -69
  736. data/doc/lib/reports/GanttHeaderScaleItem_rb.html +0 -67
  737. data/doc/lib/reports/GanttHeader_rb.html +0 -69
  738. data/doc/lib/reports/GanttLine_rb.html +0 -79
  739. data/doc/lib/reports/GanttLoadStack_rb.html +0 -69
  740. data/doc/lib/reports/GanttMilestone_rb.html +0 -69
  741. data/doc/lib/reports/GanttRouter_rb.html +0 -69
  742. data/doc/lib/reports/GanttTaskBar_rb.html +0 -69
  743. data/doc/lib/reports/HTMLGraphics_rb.html +0 -67
  744. data/doc/lib/reports/Navigator_rb.html +0 -69
  745. data/doc/lib/reports/NikuReport_rb.html +0 -71
  746. data/doc/lib/reports/ReportBase_rb.html +0 -67
  747. data/doc/lib/reports/ReportContext_rb.html +0 -67
  748. data/doc/lib/reports/ReportTableCell_rb.html +0 -67
  749. data/doc/lib/reports/ReportTableColumn_rb.html +0 -67
  750. data/doc/lib/reports/ReportTableLegend_rb.html +0 -67
  751. data/doc/lib/reports/ReportTableLine_rb.html +0 -69
  752. data/doc/lib/reports/ReportTable_rb.html +0 -71
  753. data/doc/lib/reports/Report_rb.html +0 -93
  754. data/doc/lib/reports/ResourceListRE_rb.html +0 -75
  755. data/doc/lib/reports/StatusSheetReport_rb.html +0 -69
  756. data/doc/lib/reports/TableReport_rb.html +0 -77
  757. data/doc/lib/reports/TaskListRE_rb.html +0 -75
  758. data/doc/lib/reports/TextReport_rb.html +0 -69
  759. data/doc/lib/reports/TimeSheetReport_rb.html +0 -69
  760. data/doc/lib/reports/TjpExportRE_rb.html +0 -69
  761. data/doc/lib/ruby-signal-bug_rb.html +0 -69
  762. data/doc/lib/test_rb.html +0 -73
  763. data/doc/lib/tj3_rb.html +0 -75
  764. data/doc/lib/tj3client_rb.html +0 -75
  765. data/doc/lib/tj3d_rb.html +0 -75
  766. data/doc/lib/tj3man_rb.html +0 -75
  767. data/doc/lib/tj3ss_receiver_rb.html +0 -71
  768. data/doc/lib/tj3ss_sender_rb.html +0 -71
  769. data/doc/lib/tj3ts_receiver_rb.html +0 -71
  770. data/doc/lib/tj3ts_sender_rb.html +0 -71
  771. data/doc/lib/tj3ts_summary_rb.html +0 -71
  772. data/doc/rdoc.css +0 -706
  773. data/lib/test.rb +0 -19
  774. data/setup.rb +0 -1585
  775. data/test/TestSuite/CSV-Reports/genrefs +0 -6
  776. data/test/TestSuite/Scheduler/Correct/Allocate.html +0 -2922
  777. data/test/TestSuite/Scheduler/Correct/Booking2.html +0 -603
  778. data/test/TestSuite/Scheduler/Correct/Container.html +0 -513
  779. data/test/TestSuite/Scheduler/Correct/Precedes.html +0 -834
  780. data/test/TestSuite/Scheduler/Correct/Shift.html +0 -429
  781. data/test/TestSuite/Scheduler/Correct/Shift2.html +0 -476
  782. data/test/TestSuite/Scheduler/Correct/TimeSheet2.html +0 -108
  783. data/test/TestSuite/Scheduler/Errors/task_underspecified_2.tjp +0 -8
  784. data/test/TestSuite/Syntax/Correct/ReleasePlan.html +0 -160
  785. data/test/TestSuite/Syntax/Correct/ResourcePrefix.html +0 -32
  786. data/test/TestSuite/Syntax/Correct/ResourceRoot.html +0 -108
  787. data/test/TestSuite/Syntax/Correct/niku.html +0 -67
@@ -11,7 +11,7 @@
11
11
  # published by the Free Software Foundation.
12
12
  #
13
13
 
14
- class TaskJuggler
14
+ class TaskJuggler::TextParser
15
15
 
16
16
  # Simple class that holds the info about a source file reference.
17
17
  class SourceFileInfo
@@ -11,8 +11,6 @@
11
11
  # published by the Free Software Foundation.
12
12
  #
13
13
 
14
- require 'SourceFileInfo'
15
-
16
14
  class TaskJuggler::TextParser
17
15
 
18
16
  # This class models the elements of the stack that the TextParser uses to keep
File without changes
@@ -11,7 +11,7 @@
11
11
  # published by the Free Software Foundation.
12
12
  #
13
13
 
14
- require 'SheetReceiver'
14
+ require 'taskjuggler/SheetReceiver'
15
15
 
16
16
  class TaskJuggler
17
17
 
@@ -11,7 +11,7 @@
11
11
  # published by the Free Software Foundation.
12
12
  #
13
13
 
14
- require 'SheetSender'
14
+ require 'taskjuggler/SheetSender'
15
15
 
16
16
  class TaskJuggler
17
17
 
@@ -11,7 +11,7 @@
11
11
  # published by the Free Software Foundation.
12
12
  #
13
13
 
14
- require 'SheetReceiver'
14
+ require 'taskjuggler/SheetReceiver'
15
15
 
16
16
  class TaskJuggler
17
17
 
@@ -215,7 +215,7 @@ class TaskJuggler
215
215
  resource = @timeSheet.resource
216
216
  project = resource.project
217
217
  scenarioIdx = @timeSheet.scenarioIdx
218
- startIdx = project.dateToIdx(project['now'], true)
218
+ startIdx = project.dateToIdx(project['now'])
219
219
  endIdx = project.dateToIdx(@task['end', scenarioIdx])
220
220
  @task.getEffectiveWork(scenarioIdx, startIdx, endIdx, resource)
221
221
  end
@@ -284,21 +284,28 @@ class TaskJuggler
284
284
  totalSlots += record.work
285
285
  end
286
286
 
287
- targetSlots = totalNetWorkingSlots
288
- # This is acceptable rounding error when checking the total reported
289
- # work.
290
- delta = 1
291
- if totalSlots < (targetSlots - delta)
292
- error('ts_work_too_low',
293
- "The total work to be reported for this time sheet " +
294
- "is #{workWithUnit(targetSlots)} but only " +
295
- "#{workWithUnit(totalSlots)} were reported.")
296
- end
297
- if totalSlots > (targetSlots + delta)
298
- error('ts_work_too_high',
299
- "The total work to be reported for this time sheet " +
300
- "is #{workWithUnit(targetSlots)} but " +
301
- "#{workWithUnit(totalSlots)} were reported.")
287
+ if @resource['efficiency', @resource.project['trackingScenarioIdx']] > 0.0
288
+ targetSlots = totalNetWorkingSlots
289
+ # This is acceptable rounding error when checking the total reported
290
+ # work.
291
+ delta = 1
292
+ if totalSlots < (targetSlots - delta)
293
+ error('ts_work_too_low',
294
+ "The total work to be reported for this time sheet " +
295
+ "is #{workWithUnit(targetSlots)} but only " +
296
+ "#{workWithUnit(totalSlots)} were reported.")
297
+ end
298
+ if totalSlots > (targetSlots + delta)
299
+ error('ts_work_too_high',
300
+ "The total work to be reported for this time sheet " +
301
+ "is #{workWithUnit(targetSlots)} but " +
302
+ "#{workWithUnit(totalSlots)} were reported.")
303
+ end
304
+ else
305
+ if totalSlots > 0
306
+ error('ts_work_not_null',
307
+ "The reported work for non-working resources must be 0.")
308
+ end
302
309
  end
303
310
  end
304
311
 
@@ -13,10 +13,10 @@
13
13
 
14
14
  require 'rubygems'
15
15
  require 'optparse'
16
- require 'Tj3Config'
17
- require 'RuntimeConfig'
18
- require 'TjTime'
19
- require 'TextFormatter'
16
+ require 'taskjuggler/Tj3Config'
17
+ require 'taskjuggler/RuntimeConfig'
18
+ require 'taskjuggler/TjTime'
19
+ require 'taskjuggler/TextFormatter'
20
20
 
21
21
  class TaskJuggler
22
22
 
@@ -64,33 +64,31 @@ class TaskJuggler
64
64
 
65
65
  @opts.on_tail('-h', '--help', format('Show this message')) do
66
66
  puts @opts.to_s
67
- exit 0
67
+ quit
68
68
  end
69
69
  @opts.on_tail('--version', format('Show version info')) do
70
70
  puts "#{AppConfig.softwareName} v#{AppConfig.version} - " +
71
71
  "#{AppConfig.packageInfo}"
72
- exit 0
72
+ quit
73
73
  end
74
74
 
75
75
  begin
76
76
  files = @opts.parse(argv)
77
77
  rescue OptionParser::ParseError => msg
78
78
  puts @opts.to_s + "\n"
79
- $stderr.puts msg
80
- exit 2
79
+ error(msg, 2)
81
80
  end
82
81
 
83
82
  files
84
83
  end
85
84
 
86
- def main
85
+ def main(argv = ARGV)
87
86
  # Install signal handler to exit gracefully on CTRL-C.
88
87
  intHandler = Kernel.trap('INT') do
89
- puts "\nAborting on user request!"
90
- exit 1
88
+ error("\nAborting on user request!")
91
89
  end
92
90
 
93
- args = processArguments(ARGV)
91
+ args = processArguments(argv)
94
92
 
95
93
  # If DEBUG mode has been enabled, we restore the INT trap handler again
96
94
  # to get Ruby backtrackes.
@@ -111,6 +109,15 @@ class TaskJuggler
111
109
 
112
110
  private
113
111
 
112
+ def quit
113
+ exit 0
114
+ end
115
+
116
+ def error(message, exitVal = 1)
117
+ $stderr.puts "ERROR: #{message}"
118
+ exit exitVal
119
+ end
120
+
114
121
  def format(str, indent = nil)
115
122
  indent = @optsSummaryWidth + @optsSummaryIndent + 1 unless indent
116
123
  TextFormatter.new(79, indent).format(str)[indent..-1]
@@ -11,10 +11,10 @@
11
11
  # published by the Free Software Foundation.
12
12
  #
13
13
 
14
- require 'UTF8String'
15
- require 'AppConfig'
14
+ require 'taskjuggler/UTF8String'
15
+ require 'taskjuggler/AppConfig'
16
16
 
17
- AppConfig.version = '0.0.10'
17
+ AppConfig.version = '0.0.11'
18
18
  AppConfig.packageName = 'taskjuggler'
19
19
  AppConfig.softwareName = 'TaskJuggler III'
20
20
  AppConfig.packageInfo = 'A Project Management Software'
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env ruby -w
2
+ # encoding: UTF-8
3
+ #
4
+ # = Tj3Man.rb -- The TaskJuggler III Project Management Software
5
+ #
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
7
+ # by Chris Schlaeger <chris@linux.com>
8
+ #
9
+ # This program is free software; you can redistribute it and/or modify
10
+ # it under the terms of version 2 of the GNU General Public License as
11
+ # published by the Free Software Foundation.
12
+ #
13
+
14
+ require 'taskjuggler/Tj3AppBase'
15
+ require 'taskjuggler/TernarySearchTree'
16
+ require 'taskjuggler/SyntaxReference'
17
+ require 'taskjuggler/UserManual'
18
+
19
+ AppConfig.appName = 'tj3man'
20
+
21
+ class TaskJuggler
22
+
23
+ class Tj3Man < Tj3AppBase
24
+
25
+ def initialize
26
+ super
27
+
28
+ @man = SyntaxReference.new
29
+ @keywords = TernarySearchTree.new(@man.all)
30
+ @manual = false
31
+ @directory = nil
32
+ end
33
+
34
+ def processArguments(argv)
35
+ super do
36
+ @opts.banner += <<'EOT'
37
+ This program can be used to generate the user manual in HTML format or to get
38
+ a textual help for individual keywords.
39
+ EOT
40
+ @opts.on('-d', '--dir <directory>', String,
41
+ format('directory to put the manual')) do |dir|
42
+ @directory = dir
43
+ end
44
+ @opts.on('-m', '--manual',
45
+ format('Generate the user manual into the current directory ' +
46
+ 'or the directory specified with the -d option.')) do
47
+ @manual = true
48
+ end
49
+ end
50
+ end
51
+
52
+ def main(argv = ARGV)
53
+ requestedKeywords = super
54
+ if @manual
55
+ UserManual.new.generate(@directory)
56
+ elsif requestedKeywords.empty?
57
+ puts @man.all.join("\n")
58
+ else
59
+ requestedKeywords.each do |keyword|
60
+ if (kws = @keywords[keyword, true]).nil?
61
+ $stderr.puts "No matches found for '#{keyword}'"
62
+ exit 1
63
+ elsif kws.length == 1 || kws.include?(keyword)
64
+ puts @man.to_s(keyword)
65
+ else
66
+ $stderr.puts "Multiple matches found for '#{keyword}':\n" +
67
+ "#{kws.join(', ')}"
68
+ return 1
69
+ end
70
+ end
71
+ end
72
+ 0
73
+ end
74
+
75
+ end
76
+
77
+ end
78
+
@@ -11,7 +11,7 @@
11
11
  # published by the Free Software Foundation.
12
12
  #
13
13
 
14
- require 'Tj3AppBase'
14
+ require 'taskjuggler/Tj3AppBase'
15
15
 
16
16
  class TaskJuggler
17
17
 
@@ -48,7 +48,7 @@ class TaskJuggler
48
48
  if ymdFilter.match(arg)
49
49
  @date = Time.mktime(*(ymdFilter.match(arg)[1..3]))
50
50
  else
51
- @date = TjTime.now.nextDayOfWeek(arg.to_i % 7)
51
+ @date = TjTime.new.nextDayOfWeek(arg.to_i % 7)
52
52
  end
53
53
  @date = @date.strftime('%Y-%m-%d')
54
54
  end
File without changes
@@ -16,155 +16,51 @@ require 'date'
16
16
 
17
17
  class TaskJuggler
18
18
 
19
- # The TjTime class is based on the original Ruby class Time but provides lots
20
- # of additional functionality.
19
+ # The TjTime class extends the original Ruby class Time with lots of
20
+ # TaskJuggler specific additional functionality. This is mostly for handling
21
+ # time zones.
21
22
  class TjTime
22
23
 
23
- attr_reader :time
24
+ attr_reader :time, :timeZone
24
25
 
25
26
  # The number of days per month. Leap years are taken care of separately.
26
27
  MON_MAX = [ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]
27
28
 
29
+ # The current time zone name.
30
+ @@tz = 'UTC'
31
+ ENV['TZ'] = @@tz
32
+
28
33
  # call-seq:
29
- # TjTime(time) -> Scenario
30
- # TjTime(s) -> Scenario
31
- # TjTime(secs) -> Scenario
34
+ # TjTime() -> TjTime (now)
35
+ # TjTime(tjtime) -> TjTime
36
+ # TjTime(time, timezone) -> TjTime
37
+ # TjTime(str) -> TjTime
38
+ # TjTime(secs) -> TjTime
32
39
  #
33
- # The constructor is overloaded and accepts 3 kinds of arguments. If _t_ is
34
- # a Time object this is just copied to the @time variable. If it's a string,
35
- # it is parsed as a date. Or else it is interpreted as seconds after Epoch.
36
- def initialize(t)
37
- if t.is_a?(Time)
40
+ # The constructor is overloaded and accepts 4 kinds of arguments. If _t_
41
+ # is a Time object it's assumed to be in local time. If it's a string, it
42
+ # is parsed as a date. Or else it is interpreted as seconds after Epoch.
43
+ def initialize(t = nil)
44
+ @timeZone = @@tz
45
+
46
+ case t
47
+ when nil
48
+ @time = Time.now
49
+ when Time
38
50
  @time = t
39
- elsif t.is_a?(String)
40
- @time = TjTime.parse(t).time
51
+ @timeZone = nil
52
+ when TjTime
53
+ @time = t.time
54
+ @timeZone = nil
55
+ when String
56
+ parse(t)
57
+ when Array
58
+ @time = Time.mktime(*t)
41
59
  else
42
60
  @time = Time.at(t)
43
61
  end
44
62
  end
45
63
 
46
- # Returns the current UTC time as Time object.
47
- def TjTime.now
48
- TjTime.new(Time.now.gmtime)
49
- end
50
-
51
- # Creates a time based on given values, interpreted as UTC. See Time.gm()
52
- # for details.
53
- def TjTime.gm(*args)
54
- TjTime.new(Time.gm(*args))
55
- end
56
-
57
- # Creates a time based on given values, interpreted as local time. The
58
- # result is stored as UTC time, though. See Time.local() for details.
59
- def TjTime.local(*args)
60
- TjTime.new(Time.local(*args).gmtime)
61
- end
62
-
63
- def TjTime.parse(t)
64
- year, month, day, time, zone = t.split('-', 5)
65
-
66
- # Check the year
67
- if year
68
- year = year.to_i
69
- if year < 1970 || year > 2035
70
- raise TjException.new, "Year #{year} out of range (1970 - 2035)"
71
- end
72
- else
73
- raise TjException.new, "Year not specified"
74
- end
75
-
76
- # Check the month
77
- if month
78
- month = month.to_i
79
- if month < 1 || month > 12
80
- raise TjException.new, "Month #{month} out of range (1 - 12)"
81
- end
82
- else
83
- raise TjException.new, "Month not specified"
84
- end
85
-
86
- # Check the day
87
- if day
88
- day = day.to_i
89
- maxDay = [ 0, 31, Date.gregorian_leap?(year) ? 29 : 28, 31, 30, 31,
90
- 30, 31, 31, 30, 31, 30, 31 ]
91
- if month < 1 || month > maxDay[month]
92
- raise TjException.new, "Day #{day} out of range (1 - #{maxDay[month]})"
93
- end
94
- else
95
- raise TjException.new, "Day not specified"
96
- end
97
-
98
- # The time is optional. Will be expanded to 00:00:00.
99
- if time
100
- hour, minute, second = time.split(':')
101
-
102
- # Check hour
103
- if hour
104
- hour = hour.to_i
105
- if hour < 0 || hour > 23
106
- raise TjException.new, "Hour #{hour} out of range (0 - 23)"
107
- end
108
- else
109
- raise TjException.new, "Hour not specified"
110
- end
111
-
112
- if minute
113
- minute = minute.to_i
114
- if minute < 0 || minute > 59
115
- raise TjException.new, "Minute #{minute} out of range (0 - 59)"
116
- end
117
- else
118
- raise TjException.new, "Minute not specified"
119
- end
120
-
121
- # Check sencond. This value is optional and defaults to 0.
122
- if second
123
- second = second.to_i
124
- if second < 0 || second > 59
125
- raise TjException.new, "Second #{second} out of range (0 - 59)"
126
- end
127
- else
128
- second = 0
129
- end
130
- else
131
- hour = minute = second = 0
132
- end
133
-
134
- # The zone is optional and defaults to the current time zone.
135
- if zone
136
- if zone[0] != ?- && zone[0] != ?+
137
- raise TjException.new, "Time zone adjustment must be prefixed by " +
138
- "+ or -, not #{zone[0]}"
139
- end
140
- if zone.length != 5
141
- raise TjException.new, "Time zone adjustment must use (+/-)HHMM format"
142
- end
143
-
144
- date = Time.utc(year, month, day, hour, minute, second)
145
- sign = zone[0] == ?- ? 1 : -1
146
- tzHour = zone[1..2].to_i
147
- if tzHour < 0 || tzHour > 12
148
- raise TjException.new, "Time zone adjustment hour out of range " +
149
- "(0 - 12) but is #{tzHour}"
150
- end
151
- tzMinute = zone[3..4].to_i
152
- if tzMinute < 0 || tzMinute > 59
153
- raise TjException.new, "Time zone adjustment minute out of range " +
154
- "(0 - 59) but is #{tzMinute}"
155
- end
156
- date += sign * (tzHour * 3600 + tzMinute * 60)
157
- else
158
- date = Time.mktime(year, month, day, hour, minute, second)
159
- end
160
-
161
- #puts "--> #{t}"
162
- #puts(">>> #{year}-#{month}-#{day}-#{hour}:#{minute}:#{second}" +
163
- # "#{zone ? "-#{tzHour}:#{tzMinute}" : ""}")
164
- #puts "=== #{date}"
165
- TjTime.new(date)
166
- end
167
-
168
64
  # Check if +zone+ is a valid time zone.
169
65
  def TjTime.checkTimeZone(zone)
170
66
  return true if zone == 'UTC'
@@ -193,21 +89,41 @@ class TaskJuggler
193
89
  res
194
90
  end
195
91
 
92
+ # Set a new active time zone. _zone_ must be a valid String known to the
93
+ # underlying operating system.
94
+ def TjTime.setTimeZone(zone)
95
+ unless zone && TjTime.checkTimeZone(zone)
96
+ raise "Illegal time zone #{zone}"
97
+ end
98
+
99
+ oldTimeZone = @@tz
100
+
101
+ @@tz = zone
102
+ ENV['TZ'] = zone
103
+
104
+ oldTimeZone
105
+ end
106
+
107
+ # Return the name of the currently active time zone.
108
+ def TjTime.timeZone
109
+ @@tz
110
+ end
111
+
196
112
  # Align the date to a time grid. The grid distance is determined by _clock_.
197
113
  def align(clock)
198
- TjTime.new((@time.to_i / clock) * clock)
114
+ TjTime.new((localtime.to_i / clock) * clock)
199
115
  end
200
116
 
201
117
  # Returns the total number of seconds of the day. The time is assumed to be
202
118
  # in the time zone specified by _tz_.
203
119
  def secondsOfDay(tz = nil)
204
- # TODO: Add timezone support
205
- (@time.to_i + @time.gmt_offset) % (60 * 60 * 24)
120
+ lt = localtime
121
+ (lt.to_i + lt.gmt_offset) % (60 * 60 * 24)
206
122
  end
207
123
 
208
124
  # Add _secs_ number of seconds to the time.
209
125
  def +(secs)
210
- TjTime.new(@time + secs)
126
+ TjTime.new(@time.to_i + secs)
211
127
  end
212
128
 
213
129
  # Substract _arg_ number of seconds or return the number of seconds between
@@ -216,7 +132,7 @@ class TaskJuggler
216
132
  if arg.is_a?(TjTime)
217
133
  @time - arg.time
218
134
  else
219
- TjTime.new(@time - arg)
135
+ TjTime.new(@time.to_i - arg)
220
136
  end
221
137
  end
222
138
 
@@ -268,26 +184,22 @@ class TaskJuggler
268
184
 
269
185
  # Normalize time to the beginning of the current hour.
270
186
  def beginOfHour
271
- t = @time.localtime.to_a
272
- t[0, 2] = Array.new(2, 0)
273
- t.slice!(6, 4)
274
- t.reverse!
275
- TjTime.new(Time.local(*t))
187
+ sec, min, hour, day, month, year = localtime.to_a
188
+ sec = min = 0
189
+ TjTime.new([ year, month, day, hour, min, sec, 0 ])
276
190
  end
277
191
 
278
192
  # Normalize time to the beginning of the current day.
279
193
  def midnight
280
- t = @time.localtime.to_a
281
- t[0, 3] = Array.new(3, 0)
282
- t.slice!(6, 4)
283
- t.reverse!
284
- TjTime.new(Time.local(*t))
194
+ sec, min, hour, day, month, year = localtime.to_a
195
+ sec = min = hour = 0
196
+ TjTime.new([ year, month, day, hour, min, sec, 0 ])
285
197
  end
286
198
 
287
199
  # Normalize time to the beginning of the current week. _startMonday_
288
200
  # determines whether the week should start on Monday or Sunday.
289
201
  def beginOfWeek(startMonday)
290
- t = @time.to_a
202
+ t = localtime.to_a
291
203
  # Set time to noon, 12:00:00
292
204
  t[0, 3] = [ 0, 0, 12 ]
293
205
  weekday = t[6]
@@ -301,33 +213,27 @@ class TaskJuggler
301
213
 
302
214
  # Normalize time to the beginning of the current month.
303
215
  def beginOfMonth
304
- t = @time.localtime.to_a
305
- t[0, 3] = Array.new(3, 0)
306
- t[3] = 1
307
- t.slice!(6, 4)
308
- t.reverse!
309
- TjTime.new(Time.local(*t))
216
+ sec, min, hour, day, month, year = localtime.to_a
217
+ sec = min = hour = 0
218
+ day = 1
219
+ TjTime.new([ year, month, day, hour, min, sec, 0 ])
310
220
  end
311
221
 
312
222
  # Normalize time to the beginning of the current quarter.
313
223
  def beginOfQuarter
314
- t = @time.localtime.to_a
315
- t[0, 3] = Array.new(3, 0)
316
- t[3] = 1
317
- t[4] = ((t[4] - 1) % 3) + 1
318
- t.slice!(6, 4)
319
- t.reverse!
320
- TjTime.new(Time.local(*t))
224
+ sec, min, hour, day, month, year = localtime.to_a
225
+ sec = min = hour = 0
226
+ day = 1
227
+ month = ((month - 1) % 3 ) + 1
228
+ TjTime.new([ year, month, day, hour, min, sec, 0 ])
321
229
  end
322
230
 
323
231
  # Normalize time to the beginning of the current year.
324
232
  def beginOfYear
325
- t = @time.localtime.to_a
326
- t[0, 3] = Array.new(3, 0)
327
- t[3, 2] = Array.new(2, 1)
328
- t.slice!(6, 4)
329
- t.reverse!
330
- TjTime.new(Time.local(*t))
233
+ sec, min, hour, day, month, year = localtime.to_a
234
+ sec = min = hour = 0
235
+ day = month = 1
236
+ TjTime.new([ year, month, day, hour, min, sec, 0 ])
331
237
  end
332
238
 
333
239
  # Return a new time that is _hours_ later than time.
@@ -343,64 +249,74 @@ class TaskJuggler
343
249
  # Return a new time that is 1 day later than time but at the same time of
344
250
  # day.
345
251
  def sameTimeNextDay
346
- delta = [ 0, -1, 1 ]
347
- localT1 = @time.localtime.to_a
348
- delta.each do |d|
349
- t = @time + (24 + d) * 60 * 60
350
- localT2 = t.localtime.to_a
351
- return TjTime.new(t) if localT1[0, 3] == localT2[0, 3]
252
+ sec, min, hour, day, month, year = localtime.to_a
253
+ if (day += 1) > lastDayOfMonth(month, year)
254
+ day = 1
255
+ if (month += 1) > 12
256
+ month = 1
257
+ year += 1
258
+ end
352
259
  end
353
- raise "Algorithm is broken for #{@time}"
260
+ TjTime.new([ year, month, day, hour, min, sec, 0 ])
354
261
  end
355
262
 
356
263
  # Return a new time that is 1 week later than time but at the same time of
357
264
  # day.
358
265
  def sameTimeNextWeek
359
- delta = [ 0, -1, 1 ]
360
- localT1 = @time.localtime.to_a
361
- delta.each do |d|
362
- t = @time + (7 * 24 + d) * 60 * 60
363
- localT2 = t.localtime.to_a
364
- return TjTime.new(t) if localT1[0, 3] == localT2[0, 3]
266
+ sec, min, hour, day, month, year = localtime.to_a
267
+ if (day += 7) > lastDayOfMonth(month, year)
268
+ day -= lastDayOfMonth(month, year)
269
+ if (month += 1) > 12
270
+ month = 1
271
+ year += 1
272
+ end
365
273
  end
366
- raise "Algorithm is broken for #{@time}"
274
+ TjTime.new([ year, month, day, hour, min, sec, 0 ])
367
275
  end
368
276
 
369
277
  # Return a new time that is 1 month later than time but at the same time of
370
278
  # day.
371
279
  def sameTimeNextMonth
372
- sec, min, hour, day, month, year = @time.localtime.to_a
280
+ sec, min, hour, day, month, year = localtime.to_a
373
281
  monMax = month == 2 && leapYear?(year) ? 29 : MON_MAX[month]
374
- month += 1
375
- if month > 12
282
+ if (month += 1) > 12
376
283
  month = 1
377
284
  year += 1
378
285
  end
379
- day = monMax if day >= monMax
380
- TjTime.new(Time.mktime(year, month, day, hour, min, sec, 0))
286
+ day = monMax if day >= lastDayOfMonth(month, year)
287
+ TjTime.new([ year, month, day, hour, min, sec, 0 ])
381
288
  end
382
289
 
383
290
  # Return a new time that is 1 quarter later than time but at the same time of
384
291
  # day.
385
292
  def sameTimeNextQuarter
386
- t = @time.localtime.to_a
387
- if (t[4] += 3) > 12
388
- t[4] -= 12
389
- t[5] += 1
293
+ sec, min, hour, day, month, year = localtime.to_a
294
+ if (month += 3) > 12
295
+ month -= 12
296
+ year += 1
390
297
  end
391
- t.slice!(6, 4)
392
- t.reverse!
393
- TjTime.new(Time.local(*t))
298
+ TjTime.new([ year, month, day, hour, min, sec, 0 ])
394
299
  end
395
300
 
396
301
  # Return a new time that is 1 year later than time but at the same time of
397
302
  # day.
398
303
  def sameTimeNextYear
399
- t = @time.localtime.to_a
400
- t[5] += 1
401
- t.slice!(6, 4)
402
- t.reverse!
403
- TjTime.new(Time.local(*t))
304
+ sec, min, hour, day, month, year = localtime.to_a
305
+ year += 1
306
+ TjTime.new([ year, month, day, hour, min, sec, 0])
307
+ end
308
+
309
+ # Return the start of the next _dow_ day of week after _date_. _dow_ must
310
+ # be 0 for Sundays, 1 for Mondays and 6 for Saturdays. If _date_ is a
311
+ # Tuesday and _dow_ is 5 (Friday) the date of next Friday 0:00 will be
312
+ # returned. If _date_ is a Tuesday and _dow_ is 2 (Tuesday) the date of
313
+ # the next Tuesday will be returned.
314
+ def nextDayOfWeek(dow)
315
+ raise "Day of week must be 0 - 6." unless dow >= 0 && dow <= 6
316
+ d = midnight.sameTimeNextDay
317
+ currentDoW = d.strftime('%w').to_i
318
+ 1.upto((dow + 7 - currentDoW) % 7) { |i| d = d.sameTimeNextDay }
319
+ d
404
320
  end
405
321
 
406
322
  # Return the number of hours between this time and _date_. The result is
@@ -448,74 +364,179 @@ class TaskJuggler
448
364
  format = '%Y-%m-%d-%H:%M' + (@time.sec == 0 ? '' : ':%S') + '-%z'
449
365
  end
450
366
  # Always report values in local timezone
451
- @time.dup.localtime.strftime(format)
367
+ localtime.strftime(format)
452
368
  end
453
369
 
454
370
  # Return the seconds since Epoch.
455
371
  def to_i
456
- @time.to_i
372
+ localtime.to_i
373
+ end
374
+
375
+ def to_a
376
+ localtime.to_a
457
377
  end
458
378
 
459
- def to_ary
460
- to_s
379
+ def strftime(format)
380
+ localtime.strftime(format)
461
381
  end
462
382
 
383
+ # Return the day of the week. 0 for Sunday, 1 for Monday and so on.
384
+ def wday
385
+ localtime.wday
386
+ end
387
+
388
+ # Return the hours of the day (0..23)
389
+ def hour
390
+ localtime.hour
391
+ end
392
+
393
+ # Return the day of the month (1..n).
394
+ def day
395
+ localtime.day
396
+ end
397
+
398
+ # Return the month of the year (1..12)
399
+ def month
400
+ localtime.month
401
+ end
402
+
403
+ alias mon month
404
+
405
+ # Return the year.
406
+ def year
407
+ localtime.year
408
+ end
463
409
 
464
410
  # Return the abbreviated month name.
465
411
  def shortMonthName
466
- @time.strftime('%b')
412
+ localtime.strftime('%b')
467
413
  end
468
414
 
469
415
  # Return the number of the quarter prefixed by a 'Q'.
470
416
  def quarterName
471
- "Q#{(@time.mon / 3) + 1}"
417
+ "Q#{(localtime.mon / 3) + 1}"
472
418
  end
473
419
 
474
420
  # Return the week number. _weekStartsMonday_ specifies wheter the counting
475
421
  # should be for weeks starting Mondays or Sundays.
476
422
  def week(weekStartsMonday)
477
- @time.strftime(weekStartsMonday ? '%W' : '%U')
423
+ localtime.strftime(weekStartsMonday ? '%W' : '%U')
478
424
  end
479
425
 
480
426
  # Return the abbreviated month name and the full year. E. g. 'Feb 1972'.
481
427
  def monthAndYear
482
- @time.strftime('%b %Y')
428
+ localtime.strftime('%b %Y')
483
429
  end
484
430
 
485
431
  # Return the abbreviated weekday and the full date. E. g. 'Sat 2007-11-03'.
486
432
  def weekdayAndDate
487
- @time.strftime('%A %Y-%m-%d')
433
+ localtime.strftime('%A %Y-%m-%d')
488
434
  end
489
435
 
490
- # Return the start of the next _dow_ day of week after _date_. _dow_ must
491
- # be 0 for Sundays, 1 for Mondays and 6 for Saturdays. If _date_ is a
492
- # Tuesday and _dow_ is 5 (Friday) the date of next Friday 0:00 will be
493
- # returned. If _date_ is a Tuesday and _dow_ is 2 (Tuesday) the date of
494
- # the next Tuesday will be returned.
495
- def nextDayOfWeek(dow)
496
- raise "Day of week must be 0 - 6." unless dow >= 0 && dow <= 6
497
- d = midnight.sameTimeNextDay
498
- currentDoW = d.strftime('%w').to_i
499
- 1.upto((dow + 7 - currentDoW) % 7) { |i| d = d.sameTimeNextDay }
500
- d
501
- end
436
+ private
502
437
 
503
- # Pass any unknown function directoy to the @time variable.
504
- def method_missing(func, *args)
505
- @time.method(func).call(*args)
506
- end
438
+ def parse(t)
439
+ year, month, day, time, zone = t.split('-', 5)
507
440
 
508
- private
441
+ # Check the year
442
+ if year
443
+ year = year.to_i
444
+ if year < 1970 || year > 2035
445
+ raise TjException.new, "Year #{year} out of range (1970 - 2035)"
446
+ end
447
+ else
448
+ raise TjException.new, "Year not specified"
449
+ end
509
450
 
510
- def order(date)
511
- if date.time < @time
512
- t1 = date
513
- t2 = self
451
+ # Check the month
452
+ if month
453
+ month = month.to_i
454
+ if month < 1 || month > 12
455
+ raise TjException.new, "Month #{month} out of range (1 - 12)"
456
+ end
457
+ else
458
+ raise TjException.new, "Month not specified"
459
+ end
460
+
461
+ # Check the day
462
+ if day
463
+ day = day.to_i
464
+ maxDay = [ 0, 31, Date.gregorian_leap?(year) ? 29 : 28, 31, 30, 31,
465
+ 30, 31, 31, 30, 31, 30, 31 ]
466
+ if month < 1 || month > maxDay[month]
467
+ raise TjException.new, "Day #{day} out of range (1 - #{maxDay[month]})"
468
+ end
514
469
  else
515
- t1 = self
516
- t2 = date
470
+ raise TjException.new, "Day not specified"
471
+ end
472
+
473
+ # The time is optional. Will be expanded to 00:00:00.
474
+ if time
475
+ hour, minute, second = time.split(':')
476
+
477
+ # Check hour
478
+ if hour
479
+ hour = hour.to_i
480
+ if hour < 0 || hour > 23
481
+ raise TjException.new, "Hour #{hour} out of range (0 - 23)"
482
+ end
483
+ else
484
+ raise TjException.new, "Hour not specified"
485
+ end
486
+
487
+ if minute
488
+ minute = minute.to_i
489
+ if minute < 0 || minute > 59
490
+ raise TjException.new, "Minute #{minute} out of range (0 - 59)"
491
+ end
492
+ else
493
+ raise TjException.new, "Minute not specified"
494
+ end
495
+
496
+ # Check sencond. This value is optional and defaults to 0.
497
+ if second
498
+ second = second.to_i
499
+ if second < 0 || second > 59
500
+ raise TjException.new, "Second #{second} out of range (0 - 59)"
501
+ end
502
+ else
503
+ second = 0
504
+ end
505
+ else
506
+ hour = minute = second = 0
507
+ end
508
+
509
+ # The zone is optional and defaults to the current time zone.
510
+ if zone
511
+ if zone[0] != ?- && zone[0] != ?+
512
+ raise TjException.new, "Time zone adjustment must be prefixed by " +
513
+ "+ or -, not #{zone[0]}"
514
+ end
515
+ if zone.length != 5
516
+ raise TjException.new, "Time zone adjustment must use (+/-)HHMM format"
517
+ end
518
+
519
+ @time = Time.utc(year, month, day, hour, minute, second)
520
+ sign = zone[0] == ?- ? 1 : -1
521
+ tzHour = zone[1..2].to_i
522
+ if tzHour < 0 || tzHour > 12
523
+ raise TjException.new, "Time zone adjustment hour out of range " +
524
+ "(0 - 12) but is #{tzHour}"
525
+ end
526
+ tzMinute = zone[3..4].to_i
527
+ if tzMinute < 0 || tzMinute > 59
528
+ raise TjException.new, "Time zone adjustment minute out of range " +
529
+ "(0 - 59) but is #{tzMinute}"
530
+ end
531
+ @time += sign * (tzHour * 3600 + tzMinute * 60)
532
+ @timeZone = 'UTC'
533
+ else
534
+ @time = Time.mktime(year, month, day, hour, minute, second)
517
535
  end
518
- [ t1, t2 ]
536
+ end
537
+
538
+ def order(date)
539
+ self < date ? [ self, date ] : [ date, self ]
519
540
  end
520
541
 
521
542
  def countIntervals(date, stepFunc)
@@ -528,6 +549,10 @@ class TaskJuggler
528
549
  i
529
550
  end
530
551
 
552
+ def lastDayOfMonth(month, year)
553
+ month == 2 && leapYear?(year) ? 29 : MON_MAX[month]
554
+ end
555
+
531
556
  def leapYear?(year)
532
557
  case
533
558
  when year % 400 == 0
@@ -539,6 +564,26 @@ class TaskJuggler
539
564
  end
540
565
  end
541
566
 
567
+ def localtime
568
+ return @time if @timeZone == @@tz
569
+
570
+ if @time.utc?
571
+ if @@tz == 'UTC'
572
+ # @time is already in the right zone (UTC)
573
+ @time
574
+ else
575
+ @time.dup.localtime
576
+ end
577
+ elsif @@tz == 'UTC'
578
+ # @time is not in UTC, so convert it to local time.
579
+ @time.dup.gmtime
580
+ else
581
+ # To convert a Time object from one local time to another, we need to
582
+ # conver to UTC first and then to the new local time.
583
+ @time.dup.gmtime.localtime
584
+ end
585
+ end
586
+
542
587
  end
543
588
 
544
589
  end