taskjuggler 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
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