taskjuggler 0.0.6 → 0.0.7

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 (545) hide show
  1. data/CHANGELOG +160 -0
  2. data/benchmarks/UTF-8-Strings.rb +58 -0
  3. data/data/css/tjreport.css +7 -2
  4. data/doc/AppConfig.html +10 -4
  5. data/doc/Arguments.html +10 -4
  6. data/doc/CHANGELOG.html +171 -5
  7. data/doc/COPYING.html +10 -4
  8. data/doc/Object.html +11 -107
  9. data/doc/README.html +10 -4
  10. data/doc/RuntimeConfig.html +10 -4
  11. data/doc/String.html +16 -11
  12. data/doc/StringIO.html +10 -4
  13. data/doc/TaskJuggler.html +506 -435
  14. data/doc/TaskJuggler/Account.html +10 -4
  15. data/doc/TaskJuggler/AccountAttribute.html +10 -4
  16. data/doc/TaskJuggler/AccountScenario.html +10 -4
  17. data/doc/TaskJuggler/Allocation.html +69 -60
  18. data/doc/TaskJuggler/AllocationAttribute.html +10 -4
  19. data/doc/TaskJuggler/AttributeBase.html +10 -4
  20. data/doc/TaskJuggler/AttributeDefinition.html +10 -4
  21. data/doc/TaskJuggler/BatchProcessor.html +202 -192
  22. data/doc/TaskJuggler/Booking.html +10 -4
  23. data/doc/TaskJuggler/BookingListAttribute.html +10 -4
  24. data/doc/TaskJuggler/BooleanAttribute.html +10 -4
  25. data/doc/TaskJuggler/CSVFile.html +10 -4
  26. data/doc/TaskJuggler/CellSettingPattern.html +10 -4
  27. data/doc/TaskJuggler/CellSettingPatternList.html +10 -4
  28. data/doc/TaskJuggler/Charge.html +10 -4
  29. data/doc/TaskJuggler/ChargeListAttribute.html +10 -4
  30. data/doc/TaskJuggler/ChargeSet.html +10 -4
  31. data/doc/TaskJuggler/ChargeSetListAttribute.html +10 -4
  32. data/doc/TaskJuggler/ColumnListAttribute.html +10 -4
  33. data/doc/TaskJuggler/ColumnTable.html +10 -4
  34. data/doc/TaskJuggler/Daemon.html +71 -52
  35. data/doc/TaskJuggler/DateAttribute.html +10 -4
  36. data/doc/TaskJuggler/DefinitionListAttribute.html +10 -4
  37. data/doc/TaskJuggler/DependencyListAttribute.html +10 -4
  38. data/doc/TaskJuggler/DurationAttribute.html +10 -4
  39. data/doc/TaskJuggler/{MacroParser.html → FileList.html} +58 -173
  40. data/doc/TaskJuggler/{RichTextException.html → FileRecord.html} +59 -80
  41. data/doc/TaskJuggler/FixnumAttribute.html +10 -4
  42. data/doc/TaskJuggler/FlagListAttribute.html +10 -4
  43. data/doc/TaskJuggler/FloatAttribute.html +10 -4
  44. data/doc/TaskJuggler/FormatListAttribute.html +10 -4
  45. data/doc/TaskJuggler/GanttChart.html +10 -4
  46. data/doc/TaskJuggler/GanttContainer.html +14 -8
  47. data/doc/TaskJuggler/GanttHeader.html +10 -4
  48. data/doc/TaskJuggler/GanttHeaderScaleItem.html +10 -4
  49. data/doc/TaskJuggler/GanttLine.html +29 -24
  50. data/doc/TaskJuggler/GanttLoadStack.html +10 -4
  51. data/doc/TaskJuggler/GanttMilestone.html +10 -4
  52. data/doc/TaskJuggler/GanttRouter.html +10 -4
  53. data/doc/TaskJuggler/GanttTaskBar.html +20 -10
  54. data/doc/TaskJuggler/HTMLDocument.html +10 -4
  55. data/doc/TaskJuggler/HTMLGraphics.html +10 -4
  56. data/doc/TaskJuggler/Interval.html +10 -4
  57. data/doc/TaskJuggler/IntervalListAttribute.html +10 -4
  58. data/doc/TaskJuggler/JobInfo.html +10 -4
  59. data/doc/TaskJuggler/Journal.html +227 -160
  60. data/doc/TaskJuggler/JournalEntry.html +10 -4
  61. data/doc/TaskJuggler/JournalEntryList.html +158 -72
  62. data/doc/TaskJuggler/KeywordArray.html +21 -9
  63. data/doc/TaskJuggler/KeywordDocumentation.html +612 -475
  64. data/doc/TaskJuggler/Limits.html +13 -8
  65. data/doc/TaskJuggler/Limits/Limit.html +10 -4
  66. data/doc/TaskJuggler/LimitsAttribute.html +10 -4
  67. data/doc/TaskJuggler/ListAttributeBase.html +10 -4
  68. data/doc/TaskJuggler/Log.html +10 -4
  69. data/doc/TaskJuggler/LogFile.html +10 -4
  70. data/doc/TaskJuggler/LogicalAttribute.html +10 -4
  71. data/doc/TaskJuggler/LogicalExpression.html +11 -5
  72. data/doc/TaskJuggler/LogicalExpressionAttribute.html +10 -4
  73. data/doc/TaskJuggler/LogicalFlag.html +10 -4
  74. data/doc/TaskJuggler/LogicalFunction.html +132 -124
  75. data/doc/TaskJuggler/LogicalOperation.html +10 -4
  76. data/doc/TaskJuggler/Macro.html +16 -10
  77. data/doc/TaskJuggler/MacroTable.html +44 -38
  78. data/doc/TaskJuggler/ManagerResponsibilities.html +10 -4
  79. data/doc/TaskJuggler/ManagerStatusRecord.html +10 -4
  80. data/doc/TaskJuggler/Message.html +92 -68
  81. data/doc/TaskJuggler/MessageHandler.html +349 -28
  82. data/doc/TaskJuggler/Navigator.html +10 -4
  83. data/doc/TaskJuggler/NavigatorElement.html +10 -4
  84. data/doc/TaskJuggler/NikuProject.html +10 -4
  85. data/doc/TaskJuggler/NikuReport.html +10 -4
  86. data/doc/TaskJuggler/NikuResource.html +10 -4
  87. data/doc/TaskJuggler/NodeListAttribute.html +10 -4
  88. data/doc/TaskJuggler/OnShiftCache.html +10 -4
  89. data/doc/TaskJuggler/ProcessIntercom.html +118 -111
  90. data/doc/TaskJuggler/ProcessIntercomIface.html +75 -22
  91. data/doc/TaskJuggler/Project.html +886 -913
  92. data/doc/TaskJuggler/ProjectBroker.html +442 -331
  93. data/doc/TaskJuggler/ProjectBrokerIface.html +95 -38
  94. data/doc/TaskJuggler/ProjectFileParser.html +320 -317
  95. data/doc/TaskJuggler/ProjectFileScanner.html +336 -339
  96. data/doc/TaskJuggler/ProjectRecord.html +119 -56
  97. data/doc/TaskJuggler/ProjectServer.html +282 -237
  98. data/doc/TaskJuggler/ProjectServerIface.html +45 -39
  99. data/doc/TaskJuggler/PropertyAttribute.html +10 -4
  100. data/doc/TaskJuggler/PropertyList.html +177 -173
  101. data/doc/TaskJuggler/PropertySet.html +11 -5
  102. data/doc/TaskJuggler/PropertyTreeNode.html +194 -191
  103. data/doc/TaskJuggler/Query.html +280 -256
  104. data/doc/TaskJuggler/RTFHandlers.html +10 -4
  105. data/doc/TaskJuggler/RTFNavigator.html +33 -26
  106. data/doc/TaskJuggler/RTFQuery.html +135 -169
  107. data/doc/TaskJuggler/RTFReport.html +63 -56
  108. data/doc/TaskJuggler/RTFReportLink.html +58 -47
  109. data/doc/TaskJuggler/RTFWithQuerySupport.html +666 -0
  110. data/doc/TaskJuggler/RealFormat.html +10 -4
  111. data/doc/TaskJuggler/RealFormatAttribute.html +10 -4
  112. data/doc/TaskJuggler/ReferenceAttribute.html +10 -4
  113. data/doc/TaskJuggler/Report.html +333 -290
  114. data/doc/TaskJuggler/ReportBase.html +182 -174
  115. data/doc/TaskJuggler/ReportContext.html +10 -4
  116. data/doc/TaskJuggler/ReportServer.html +144 -126
  117. data/doc/TaskJuggler/ReportServerIface.html +50 -44
  118. data/doc/TaskJuggler/ReportServerRecord.html +38 -32
  119. data/doc/TaskJuggler/ReportServlet.html +144 -137
  120. data/doc/TaskJuggler/ReportTable.html +10 -4
  121. data/doc/TaskJuggler/ReportTableCell.html +169 -164
  122. data/doc/TaskJuggler/ReportTableColumn.html +10 -4
  123. data/doc/TaskJuggler/ReportTableLegend.html +10 -4
  124. data/doc/TaskJuggler/ReportTableLine.html +10 -4
  125. data/doc/TaskJuggler/Resource.html +121 -115
  126. data/doc/TaskJuggler/ResourceListAttribute.html +10 -4
  127. data/doc/TaskJuggler/ResourceListRE.html +10 -4
  128. data/doc/TaskJuggler/ResourceScenario.html +13 -7
  129. data/doc/TaskJuggler/RichText.html +61 -37
  130. data/doc/TaskJuggler/RichTextAttribute.html +10 -4
  131. data/doc/TaskJuggler/RichTextDocument.html +91 -81
  132. data/doc/TaskJuggler/RichTextElement.html +378 -317
  133. data/doc/TaskJuggler/RichTextFunctionExample.html +10 -4
  134. data/doc/TaskJuggler/RichTextFunctionHandler.html +16 -11
  135. data/doc/TaskJuggler/RichTextImage.html +10 -4
  136. data/doc/TaskJuggler/RichTextIntermediate.html +138 -70
  137. data/doc/TaskJuggler/RichTextParser.html +48 -40
  138. data/doc/TaskJuggler/RichTextScanner.html +328 -906
  139. data/doc/TaskJuggler/RichTextSnip.html +59 -57
  140. data/doc/TaskJuggler/RichTextSyntaxRules.html +458 -369
  141. data/doc/TaskJuggler/Scenario.html +10 -4
  142. data/doc/TaskJuggler/ScenarioData.html +33 -30
  143. data/doc/TaskJuggler/ScenarioListAttribute.html +10 -4
  144. data/doc/TaskJuggler/Scoreboard.html +10 -4
  145. data/doc/TaskJuggler/SheetHandlerBase.html +315 -191
  146. data/doc/TaskJuggler/SheetReceiver.html +334 -313
  147. data/doc/TaskJuggler/SheetSender.html +10 -4
  148. data/doc/TaskJuggler/Shift.html +10 -4
  149. data/doc/TaskJuggler/ShiftAssignment.html +10 -4
  150. data/doc/TaskJuggler/ShiftAssignments.html +10 -4
  151. data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +10 -4
  152. data/doc/TaskJuggler/ShiftScenario.html +10 -4
  153. data/doc/TaskJuggler/SimpleQueryExpander.html +697 -0
  154. data/doc/TaskJuggler/SortListAttribute.html +10 -4
  155. data/doc/TaskJuggler/SourceFileInfo.html +10 -4
  156. data/doc/TaskJuggler/StatusSheetReceiver.html +10 -4
  157. data/doc/TaskJuggler/StatusSheetReport.html +10 -4
  158. data/doc/TaskJuggler/StatusSheetSender.html +10 -4
  159. data/doc/TaskJuggler/StringAttribute.html +10 -4
  160. data/doc/TaskJuggler/SymbolAttribute.html +10 -4
  161. data/doc/TaskJuggler/SyntaxReference.html +260 -230
  162. data/doc/TaskJuggler/TOCEntry.html +99 -42
  163. data/doc/TaskJuggler/TSResourceRecord.html +10 -4
  164. data/doc/TaskJuggler/TSTaskRecord.html +10 -4
  165. data/doc/TaskJuggler/TableColumnDefinition.html +10 -4
  166. data/doc/TaskJuggler/TableOfContents.html +54 -12
  167. data/doc/TaskJuggler/TableReport.html +877 -872
  168. data/doc/TaskJuggler/Task.html +117 -68
  169. data/doc/TaskJuggler/TaskDependency.html +10 -4
  170. data/doc/TaskJuggler/TaskListAttribute.html +10 -4
  171. data/doc/TaskJuggler/TaskListRE.html +10 -4
  172. data/doc/TaskJuggler/TaskScenario.html +1681 -1563
  173. data/doc/TaskJuggler/TextFormatter.html +10 -4
  174. data/doc/TaskJuggler/TextParser.html +567 -534
  175. data/doc/TaskJuggler/TextParser/Pattern.html +128 -118
  176. data/doc/TaskJuggler/TextParser/Rule.html +26 -15
  177. data/doc/TaskJuggler/TextParser/StackElement.html +10 -4
  178. data/doc/TaskJuggler/TextParser/TextParserResultArray.html +22 -16
  179. data/doc/TaskJuggler/TextParser/TokenDoc.html +10 -4
  180. data/doc/TaskJuggler/TextReport.html +15 -6
  181. data/doc/TaskJuggler/TextScanner.html +319 -287
  182. data/doc/TaskJuggler/TextScanner/BufferStreamHandle.html +16 -10
  183. data/doc/TaskJuggler/TextScanner/FileStreamHandle.html +23 -17
  184. data/doc/TaskJuggler/TextScanner/MacroStackEntry.html +17 -11
  185. data/doc/TaskJuggler/TextScanner/StreamHandle.html +102 -96
  186. data/doc/TaskJuggler/TimeSheet.html +138 -175
  187. data/doc/TaskJuggler/TimeSheetReceiver.html +10 -4
  188. data/doc/TaskJuggler/TimeSheetRecord.html +65 -58
  189. data/doc/TaskJuggler/TimeSheetReport.html +47 -42
  190. data/doc/TaskJuggler/TimeSheetSender.html +10 -4
  191. data/doc/TaskJuggler/TimeSheetSummary.html +91 -83
  192. data/doc/TaskJuggler/TimeSheets.html +22 -16
  193. data/doc/TaskJuggler/Tj3AppBase.html +10 -4
  194. data/doc/TaskJuggler/Tj3Client.html +399 -365
  195. data/doc/TaskJuggler/Tj3Daemon.html +107 -94
  196. data/doc/TaskJuggler/Tj3SheetAppBase.html +10 -4
  197. data/doc/TaskJuggler/Tj3SsReceiver.html +10 -4
  198. data/doc/TaskJuggler/Tj3SsSender.html +10 -4
  199. data/doc/TaskJuggler/Tj3TsReceiver.html +10 -4
  200. data/doc/TaskJuggler/Tj3TsSender.html +10 -4
  201. data/doc/TaskJuggler/Tj3TsSummary.html +10 -4
  202. data/doc/TaskJuggler/TjException.html +10 -4
  203. data/doc/TaskJuggler/TjTime.html +145 -140
  204. data/doc/TaskJuggler/TjpExample.html +10 -4
  205. data/doc/TaskJuggler/TjpExportRE.html +122 -118
  206. data/doc/TaskJuggler/TjpSyntaxRules.html +4065 -4052
  207. data/doc/TaskJuggler/URLParameter.html +10 -4
  208. data/doc/TaskJuggler/UserManual.html +162 -155
  209. data/doc/TaskJuggler/VimSyntax.html +1028 -0
  210. data/doc/TaskJuggler/WebServer.html +45 -27
  211. data/doc/TaskJuggler/WorkingHours.html +10 -4
  212. data/doc/TaskJuggler/WorkingHoursAttribute.html +10 -4
  213. data/doc/TaskJuggler/XMLBlob.html +10 -4
  214. data/doc/TaskJuggler/XMLComment.html +10 -4
  215. data/doc/TaskJuggler/XMLDocument.html +10 -4
  216. data/doc/TaskJuggler/XMLElement.html +10 -4
  217. data/doc/TaskJuggler/XMLNamedText.html +10 -4
  218. data/doc/TaskJuggler/XMLText.html +10 -4
  219. data/doc/index.html +735 -677
  220. data/doc/lib/AccountScenario_rb.html +1 -1
  221. data/doc/lib/Account_rb.html +1 -1
  222. data/doc/lib/Allocation_rb.html +1 -1
  223. data/doc/lib/AppConfig_rb.html +1 -1
  224. data/doc/lib/AttributeBase_rb.html +1 -1
  225. data/doc/lib/AttributeDefinition_rb.html +1 -1
  226. data/doc/lib/Attributes_rb.html +1 -1
  227. data/doc/lib/BatchProcessor_rb.html +1 -1
  228. data/doc/lib/Booking_rb.html +1 -1
  229. data/doc/lib/ChargeSet_rb.html +1 -1
  230. data/doc/lib/Charge_rb.html +1 -1
  231. data/doc/lib/{Message_rb.html → FileList_rb.html} +3 -5
  232. data/doc/lib/HTMLDocument_rb.html +1 -1
  233. data/doc/lib/Interval_rb.html +1 -1
  234. data/doc/lib/Journal_rb.html +1 -1
  235. data/doc/lib/KeywordArray_rb.html +1 -1
  236. data/doc/lib/KeywordDocumentation_rb.html +1 -1
  237. data/doc/lib/Limits_rb.html +1 -1
  238. data/doc/lib/LogFile_rb.html +1 -1
  239. data/doc/lib/Log_rb.html +1 -1
  240. data/doc/lib/LogicalExpression_rb.html +1 -1
  241. data/doc/lib/LogicalFunction_rb.html +1 -1
  242. data/doc/lib/LogicalOperation_rb.html +1 -1
  243. data/doc/lib/MacroTable_rb.html +1 -3
  244. data/doc/lib/MessageHandler_rb.html +1 -1
  245. data/doc/lib/ProjectFileParser_rb.html +1 -1
  246. data/doc/lib/ProjectFileScanner_rb.html +1 -1
  247. data/doc/lib/Project_rb.html +4 -2
  248. data/doc/lib/PropertyList_rb.html +1 -1
  249. data/doc/lib/PropertySet_rb.html +1 -1
  250. data/doc/lib/PropertyTreeNode_rb.html +1 -1
  251. data/doc/lib/Query_rb.html +1 -1
  252. data/doc/lib/RTFHandlers_rb.html +1 -1
  253. data/doc/lib/RTFNavigator_rb.html +1 -1
  254. data/doc/lib/RTFQuery_rb.html +2 -2
  255. data/doc/lib/RTFReportLink_rb.html +4 -2
  256. data/doc/lib/RTFReport_rb.html +1 -1
  257. data/doc/lib/{MacroParser_rb.html → RTFWithQuerySupport_rb.html} +4 -6
  258. data/doc/lib/RealFormat_rb.html +1 -1
  259. data/doc/lib/ResourceScenario_rb.html +1 -1
  260. data/doc/lib/Resource_rb.html +1 -1
  261. data/doc/lib/RichTextDocument_rb.html +1 -1
  262. data/doc/lib/RichTextElement_rb.html +1 -1
  263. data/doc/lib/RichTextFunctionExample_rb.html +1 -1
  264. data/doc/lib/RichTextFunctionHandler_rb.html +1 -1
  265. data/doc/lib/RichTextParser_rb.html +1 -1
  266. data/doc/lib/RichTextScanner_rb.html +3 -1
  267. data/doc/lib/RichTextSnip_rb.html +1 -1
  268. data/doc/lib/RichTextSyntaxRules_rb.html +1 -1
  269. data/doc/lib/RichText_rb.html +3 -1
  270. data/doc/lib/RuntimeConfig_rb.html +1 -1
  271. data/doc/lib/ScenarioData_rb.html +2 -2
  272. data/doc/lib/Scenario_rb.html +1 -1
  273. data/doc/lib/Scoreboard_rb.html +1 -1
  274. data/doc/lib/SheetHandlerBase_rb.html +5 -1
  275. data/doc/lib/SheetReceiver_rb.html +3 -1
  276. data/doc/lib/SheetSender_rb.html +1 -1
  277. data/doc/lib/ShiftAssignments_rb.html +1 -1
  278. data/doc/lib/ShiftScenario_rb.html +1 -1
  279. data/doc/lib/Shift_rb.html +1 -1
  280. data/doc/lib/SimpleQueryExpander_rb.html +67 -0
  281. data/doc/lib/SourceFileInfo_rb.html +1 -1
  282. data/doc/lib/StatusSheetReceiver_rb.html +1 -1
  283. data/doc/lib/StatusSheetSender_rb.html +1 -1
  284. data/doc/lib/SyntaxReference_rb.html +1 -1
  285. data/doc/lib/TOCEntry_rb.html +1 -1
  286. data/doc/lib/TableColumnDefinition_rb.html +1 -1
  287. data/doc/lib/TableOfContents_rb.html +1 -1
  288. data/doc/lib/TaskDependency_rb.html +1 -1
  289. data/doc/lib/TaskJuggler_rb.html +1 -1
  290. data/doc/lib/TaskScenario_rb.html +1 -1
  291. data/doc/lib/Task_rb.html +1 -1
  292. data/doc/lib/TextFormatter_rb.html +1 -1
  293. data/doc/lib/TextParser/Pattern_rb.html +1 -1
  294. data/doc/lib/TextParser/Rule_rb.html +1 -1
  295. data/doc/lib/TextParser/StackElement_rb.html +1 -1
  296. data/doc/lib/TextParser/TokenDoc_rb.html +1 -1
  297. data/doc/lib/TextParser_rb.html +3 -1
  298. data/doc/lib/TextScanner_rb.html +1 -3
  299. data/doc/lib/TimeSheetReceiver_rb.html +1 -1
  300. data/doc/lib/TimeSheetSender_rb.html +1 -1
  301. data/doc/lib/TimeSheetSummary_rb.html +1 -1
  302. data/doc/lib/TimeSheets_rb.html +1 -1
  303. data/doc/lib/Tj3AppBase_rb.html +1 -1
  304. data/doc/lib/Tj3Config_rb.html +1 -1
  305. data/doc/lib/Tj3SheetAppBase_rb.html +1 -1
  306. data/doc/lib/TjException_rb.html +1 -1
  307. data/doc/lib/TjTime_rb.html +1 -1
  308. data/doc/lib/TjpExample_rb.html +1 -1
  309. data/doc/lib/TjpSyntaxRules_rb.html +1 -1
  310. data/doc/lib/URLParameter_rb.html +1 -1
  311. data/doc/lib/UTF8String_rb.html +1 -1
  312. data/doc/lib/UserManual_rb.html +1 -1
  313. data/doc/lib/{ruby-signal-bug_rb.html → VimSyntax_rb.html} +17 -4
  314. data/doc/lib/WorkingHours_rb.html +1 -1
  315. data/doc/lib/XMLDocument_rb.html +1 -1
  316. data/doc/lib/XMLElement_rb.html +1 -1
  317. data/doc/lib/daemon/Daemon_rb.html +1 -1
  318. data/doc/lib/daemon/ProcessIntercom_rb.html +1 -1
  319. data/doc/lib/daemon/ProjectBroker_rb.html +1 -1
  320. data/doc/lib/daemon/ProjectServer_rb.html +1 -1
  321. data/doc/lib/daemon/ReportServer_rb.html +1 -3
  322. data/doc/lib/daemon/WebServer_rb.html +1 -1
  323. data/doc/lib/deep_copy_rb.html +1 -1
  324. data/doc/lib/reports/CSVFile_rb.html +1 -1
  325. data/doc/lib/reports/ColumnTable_rb.html +1 -1
  326. data/doc/lib/reports/GanttChart_rb.html +1 -1
  327. data/doc/lib/reports/GanttContainer_rb.html +1 -1
  328. data/doc/lib/reports/GanttHeaderScaleItem_rb.html +1 -1
  329. data/doc/lib/reports/GanttHeader_rb.html +1 -1
  330. data/doc/lib/reports/GanttLine_rb.html +1 -1
  331. data/doc/lib/reports/GanttLoadStack_rb.html +1 -1
  332. data/doc/lib/reports/GanttMilestone_rb.html +1 -1
  333. data/doc/lib/reports/GanttRouter_rb.html +1 -1
  334. data/doc/lib/reports/GanttTaskBar_rb.html +1 -1
  335. data/doc/lib/reports/HTMLGraphics_rb.html +1 -1
  336. data/doc/lib/reports/Navigator_rb.html +1 -1
  337. data/doc/lib/reports/NikuReport_rb.html +1 -1
  338. data/doc/lib/reports/ReportBase_rb.html +1 -1
  339. data/doc/lib/reports/ReportContext_rb.html +1 -1
  340. data/doc/lib/reports/ReportTableCell_rb.html +1 -1
  341. data/doc/lib/reports/ReportTableColumn_rb.html +1 -1
  342. data/doc/lib/reports/ReportTableLegend_rb.html +1 -1
  343. data/doc/lib/reports/ReportTableLine_rb.html +1 -1
  344. data/doc/lib/reports/ReportTable_rb.html +1 -1
  345. data/doc/lib/reports/Report_rb.html +1 -1
  346. data/doc/lib/reports/ResourceListRE_rb.html +1 -1
  347. data/doc/lib/reports/StatusSheetReport_rb.html +1 -1
  348. data/doc/lib/reports/TableReport_rb.html +1 -1
  349. data/doc/lib/reports/TaskListRE_rb.html +1 -1
  350. data/doc/lib/reports/TextReport_rb.html +1 -1
  351. data/doc/lib/reports/TimeSheetReport_rb.html +1 -1
  352. data/doc/lib/reports/TjpExportRE_rb.html +1 -1
  353. data/doc/lib/taskjuggler3_rb.html +1 -1
  354. data/doc/lib/tj3client_rb.html +1 -1
  355. data/doc/lib/tj3d_rb.html +1 -1
  356. data/doc/lib/tj3man_rb.html +1 -1
  357. data/doc/lib/tj3ss_receiver_rb.html +1 -1
  358. data/doc/lib/tj3ss_sender_rb.html +1 -1
  359. data/doc/lib/tj3ts_receiver_rb.html +1 -1
  360. data/doc/lib/tj3ts_sender_rb.html +1 -1
  361. data/doc/lib/tj3ts_summary_rb.html +1 -1
  362. data/lib/Allocation.rb +8 -5
  363. data/lib/BatchProcessor.rb +7 -3
  364. data/lib/FileList.rb +58 -0
  365. data/lib/Journal.rb +73 -33
  366. data/lib/KeywordArray.rb +4 -0
  367. data/lib/KeywordDocumentation.rb +45 -11
  368. data/lib/Limits.rb +0 -1
  369. data/lib/LogicalExpression.rb +1 -1
  370. data/lib/LogicalFunction.rb +14 -12
  371. data/lib/MacroTable.rb +3 -4
  372. data/lib/MessageHandler.rb +136 -7
  373. data/lib/Project.rb +72 -86
  374. data/lib/ProjectFileParser.rb +30 -33
  375. data/lib/ProjectFileScanner.rb +7 -16
  376. data/lib/PropertyList.rb +25 -27
  377. data/lib/PropertySet.rb +1 -1
  378. data/lib/PropertyTreeNode.rb +9 -12
  379. data/lib/Query.rb +5 -4
  380. data/lib/RTFNavigator.rb +2 -1
  381. data/lib/RTFQuery.rb +4 -11
  382. data/lib/RTFReport.rb +2 -1
  383. data/lib/RTFReportLink.rb +10 -4
  384. data/lib/RTFWithQuerySupport.rb +45 -0
  385. data/lib/Resource.rb +20 -20
  386. data/lib/ResourceScenario.rb +3 -3
  387. data/lib/RichText.rb +15 -7
  388. data/lib/RichTextDocument.rb +8 -4
  389. data/lib/RichTextElement.rb +35 -12
  390. data/lib/RichTextFunctionHandler.rb +11 -12
  391. data/lib/RichTextParser.rb +5 -3
  392. data/lib/RichTextScanner.rb +144 -565
  393. data/lib/RichTextSnip.rb +3 -7
  394. data/lib/RichTextSyntaxRules.rb +51 -32
  395. data/lib/ScenarioData.rb +16 -25
  396. data/lib/SheetHandlerBase.rb +59 -2
  397. data/lib/SheetReceiver.rb +36 -18
  398. data/lib/SimpleQueryExpander.rb +58 -0
  399. data/lib/SyntaxReference.rb +9 -5
  400. data/lib/TOCEntry.rb +2 -0
  401. data/lib/TableOfContents.rb +4 -0
  402. data/lib/Task.rb +23 -12
  403. data/lib/TaskJuggler.rb +72 -33
  404. data/lib/TaskScenario.rb +131 -53
  405. data/lib/TextParser.rb +43 -30
  406. data/lib/TextParser/Pattern.rb +17 -13
  407. data/lib/TextParser/Rule.rb +5 -0
  408. data/lib/TextScanner.rb +46 -25
  409. data/lib/TimeSheetSummary.rb +9 -7
  410. data/lib/TimeSheets.rb +14 -23
  411. data/lib/Tj3Config.rb +1 -1
  412. data/lib/TjTime.rb +1 -2
  413. data/lib/TjpSyntaxRules.rb +128 -104
  414. data/lib/UTF8String.rb +0 -1
  415. data/lib/UserManual.rb +5 -4
  416. data/lib/VimSyntax.rb +223 -0
  417. data/lib/daemon/Daemon.rb +9 -0
  418. data/lib/daemon/ProcessIntercom.rb +19 -4
  419. data/lib/daemon/ProjectBroker.rb +149 -68
  420. data/lib/daemon/ProjectServer.rb +119 -79
  421. data/lib/daemon/ReportServer.rb +42 -31
  422. data/lib/daemon/WebServer.rb +21 -2
  423. data/lib/deep_copy.rb +1 -1
  424. data/lib/reports/GanttContainer.rb +2 -2
  425. data/lib/reports/GanttLine.rb +2 -3
  426. data/lib/reports/GanttTaskBar.rb +7 -3
  427. data/lib/reports/Report.rb +62 -57
  428. data/lib/reports/ReportBase.rb +6 -4
  429. data/lib/reports/ReportTableCell.rb +13 -14
  430. data/lib/reports/TableReport.rb +2 -1
  431. data/lib/reports/TextReport.rb +3 -0
  432. data/lib/reports/TimeSheetReport.rb +2 -3
  433. data/lib/reports/TjpExportRE.rb +0 -2
  434. data/lib/tj3client.rb +31 -3
  435. data/lib/tj3d.rb +8 -1
  436. data/manual/Day_To_Day_Juggling +2 -95
  437. data/manual/How_To_Contribute +2 -1
  438. data/manual/Rich_Text_Attributes +37 -3
  439. data/manual/Software +203 -0
  440. data/test/MessageChecker.rb +4 -4
  441. data/test/TestSuite/HTML-Reports/Alerts.html +172 -0
  442. data/test/TestSuite/HTML-Reports/CellText.html +758 -0
  443. data/test/TestSuite/HTML-Reports/ColumnPeriods.html +156 -0
  444. data/test/TestSuite/HTML-Reports/IsOngoing.html +172 -0
  445. data/test/TestSuite/HTML-Reports/LogicalFunctions.html +245 -0
  446. data/test/TestSuite/HTML-Reports/Query.html +31 -0
  447. data/test/TestSuite/HTML-Reports/css/tjmanual.css +14 -0
  448. data/test/TestSuite/HTML-Reports/css/tjreport.css +233 -21
  449. data/test/TestSuite/HTML-Reports/depArrows.html +842 -0
  450. data/test/TestSuite/HTML-Reports/scripts/scripts/wz_tooltip.js +1301 -0
  451. data/test/TestSuite/HTML-Reports/scripts/wz_tooltip.js +20 -20
  452. data/test/TestSuite/ReportGenerator/Correct/Alerts.tjp +48 -0
  453. data/test/TestSuite/ReportGenerator/Correct/Macros.tjp +57 -0
  454. data/test/TestSuite/ReportGenerator/Correct/refs/Alerts-1.csv +386 -0
  455. data/test/TestSuite/ReportGenerator/Correct/refs/Macros-1.csv +6 -0
  456. data/test/TestSuite/ReportGenerator/{Correct → Errors}/css/tjmanual.css +0 -0
  457. data/test/TestSuite/ReportGenerator/{Correct → Errors}/css/tjreport.css +0 -0
  458. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/details.png +0 -0
  459. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/flag-green.png +0 -0
  460. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/flag-red.png +0 -0
  461. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/flag-yellow.png +0 -0
  462. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/resource.png +0 -0
  463. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/resourcegroup.png +0 -0
  464. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/task.png +0 -0
  465. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/taskgroup.png +0 -0
  466. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/trend-down.png +0 -0
  467. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/trend-flat.png +0 -0
  468. data/test/TestSuite/ReportGenerator/{Correct → Errors}/icons/trend-up.png +0 -0
  469. data/test/TestSuite/ReportGenerator/Errors/rtp_report_recursion.html +26 -0
  470. data/test/TestSuite/ReportGenerator/{Correct → Errors}/scripts/wz_tooltip.js +0 -0
  471. data/test/TestSuite/Scheduler/Correct/Allocate.html +3210 -0
  472. data/test/TestSuite/Scheduler/Correct/Allocate.tjp +19 -0
  473. data/test/TestSuite/Scheduler/Correct/Container.html +22 -22
  474. data/test/TestSuite/Scheduler/Correct/Limits.html +4964 -0
  475. data/test/TestSuite/Scheduler/Correct/Shift.html +1707 -417
  476. data/test/TestSuite/Scheduler/Correct/Shift2.html +9 -9
  477. data/test/TestSuite/Scheduler/Correct/css/tjreport.css +6 -2
  478. data/test/TestSuite/Scheduler/Errors/css/tjmanual.css +66 -0
  479. data/test/TestSuite/Scheduler/Errors/css/tjreport.css +407 -0
  480. data/test/TestSuite/Scheduler/Errors/icons/details.png +0 -0
  481. data/test/TestSuite/Scheduler/Errors/icons/flag-green.png +0 -0
  482. data/test/TestSuite/Scheduler/Errors/icons/flag-red.png +0 -0
  483. data/test/TestSuite/Scheduler/Errors/icons/flag-yellow.png +0 -0
  484. data/test/TestSuite/Scheduler/Errors/icons/resource.png +0 -0
  485. data/test/TestSuite/Scheduler/Errors/icons/resourcegroup.png +0 -0
  486. data/test/TestSuite/Scheduler/Errors/icons/task.png +0 -0
  487. data/test/TestSuite/Scheduler/Errors/icons/taskgroup.png +0 -0
  488. data/test/TestSuite/Scheduler/Errors/icons/trend-down.png +0 -0
  489. data/test/TestSuite/Scheduler/Errors/icons/trend-flat.png +0 -0
  490. data/test/TestSuite/Scheduler/Errors/icons/trend-up.png +0 -0
  491. data/test/TestSuite/Scheduler/Errors/loop_detected_1.tjp +1 -1
  492. data/test/TestSuite/Scheduler/Errors/loop_detected_10.tjp +1 -1
  493. data/test/TestSuite/Scheduler/Errors/loop_detected_11.tjp +1 -1
  494. data/test/TestSuite/Scheduler/Errors/loop_detected_12.tjp +1 -1
  495. data/test/TestSuite/Scheduler/Errors/loop_detected_13.tjp +1 -1
  496. data/test/TestSuite/Scheduler/Errors/loop_detected_14.tjp +1 -1
  497. data/test/TestSuite/Scheduler/Errors/loop_detected_2.tjp +1 -1
  498. data/test/TestSuite/Scheduler/Errors/loop_detected_3.tjp +1 -1
  499. data/test/TestSuite/Scheduler/Errors/loop_detected_4.tjp +1 -1
  500. data/test/TestSuite/Scheduler/Errors/loop_detected_5.tjp +1 -1
  501. data/test/TestSuite/Scheduler/Errors/loop_detected_6.tjp +1 -1
  502. data/test/TestSuite/Scheduler/Errors/loop_detected_7.tjp +1 -1
  503. data/test/TestSuite/Scheduler/Errors/loop_detected_8.tjp +1 -1
  504. data/test/TestSuite/Scheduler/Errors/loop_detected_9.tjp +1 -1
  505. data/test/TestSuite/Scheduler/Errors/scripts/wz_tooltip.js +1301 -0
  506. data/test/TestSuite/Scheduler/Errors/task_pred_before.tjp +11 -0
  507. data/test/TestSuite/Scheduler/Errors/task_pred_before_gd.tjp +11 -0
  508. data/test/TestSuite/Scheduler/Errors/task_pred_before_gl.tjp +11 -0
  509. data/test/TestSuite/Scheduler/Errors/task_succ_after.tjp +12 -0
  510. data/test/TestSuite/Scheduler/Errors/task_succ_after_gd.tjp +12 -0
  511. data/test/TestSuite/Scheduler/Errors/task_succ_after_gl.tjp +12 -0
  512. data/test/TestSuite/StatusSheets/dev2.tji +22 -0
  513. data/test/TestSuite/StatusSheets/resrep.tji +7 -0
  514. data/test/TestSuite/StatusSheets/run +6 -4
  515. data/test/TestSuite/StatusSheets/tj3d.log +312 -0
  516. data/test/TestSuite/Syntax/Correct/Managers.html +263 -0
  517. data/test/TestSuite/Syntax/Correct/tutorial.tjp +1 -2
  518. data/test/TestSuite/Syntax/Errors/empty.tjp +1 -1
  519. data/test/TestSuite/Syntax/Errors/macro_stack_overflow.tjp +1 -1
  520. data/test/TestSuite/TimeSheets/acceptable_intervals +1 -0
  521. data/test/TestSuite/TimeSheets/resrep.tji +7 -0
  522. data/test/TestSuite/TimeSheets/run +6 -5
  523. data/test/TestSuite/TimeSheets/statussheets.log +1 -0
  524. data/test/TestSuite/TimeSheets/ts.tji +351 -0
  525. data/test/TestSuite/TimeSheets/tsdef.tji +2 -0
  526. data/test/test_PropertySet.rb +2 -2
  527. data/test/test_RichText.rb +178 -387
  528. data/test/test_SimpleQueryExpander.rb +55 -0
  529. data/test/test_deep_copy.rb +2 -2
  530. metadata +854 -834
  531. data/lib/MacroParser.rb +0 -77
  532. data/lib/Message.rb +0 -56
  533. data/lib/ruby-signal-bug.rb +0 -43
  534. data/test/TestSuite/HTML-Reports/TimeSheet.html +0 -79
  535. data/test/TestSuite/HTML-Reports/reference.html +0 -51
  536. data/test/TestSuite/ReportGenerator/Correct/Journal.html +0 -63
  537. data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.csv +0 -3
  538. data/test/TestSuite/ReportGenerator/Correct/opennodes.csv +0 -2
  539. data/test/TestSuite/ReportGenerator/Correct/opennodes.tjp +0 -26
  540. data/test/TestSuite/ReportGenerator/Correct/refs/opennodes-1.csv +0 -2
  541. data/test/TestSuite/Scheduler/Correct/Booking2.html +0 -603
  542. data/test/TestSuite/Scheduler/Correct/TimeSheet2.html +0 -108
  543. data/test/TestSuite/StatusSheetTemplates/project.tji +0 -35
  544. data/test/TestSuite/StatusSheetTemplates/project.tjp +0 -56
  545. data/test/TestSuite/Syntax/Correct/ResourcePrefix.html +0 -32
@@ -89,7 +89,6 @@ class String
89
89
  def reverse
90
90
  a = []
91
91
  each_utf8_char { |c| a << c }
92
- s = ''
93
92
  a.reverse.join
94
93
  end
95
94
 
@@ -37,8 +37,8 @@ class TaskJuggler
37
37
  # Directory where to find the manual RichText sources. Must be relative
38
38
  # to lib directory.
39
39
  srcDir = AppConfig.dataDirs('manual')[0]
40
- # Directory where to put the generated HTML files. Must be relative to lib
41
- # directory.
40
+ # Directory where to put the generated HTML files. Must be relative to
41
+ # lib directory.
42
42
  destDir = directory + (directory[-1] == '/' ? '' : '/')
43
43
  # A list of all source files. The order is important.
44
44
  %w(
@@ -51,6 +51,7 @@ class TaskJuggler
51
51
  Tutorial
52
52
  The_TaskJuggler_Syntax
53
53
  Rich_Text_Attributes
54
+ Software
54
55
  Day_To_Day_Juggling
55
56
  TaskJuggler_Internals
56
57
  fdl
@@ -58,7 +59,7 @@ class TaskJuggler
58
59
  snip = addSnip(srcDir + file)
59
60
  snip.cssClass = 'manual'
60
61
  end
61
- # Generate the table of contense
62
+ # Generate the table of contents
62
63
  tableOfContents
63
64
  # Generate the HTML files.
64
65
  generateHTML(destDir)
@@ -210,7 +211,7 @@ class TaskJuggler
210
211
  super
211
212
  # Let's call the reference 'Appendix A'
212
213
  @reference.tableOfContents(@toc, 'A')
213
- @snipNames += @reference.all
214
+ @anchors += @reference.all
214
215
  end
215
216
 
216
217
  # Generate the HTML pages for the syntax reference and a navigation page
@@ -0,0 +1,223 @@
1
+ #!/usr/bin/env ruby -w
2
+ # encoding: UTF-8
3
+ #
4
+ # = KeywordDocumentation.rb -- The TaskJuggler III Project Management Software
5
+ #
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
7
+ #
8
+ # This program is free software; you can redistribute it and/or modify
9
+ # it under the terms of version 2 of the GNU General Public License as
10
+ # published by the Free Software Foundation.
11
+ #
12
+
13
+ require 'SyntaxReference'
14
+
15
+ class TaskJuggler
16
+
17
+ # This class is a generator for vim (http://www.vim.org) TaskJuggler syntax
18
+ # highlighting files.
19
+ class VimSyntax
20
+
21
+ # Create a generator object.
22
+ def initialize
23
+ @reference = SyntaxReference.new
24
+
25
+ @properties = []
26
+ @attributes = []
27
+ @optionBlocks = []
28
+
29
+ @reference.keywords.each_value do |kw|
30
+ if kw.isProperty?
31
+ @properties << kw
32
+ else
33
+ @attributes << kw
34
+ end
35
+ if !kw.optionalAttributes.empty?
36
+ @optionBlocks << kw
37
+ end
38
+ end
39
+
40
+ @file = nil
41
+ end
42
+
43
+ # Generate the vim syntax file into _file_.
44
+ def generate(file)
45
+ @file = File.open(file, 'w')
46
+
47
+ header
48
+ setLocal
49
+ keywords
50
+ matches
51
+ regions
52
+ highlights
53
+
54
+ @file.close
55
+ end
56
+
57
+ private
58
+
59
+ def header
60
+ @file.write <<"EOT"
61
+ " Vim syntax file
62
+ " Language: TaskJuggler
63
+ " Maintainer: TaskJuggler Developers <taskjuggler-devel@googlegroups.com>
64
+ " Last Change: #{Time.now}
65
+ " This file was automatically generated by VimSyntax.rb
66
+
67
+ if exists("b:current_syntax")
68
+ finish
69
+ endif
70
+
71
+ EOT
72
+ end
73
+
74
+ def setLocal
75
+ cinwords = []
76
+ @optionBlocks.each { |kw| cinwords += kw.names }
77
+ cinwords.uniq!.sort!
78
+ @file.write <<'EOT'
79
+ setlocal softtabstop=2
80
+ setlocal cindent shiftwidth=2
81
+ setlocal tabstop=2
82
+ setlocal expandtab
83
+ setlocal cinoptions=g0,t0,+0,(0,c0,C1
84
+ EOT
85
+ @file.write "setlocal cinwords=#{cinwords.join(',')}\n"
86
+ @file.write <<'EOT'
87
+ setlocal cinkeys=0{,0},!^F,o,O
88
+ setlocal cindent
89
+
90
+ EOT
91
+ end
92
+
93
+ def regions
94
+ @optionBlocks.each do |kw|
95
+ single = kw.names.length == 1
96
+ kw.names.each do |name|
97
+ normalizedName = "#{normalize(kw.keyword)}" +
98
+ "#{single ? '' : "_#{name}"}"
99
+ tag = name == 'supplement' ?
100
+ kw.keyword.gsub(/\./, ' ') : name
101
+ @file.write "syn region tjpblk_#{normalizedName}" +
102
+ " start=/^\\s*#{tag}\\s.*{/ end=/^\\s*}/ transparent"
103
+ # We allow properties and special attributes to be folded.
104
+ foldable = %w( task.timesheet project )
105
+ @file.write " fold" if @properties.include?(kw) ||
106
+ foldable.include?(kw.keyword)
107
+ # The header is part of the region. So we must make sure that common
108
+ # parameters and the property/attribute name are contained as well.
109
+ @file.write " contains=@tjpcommon,tjp_#{normalizedName}"
110
+ kw.optionalAttributes.each do |oa|
111
+ tag = normalize(oa.keyword)
112
+ @file.write ",tjp_#{tag}"
113
+ if !oa.optionalAttributes.empty?
114
+ # Option blocks may be contained as block or non-block.
115
+ @file.write ",tjpblk_#{tag}"
116
+ end
117
+ end
118
+ if name == 'supplement'
119
+ @file.write(',tjp_supplement')
120
+ end
121
+ if !kw.globalScope?
122
+ # Every region but a property and 'project' is contained.
123
+ @file.write " contained"
124
+ end
125
+ @file.puts
126
+ end
127
+ end
128
+
129
+ @file.write <<'EOT'
130
+ syn region tjpblk_macro start=/macro\s\+\h\w*\s*\[/ end=/\]$/ transparent fold contains=ALL
131
+ syn region tjpstring start=/"/ skip=/\\"/ end=/"/
132
+ syn region tjpstring start=/'/ skip=/\\'/ end=/'/
133
+ syn region tjpstring start=/\s-8<-$/ end=/^\s*->8-/
134
+ syn region tjpmlcomment start=+/\*+ end=+\*/+
135
+
136
+ syn sync fromstart
137
+ set foldmethod=syntax
138
+
139
+ EOT
140
+ end
141
+
142
+ def keywords
143
+ %w( macro project supplement ).each do |kw|
144
+ @file.puts "syn keyword tjp_#{kw} #{kw} contained"
145
+ end
146
+ @file.puts
147
+
148
+ # Property keywords
149
+ @properties.each do |kw|
150
+ single = kw.names.length == 1
151
+ kw.names.each do |name|
152
+ # Ignore the 'supplement' entries. They are not real properties.
153
+ next if name == 'supplement'
154
+ @file.puts "syn keyword tjp_#{normalize(kw.keyword)}" +
155
+ "#{single ? '' : "_#{name}"} #{name} contained"
156
+ @file.puts "hi def link tjp_#{normalize(kw.keyword)}" +
157
+ "#{single ? '' : "_#{name}"} Function"
158
+ end
159
+ end
160
+ @file.puts
161
+
162
+ # Attribute keywords
163
+ @attributes.each do |kw|
164
+ next if %w( resourcereport taskreport textreport ).include?(kw.keyword)
165
+ single = kw.names.length == 1
166
+ kw.names.each do |name|
167
+ break if [ '%', '(', '~', 'include', 'macro', 'project',
168
+ 'supplement' ].include?(name)
169
+ @file.puts "syn keyword tjp_#{normalize(kw.keyword)}" +
170
+ "#{single ? '' : "_#{name}"} #{name}" +
171
+ "#{kw.globalScope? && !@optionBlocks.include?(kw) ?
172
+ '' : ' contained'}"
173
+ @file.puts "hi def link tjp_#{normalize(kw.keyword)}" +
174
+ "#{single ? '' : "_#{name}"} Type"
175
+ end
176
+ end
177
+ @file.puts
178
+ end
179
+
180
+ def matches
181
+ @file.write <<'EOT'
182
+ syn match tjparg contained /\${.*}/
183
+ syn match tjpcomment /#.*$/
184
+ syn match tjpcomment "//.*$"
185
+ syn match tjpinclude /include.*$/
186
+ syn match tjpnumber /\s[-+]\?\d\+\(\.\d\+\)\?\([hdwmy]\|min\)\?/
187
+ syn match tjpdate /\s\d\{4}-\d\{1,2}-\d\{1,2}\(-\d\{1,2}:\d\{1,2}\(:\d\{1,2}\)\?\(-[-+]\?\d\{4}\)\?\)\?/
188
+ syn match tjptime /\s\d\{1,2}:\d\d\(:\d\d\)\?/
189
+
190
+ syn cluster tjpcommon contains=tjpcomment,tjpdate,tjptime,tjpstring,tjpnumber
191
+ EOT
192
+ end
193
+
194
+ def highlights
195
+ @file.write <<'EOT'
196
+ hi def link tjp_macro PreProc
197
+ hi def link tjp_supplement Function
198
+ hi def link tjp_project Function
199
+ hi def link tjpproperty Function
200
+ hi def link tjpattribute Type
201
+ hi def link tjparg Special
202
+ hi def link tjpstring String
203
+ hi def link tjpcomment Comment
204
+ hi def link tjpmlcomment Comment
205
+ hi def link tjpinclude Include
206
+ hi def link tjpdate Constant
207
+ hi def link tjptime Constant
208
+ hi def link tjpnumber Number
209
+
210
+ let b:current_syntax = "tjp"
211
+
212
+ EOT
213
+ end
214
+
215
+ def normalize(str)
216
+ str.gsub(/\./, '_')
217
+ end
218
+
219
+ end
220
+
221
+ end
222
+
223
+ TaskJuggler::VimSyntax.new.generate('tjp.vim')
@@ -14,15 +14,22 @@ require 'LogFile'
14
14
 
15
15
  class TaskJuggler
16
16
 
17
+ # This class provides the basic functionality to turn the current process
18
+ # into a background process (daemon). To use it, derive you main class from
19
+ # this class and call the start() method.
17
20
  class Daemon
18
21
 
19
22
  attr_accessor :daemonize
20
23
 
21
24
  def initialize
25
+ # You can set this flag to false to prevent the program from
26
+ # disconnecting from the current terminal. This is useful for debugging
27
+ # purposes.
22
28
  @daemonize = true
23
29
  @log = LogFile.instance
24
30
  end
25
31
 
32
+ # Call this method to turn the process into a background process.
26
33
  def start
27
34
  return unless @daemonize
28
35
 
@@ -61,6 +68,8 @@ class TaskJuggler
61
68
  @log.info("The process is running as daemon now with PID #{@pid}")
62
69
  end
63
70
 
71
+ # This method may provide some cleanup functionality in the future. You
72
+ # better call it before you exit.
64
73
  def stop
65
74
  end
66
75
 
@@ -16,22 +16,36 @@ class TaskJuggler
16
16
 
17
17
  module ProcessIntercomIface
18
18
 
19
+ # This function catches all unhandled exceptions in the passed block.
20
+ def trap
21
+ log = LogFile.instance
22
+
23
+ begin
24
+ yield
25
+ rescue
26
+ $stderr.print $!.to_s
27
+ $stderr.print $!.backtrace.join("\n")
28
+ log.debug($!.backtrace.join("\n"))
29
+ log.fatal("Unexpected exception: #{$!}")
30
+ end
31
+ end
32
+
19
33
  def terminate(authKey)
20
34
  return false unless @server.checkKey(authKey, 'terminate')
21
35
 
22
- @server.terminate
36
+ trap { @server.terminate }
23
37
  end
24
38
 
25
39
  def connect(authKey, stdout, stderr, stdin, silent)
26
40
  return false unless @server.checkKey(authKey, 'connect')
27
41
 
28
- @server.connect(stdout, stderr, stdin, silent)
42
+ trap { @server.connect(stdout, stderr, stdin, silent) }
29
43
  end
30
44
 
31
45
  def disconnect(authKey)
32
46
  return false unless @server.checkKey(authKey, 'disconnect')
33
47
 
34
- @server.disconnect
48
+ trap { @server.disconnect }
35
49
  end
36
50
 
37
51
  end
@@ -119,7 +133,8 @@ class TaskJuggler
119
133
  def timerExpired?
120
134
  res = nil
121
135
  @timeLock.synchronize do
122
- res = (Time.new > @timerStart + 2 * 60 * 60)
136
+ # We should see client interaction every 2 minutes.
137
+ res = (Time.new > @timerStart + 2 * 60)
123
138
  end
124
139
  res
125
140
  end
@@ -36,7 +36,8 @@ class TaskJuggler
36
36
  # daemon.
37
37
  class ProjectBroker < Daemon
38
38
 
39
- attr_accessor :port, :enableWebServer, :webServerPort, :projectFiles
39
+ attr_accessor :port, :uriFile, :enableWebServer, :webServerPort,
40
+ :projectFiles
40
41
  attr_reader :authKey
41
42
 
42
43
  def initialize
@@ -46,6 +47,8 @@ class TaskJuggler
46
47
  @authKey = nil
47
48
  # The default TCP/IP port. ASCII code decimals for 'T' and 'J'.
48
49
  @port = 8474
50
+ # The name of the URI file.
51
+ @uriFile = nil
49
52
  # A list of loaded projects as Array of ProjectRecord objects.
50
53
  @projects = []
51
54
  # We operate with multiple threads so we need a Monitor to synchronize
@@ -112,6 +115,16 @@ EOT
112
115
  @log.fatal("Cannot listen on port #{@port}: #{$!}")
113
116
  end
114
117
 
118
+ if @port == 0
119
+ # If the port is set to 0 (any port) we save the ProjectBroker URI in
120
+ # the file .tj3d.uri. tj3client will look for it.
121
+ begin
122
+ File.open(@uriFile, 'w') { |f| f.write @uri }
123
+ rescue
124
+ @log.fatal("Cannot write URI file #{@uriFile}: #{$!}")
125
+ end
126
+ end
127
+
115
128
  # If project files were specified on the command line, we add them here.
116
129
  i = 0
117
130
  @projectFiles.each do |project|
@@ -124,6 +137,16 @@ EOT
124
137
 
125
138
  # Cleanup the DRb threads
126
139
  DRb.thread.join
140
+
141
+ # If we have created a URI file, we need to delete it again.
142
+ if @port == 0
143
+ begin
144
+ File.delete(@uriFile)
145
+ rescue
146
+ @log.fatal("Cannot delete URI file .tj3d.uri: #{$!}")
147
+ end
148
+ end
149
+
127
150
  @log.info('TaskJuggler daemon terminated')
128
151
  end
129
152
 
@@ -166,10 +189,10 @@ EOT
166
189
  if @projects.empty?
167
190
  "No projects registered\n"
168
191
  else
169
- format = " %3s | %-25s | %-14s | %-20s\n"
170
- out = sprintf(format, 'No.', 'Project ID', 'Status', 'Loaded since')
171
- out += " " + '-' * 4 + '+' + '-' * 27 + '+' + '-' * 16 + '+' +
172
- '-' * 20 + "\n"
192
+ format = " %3s | %-25s | %-14s | %s | %-20s\n"
193
+ out = sprintf(format, 'No.', 'Project ID', 'Status', 'M',
194
+ 'Loaded since')
195
+ out += " #{'-' * 4}+#{'-' * 27}+#{'-' * 16}+#{'-' * 3}+#{'-' * 20}\n"
173
196
  @projects.synchronize do
174
197
  i = 0
175
198
  @projects.each do |project|
@@ -252,6 +275,19 @@ EOT
252
275
  [ project.uri, project.authKey ]
253
276
  end
254
277
 
278
+ # Reload all projects that have modified files and are not already being
279
+ # reloaded.
280
+ def update
281
+ @projects.synchronize do
282
+ @projects.each do |project|
283
+ if project.modified && !project.reloading
284
+ project.reloading = true
285
+ @projectsToLoad.push(project.files)
286
+ end
287
+ end
288
+ end
289
+ end
290
+
255
291
  # Return a list of IDs of projects that are in state :ready.
256
292
  def getProjectList
257
293
  list = []
@@ -269,8 +305,19 @@ EOT
269
305
 
270
306
  # This is a callback from the ProjectServer process. It's used to update
271
307
  # the current state of the ProjectServer in the ProjectRecord list.
272
- def updateState(authKey, id, state)
308
+ def updateState(authKey, filesOrId, state, modified)
273
309
  result = false
310
+ if filesOrId.is_a?(Array)
311
+ files = filesOrId
312
+ # Use the name of the master files for now.
313
+ id = files[1]
314
+ elsif filesOrId.is_a?(String)
315
+ id = filesOrId
316
+ files = nil
317
+ else
318
+ id = files = nil
319
+ end
320
+
274
321
  @projects.synchronize do
275
322
  @projects.each do |project|
276
323
  # Don't accept updates for already obsolete entries.
@@ -279,7 +326,9 @@ EOT
279
326
  @log.debug("Updating state for #{id} to #{state}")
280
327
  # Only update the record that has the matching authKey
281
328
  if project.authKey == authKey
282
- project.id = id
329
+ project.id = id if id
330
+ # An Array of [ workingDir, tjpFile, ... other tji files ]
331
+ project.files = files if files
283
332
 
284
333
  # If the state is being changed from something to :ready, this is
285
334
  # now the current project for the project ID.
@@ -299,6 +348,7 @@ EOT
299
348
  project.uri = nil if state == :failed
300
349
 
301
350
  project.state = state
351
+ project.modified = modified
302
352
  result = true
303
353
  break
304
354
  end
@@ -312,56 +362,62 @@ EOT
312
362
 
313
363
  def startHousekeeping
314
364
  Thread.new do
315
- cntr = 0
316
- loop do
317
- if @terminate
318
- # Give the caller a chance to properly terminate the connection.
319
- sleep 0.5
320
- @log.debug('Shutting down DRb server')
321
- DRb.stop_service
322
- break
323
- elsif !@projectsToLoad.empty?
324
- loadProject(@projectsToLoad.pop)
325
- else
326
- # Send termination command to all obsolute ProjectServer objects.
327
- # To minimize the locking of @projects we collect the obsolete
328
- # items first.
329
- termList = []
330
- @projects.synchronize do
331
- @projects.each do |p|
332
- if p.state == :obsolete
333
- termList << p
334
- elsif p.state == :failed
335
- # Start removal of entries that didn't parse.
336
- p.state = :obsolete
337
- end
338
- end
339
- end
340
- # And then send them a termination command.
341
- termList.each { |p| p.terminateServer }
342
-
343
- # Check every 30 seconds that the ProjectServer processes are
344
- # still alive. If not, remove them from the list.
345
- if (cntr += 1) > 30
365
+ begin
366
+ cntr = 0
367
+ loop do
368
+ if @terminate
369
+ # Give the caller a chance to properly terminate the connection.
370
+ sleep 0.5
371
+ @log.debug('Shutting down DRb server')
372
+ DRb.stop_service
373
+ break
374
+ elsif !@projectsToLoad.empty?
375
+ loadProject(@projectsToLoad.pop)
376
+ else
377
+ # Send termination command to all obsolute ProjectServer
378
+ # objects. To minimize the locking of @projects we collect the
379
+ # obsolete items first.
380
+ termList = []
346
381
  @projects.synchronize do
347
382
  @projects.each do |p|
348
- unless p.ping
349
- termList << p unless termList.include?(p)
383
+ if p.state == :obsolete
384
+ termList << p
385
+ elsif p.state == :failed
386
+ # Start removal of entries that didn't parse.
387
+ p.state = :obsolete
350
388
  end
351
389
  end
352
390
  end
353
- cntr = 0
354
- end
391
+ # And then send them a termination command.
392
+ termList.each { |p| p.terminateServer }
393
+
394
+ # Check every 10 seconds that the ProjectServer processes are
395
+ # still alive. If not, remove them from the list.
396
+ if (cntr += 1) > 10
397
+ @projects.synchronize do
398
+ @projects.each do |p|
399
+ unless p.ping
400
+ termList << p unless termList.include?(p)
401
+ end
402
+ end
403
+ end
404
+ cntr = 0
405
+ end
355
406
 
356
- # The housekeeping thread rarely needs to so something. Make sure
357
- # it's sleeping most of the time.
358
- sleep 1
407
+ # The housekeeping thread rarely needs to so something. Make
408
+ # sure it's sleeping most of the time.
409
+ sleep 1
359
410
 
360
- # Remove the obsolete records from the @projects list.
361
- @projects.synchronize do
362
- @projects.delete_if { |p| termList.include?(p) }
411
+ # Remove the obsolete records from the @projects list.
412
+ @projects.synchronize do
413
+ @projects.delete_if { |p| termList.include?(p) }
414
+ end
363
415
  end
364
416
  end
417
+ rescue
418
+ $stderr.print $!.to_s
419
+ $stderr.print $!.backtrace.join("\n")
420
+ @log.fatal("ProjectBroker housekeeping error: #{$!}")
365
421
  end
366
422
  end
367
423
  end
@@ -378,7 +434,7 @@ EOT
378
434
  @log.debug("Loading project for tag #{tag}")
379
435
  end
380
436
  pr = ProjectRecord.new(tag)
381
- ps = ProjectServer.new(project)
437
+ ps = ProjectServer.new(project, !@daemonize)
382
438
  # The ProjectServer can be reached via this DRb URI
383
439
  pr.uri = ps.uri
384
440
  # Method calls must be authenticated with this key
@@ -411,27 +467,45 @@ EOT
411
467
  version == 1 ? 1 : -1
412
468
  end
413
469
 
470
+ # This function catches all unhandled exceptions in the passed block.
471
+ def trap
472
+ log = LogFile.instance
473
+
474
+ begin
475
+ yield
476
+ rescue
477
+ $stderr.print $!.to_s
478
+ $stderr.print $!.backtrace.join("\n")
479
+ log.debug($!.backtrace.join("\n"))
480
+ log.fatal("Unexpected exception: #{$!}")
481
+ end
482
+ end
483
+
414
484
  def command(authKey, cmd, args)
415
485
  return false unless @broker.checkKey(authKey, cmd)
416
486
 
417
- case cmd
418
- when :status
419
- @broker.status
420
- when :stop
421
- @broker.stop
422
- when :addProject
423
- @broker.addProject
424
- when :removeProject
425
- @broker.removeProject(args)
426
- when :getProject
427
- @broker.getProject(args)
428
- else
429
- LogFile.instance.fatal('Unknown command #{cmd} called')
487
+ trap do
488
+ case cmd
489
+ when :status
490
+ @broker.status
491
+ when :stop
492
+ @broker.stop
493
+ when :addProject
494
+ @broker.addProject
495
+ when :removeProject
496
+ @broker.removeProject(args)
497
+ when :getProject
498
+ @broker.getProject(args)
499
+ when :update
500
+ @broker.update
501
+ else
502
+ LogFile.instance.fatal('Unknown command #{cmd} called')
503
+ end
430
504
  end
431
505
  end
432
506
 
433
- def updateState(authKey, id, status)
434
- @broker.updateState(authKey, id, status)
507
+ def updateState(authKey, id, status, modified)
508
+ trap { @broker.updateState(authKey, id, status, modified) }
435
509
  end
436
510
 
437
511
  end
@@ -440,13 +514,16 @@ EOT
440
514
  # one entry for each project in the @projects list.
441
515
  class ProjectRecord < Monitor
442
516
 
443
- attr_accessor :authKey, :uri, :id, :state, :readySince
517
+ attr_accessor :authKey, :uri, :files, :id, :state, :readySince, :modified,
518
+ :reloading
444
519
  attr_reader :tag
445
520
 
446
521
  def initialize(tag)
447
522
  # Before we know the project ID we use this tag to uniquely identify the
448
523
  # project.
449
524
  @tag = tag
525
+ # Array of [ workingDir, tjp file, ... tji files ]
526
+ @files = nil
450
527
  # The authentication key for the ProjectServer process.
451
528
  @authKey = nil
452
529
  # The DRb URI where the ProjectServer process is listening.
@@ -458,6 +535,10 @@ EOT
458
535
  @state = :new
459
536
  # A time stamp when the project became ready for service.
460
537
  @readySince = nil
538
+ # True if any of the input files have been modified after the load.
539
+ @modified = false
540
+ # True if the reload has already been triggered.
541
+ @reloading = false
461
542
 
462
543
  @log = LogFile.instance
463
544
  @projectServer = nil
@@ -466,7 +547,7 @@ EOT
466
547
  def ping
467
548
  return true unless @uri
468
549
 
469
- @log.debug("Sending ping to ProcessServer #{@uri}")
550
+ @log.debug("Sending ping to ProjectServer #{@uri}")
470
551
  begin
471
552
  @projectServer = DRbObject.new(nil, @uri) unless @projectServer
472
553
  @projectServer.ping(@authKey)
@@ -482,7 +563,7 @@ EOT
482
563
  return unless @uri
483
564
 
484
565
  begin
485
- @log.debug("Sending termination request to ProcessServer #{@uri}")
566
+ @log.debug("Sending termination request to ProjectServer #{@uri}")
486
567
  @projectServer = DRbObject.new(nil, @uri) unless @projectServer
487
568
  @projectServer.terminate(@authKey)
488
569
  rescue
@@ -493,7 +574,7 @@ EOT
493
574
 
494
575
  # This is used to generate the status table.
495
576
  def to_s(format, index)
496
- sprintf(format, index, @id, @state,
577
+ sprintf(format, index, @id, @state, @modified ? '*' : ' ',
497
578
  @readySince ? @readySince.to_s('%Y-%m-%d %H:%M:%S') : '')
498
579
  end
499
580