taskjuggler 0.0.5 → 0.0.6

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 (544) hide show
  1. data/CHANGELOG +2086 -0
  2. data/benchmarks/666tasks.tjp +3183 -0
  3. data/benchmarks/booking.tjp +14 -10
  4. data/doc/AppConfig.html +95 -73
  5. data/doc/Arguments.html +22 -2
  6. data/doc/CHANGELOG.html +2587 -0
  7. data/doc/COPYING.html +21 -1
  8. data/doc/Object.html +161 -122
  9. data/doc/README.html +21 -1
  10. data/doc/RuntimeConfig.html +26 -6
  11. data/doc/String.html +38 -18
  12. data/doc/StringIO.html +579 -0
  13. data/doc/TaskJuggler.html +251 -143
  14. data/doc/TaskJuggler/Account.html +26 -6
  15. data/doc/TaskJuggler/AccountAttribute.html +28 -8
  16. data/doc/TaskJuggler/AccountScenario.html +24 -4
  17. data/doc/TaskJuggler/Allocation.html +30 -10
  18. data/doc/TaskJuggler/AllocationAttribute.html +28 -8
  19. data/doc/TaskJuggler/AttributeBase.html +46 -26
  20. data/doc/TaskJuggler/AttributeDefinition.html +22 -2
  21. data/doc/TaskJuggler/BatchProcessor.html +40 -20
  22. data/doc/TaskJuggler/Booking.html +26 -6
  23. data/doc/TaskJuggler/BookingListAttribute.html +28 -8
  24. data/doc/TaskJuggler/BooleanAttribute.html +28 -8
  25. data/doc/TaskJuggler/CSVFile.html +308 -146
  26. data/doc/TaskJuggler/CellSettingPattern.html +22 -2
  27. data/doc/TaskJuggler/CellSettingPatternList.html +26 -6
  28. data/doc/TaskJuggler/Charge.html +26 -6
  29. data/doc/TaskJuggler/ChargeListAttribute.html +26 -6
  30. data/doc/TaskJuggler/ChargeSet.html +33 -13
  31. data/doc/TaskJuggler/ChargeSetListAttribute.html +28 -8
  32. data/doc/TaskJuggler/ColumnListAttribute.html +26 -6
  33. data/doc/TaskJuggler/ColumnTable.html +24 -4
  34. data/doc/TaskJuggler/Daemon.html +26 -6
  35. data/doc/TaskJuggler/DateAttribute.html +26 -6
  36. data/doc/TaskJuggler/DefinitionListAttribute.html +22 -2
  37. data/doc/TaskJuggler/DependencyListAttribute.html +28 -8
  38. data/doc/TaskJuggler/DurationAttribute.html +28 -8
  39. data/doc/TaskJuggler/FixnumAttribute.html +24 -4
  40. data/doc/TaskJuggler/FlagListAttribute.html +28 -8
  41. data/doc/TaskJuggler/FloatAttribute.html +26 -6
  42. data/doc/TaskJuggler/FormatListAttribute.html +24 -4
  43. data/doc/TaskJuggler/GanttChart.html +147 -126
  44. data/doc/TaskJuggler/GanttContainer.html +34 -14
  45. data/doc/TaskJuggler/GanttHeader.html +28 -8
  46. data/doc/TaskJuggler/GanttHeaderScaleItem.html +24 -4
  47. data/doc/TaskJuggler/GanttLine.html +38 -18
  48. data/doc/TaskJuggler/GanttLoadStack.html +26 -6
  49. data/doc/TaskJuggler/GanttMilestone.html +34 -14
  50. data/doc/TaskJuggler/GanttRouter.html +50 -30
  51. data/doc/TaskJuggler/GanttTaskBar.html +34 -14
  52. data/doc/TaskJuggler/HTMLDocument.html +26 -6
  53. data/doc/TaskJuggler/HTMLGraphics.html +30 -10
  54. data/doc/TaskJuggler/Interval.html +40 -22
  55. data/doc/TaskJuggler/IntervalListAttribute.html +28 -8
  56. data/doc/TaskJuggler/JobInfo.html +24 -4
  57. data/doc/TaskJuggler/Journal.html +226 -147
  58. data/doc/TaskJuggler/JournalEntry.html +22 -2
  59. data/doc/TaskJuggler/JournalEntryList.html +129 -112
  60. data/doc/TaskJuggler/KeywordArray.html +26 -6
  61. data/doc/TaskJuggler/KeywordDocumentation.html +46 -26
  62. data/doc/TaskJuggler/Limits.html +152 -123
  63. data/doc/TaskJuggler/Limits/Limit.html +149 -70
  64. data/doc/TaskJuggler/LimitsAttribute.html +36 -51
  65. data/doc/TaskJuggler/ListAttributeBase.html +24 -4
  66. data/doc/TaskJuggler/Log.html +50 -32
  67. data/doc/TaskJuggler/LogFile.html +37 -17
  68. data/doc/TaskJuggler/LogicalAttribute.html +53 -33
  69. data/doc/TaskJuggler/LogicalExpression.html +26 -6
  70. data/doc/TaskJuggler/LogicalExpressionAttribute.html +32 -12
  71. data/doc/TaskJuggler/LogicalFlag.html +42 -22
  72. data/doc/TaskJuggler/LogicalFunction.html +204 -140
  73. data/doc/TaskJuggler/LogicalOperation.html +135 -111
  74. data/doc/TaskJuggler/Macro.html +22 -2
  75. data/doc/TaskJuggler/MacroParser.html +32 -12
  76. data/doc/TaskJuggler/MacroTable.html +32 -12
  77. data/doc/TaskJuggler/ManagerResponsibilities.html +24 -4
  78. data/doc/TaskJuggler/ManagerStatusRecord.html +24 -4
  79. data/doc/TaskJuggler/Message.html +24 -4
  80. data/doc/TaskJuggler/MessageHandler.html +24 -4
  81. data/doc/TaskJuggler/Navigator.html +104 -71
  82. data/doc/TaskJuggler/NavigatorElement.html +32 -12
  83. data/doc/TaskJuggler/NikuProject.html +22 -2
  84. data/doc/TaskJuggler/NikuReport.html +310 -228
  85. data/doc/TaskJuggler/NikuResource.html +22 -2
  86. data/doc/TaskJuggler/NodeListAttribute.html +615 -0
  87. data/doc/TaskJuggler/OnShiftCache.html +32 -12
  88. data/doc/TaskJuggler/ProcessIntercom.html +205 -78
  89. data/doc/TaskJuggler/ProcessIntercomIface.html +26 -6
  90. data/doc/TaskJuggler/Project.html +708 -660
  91. data/doc/TaskJuggler/ProjectBroker.html +506 -304
  92. data/doc/TaskJuggler/ProjectBrokerIface.html +61 -41
  93. data/doc/TaskJuggler/ProjectFileParser.html +429 -373
  94. data/doc/TaskJuggler/ProjectFileScanner.html +1790 -0
  95. data/doc/TaskJuggler/ProjectRecord.html +80 -60
  96. data/doc/TaskJuggler/ProjectServer.html +312 -237
  97. data/doc/TaskJuggler/ProjectServerIface.html +101 -43
  98. data/doc/TaskJuggler/PropertyAttribute.html +32 -12
  99. data/doc/TaskJuggler/PropertyList.html +166 -145
  100. data/doc/TaskJuggler/PropertySet.html +254 -224
  101. data/doc/TaskJuggler/PropertyTreeNode.html +670 -536
  102. data/doc/TaskJuggler/Query.html +169 -148
  103. data/doc/TaskJuggler/RTFHandlers.html +622 -0
  104. data/doc/TaskJuggler/RTFNavigator.html +28 -8
  105. data/doc/TaskJuggler/RTFQuery.html +40 -20
  106. data/doc/TaskJuggler/RTFReport.html +62 -25
  107. data/doc/TaskJuggler/RTFReportLink.html +765 -0
  108. data/doc/TaskJuggler/RealFormat.html +26 -6
  109. data/doc/TaskJuggler/RealFormatAttribute.html +26 -6
  110. data/doc/TaskJuggler/ReferenceAttribute.html +59 -39
  111. data/doc/TaskJuggler/Report.html +402 -251
  112. data/doc/TaskJuggler/ReportBase.html +162 -137
  113. data/doc/TaskJuggler/ReportContext.html +112 -29
  114. data/doc/TaskJuggler/ReportServer.html +89 -64
  115. data/doc/TaskJuggler/ReportServerIface.html +75 -55
  116. data/doc/TaskJuggler/ReportServerRecord.html +54 -31
  117. data/doc/TaskJuggler/ReportServlet.html +980 -0
  118. data/doc/TaskJuggler/ReportTable.html +41 -21
  119. data/doc/TaskJuggler/ReportTableCell.html +214 -170
  120. data/doc/TaskJuggler/ReportTableColumn.html +30 -10
  121. data/doc/TaskJuggler/ReportTableLegend.html +36 -16
  122. data/doc/TaskJuggler/ReportTableLine.html +32 -12
  123. data/doc/TaskJuggler/Resource.html +99 -87
  124. data/doc/TaskJuggler/ResourceListAttribute.html +59 -39
  125. data/doc/TaskJuggler/ResourceListRE.html +47 -26
  126. data/doc/TaskJuggler/ResourceScenario.html +403 -437
  127. data/doc/TaskJuggler/RichText.html +26 -6
  128. data/doc/TaskJuggler/RichTextAttribute.html +50 -30
  129. data/doc/TaskJuggler/RichTextDocument.html +37 -17
  130. data/doc/TaskJuggler/RichTextElement.html +475 -413
  131. data/doc/TaskJuggler/RichTextException.html +22 -2
  132. data/doc/TaskJuggler/RichTextFunctionExample.html +28 -8
  133. data/doc/TaskJuggler/RichTextFunctionHandler.html +24 -4
  134. data/doc/TaskJuggler/RichTextImage.html +22 -2
  135. data/doc/TaskJuggler/RichTextIntermediate.html +38 -18
  136. data/doc/TaskJuggler/RichTextParser.html +56 -34
  137. data/doc/TaskJuggler/RichTextScanner.html +82 -61
  138. data/doc/TaskJuggler/RichTextSnip.html +34 -14
  139. data/doc/TaskJuggler/RichTextSyntaxRules.html +507 -353
  140. data/doc/TaskJuggler/Scenario.html +22 -2
  141. data/doc/TaskJuggler/ScenarioData.html +30 -46
  142. data/doc/TaskJuggler/ScenarioListAttribute.html +38 -18
  143. data/doc/TaskJuggler/Scoreboard.html +42 -22
  144. data/doc/TaskJuggler/SheetHandlerBase.html +40 -20
  145. data/doc/TaskJuggler/SheetReceiver.html +333 -295
  146. data/doc/TaskJuggler/SheetSender.html +253 -230
  147. data/doc/TaskJuggler/Shift.html +26 -6
  148. data/doc/TaskJuggler/ShiftAssignment.html +89 -73
  149. data/doc/TaskJuggler/ShiftAssignments.html +226 -234
  150. data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +39 -54
  151. data/doc/TaskJuggler/ShiftScenario.html +28 -8
  152. data/doc/TaskJuggler/SortListAttribute.html +34 -14
  153. data/doc/TaskJuggler/SourceFileInfo.html +24 -4
  154. data/doc/TaskJuggler/StatusSheetReceiver.html +24 -3
  155. data/doc/TaskJuggler/StatusSheetReport.html +168 -153
  156. data/doc/TaskJuggler/StatusSheetSender.html +24 -3
  157. data/doc/TaskJuggler/StringAttribute.html +38 -18
  158. data/doc/TaskJuggler/SymbolAttribute.html +32 -12
  159. data/doc/TaskJuggler/SyntaxReference.html +40 -20
  160. data/doc/TaskJuggler/TOCEntry.html +26 -6
  161. data/doc/TaskJuggler/TSResourceRecord.html +22 -2
  162. data/doc/TaskJuggler/TSTaskRecord.html +22 -2
  163. data/doc/TaskJuggler/TableColumnDefinition.html +59 -22
  164. data/doc/TaskJuggler/TableOfContents.html +26 -6
  165. data/doc/TaskJuggler/TableReport.html +937 -904
  166. data/doc/TaskJuggler/Task.html +55 -36
  167. data/doc/TaskJuggler/TaskDependency.html +24 -4
  168. data/doc/TaskJuggler/TaskListAttribute.html +50 -30
  169. data/doc/TaskJuggler/TaskListRE.html +27 -7
  170. data/doc/TaskJuggler/TaskScenario.html +1273 -1153
  171. data/doc/TaskJuggler/TextFormatter.html +28 -8
  172. data/doc/TaskJuggler/TextParser.html +585 -338
  173. data/doc/TaskJuggler/TextParser/Pattern.html +54 -34
  174. data/doc/TaskJuggler/TextParser/Rule.html +95 -73
  175. data/doc/TaskJuggler/TextParser/StackElement.html +39 -17
  176. data/doc/TaskJuggler/TextParser/TextParserResultArray.html +24 -4
  177. data/doc/TaskJuggler/TextParser/TokenDoc.html +22 -2
  178. data/doc/TaskJuggler/TextReport.html +28 -8
  179. data/doc/TaskJuggler/TextScanner.html +400 -1404
  180. data/doc/TaskJuggler/TextScanner/BufferStreamHandle.html +28 -240
  181. data/doc/TaskJuggler/TextScanner/FileStreamHandle.html +37 -184
  182. data/doc/TaskJuggler/TextScanner/MacroStackEntry.html +682 -0
  183. data/doc/TaskJuggler/TextScanner/StreamHandle.html +342 -67
  184. data/doc/TaskJuggler/TimeSheet.html +48 -28
  185. data/doc/TaskJuggler/TimeSheetReceiver.html +24 -3
  186. data/doc/TaskJuggler/TimeSheetRecord.html +47 -27
  187. data/doc/TaskJuggler/TimeSheetReport.html +154 -133
  188. data/doc/TaskJuggler/TimeSheetSender.html +24 -3
  189. data/doc/TaskJuggler/TimeSheetSummary.html +137 -91
  190. data/doc/TaskJuggler/TimeSheets.html +26 -6
  191. data/doc/TaskJuggler/Tj3AppBase.html +85 -58
  192. data/doc/TaskJuggler/Tj3Client.html +292 -238
  193. data/doc/TaskJuggler/Tj3Daemon.html +159 -74
  194. data/doc/TaskJuggler/Tj3SheetAppBase.html +26 -6
  195. data/doc/TaskJuggler/Tj3SsReceiver.html +26 -6
  196. data/doc/TaskJuggler/Tj3SsSender.html +53 -26
  197. data/doc/TaskJuggler/Tj3TsReceiver.html +28 -7
  198. data/doc/TaskJuggler/Tj3TsSender.html +26 -6
  199. data/doc/TaskJuggler/Tj3TsSummary.html +26 -6
  200. data/doc/TaskJuggler/TjException.html +22 -2
  201. data/doc/TaskJuggler/TjTime.html +216 -160
  202. data/doc/TaskJuggler/TjpExample.html +34 -14
  203. data/doc/TaskJuggler/TjpExportRE.html +403 -407
  204. data/doc/TaskJuggler/TjpSyntaxRules.html +4805 -4408
  205. data/doc/TaskJuggler/URLParameter.html +649 -0
  206. data/doc/TaskJuggler/UserManual.html +42 -22
  207. data/doc/TaskJuggler/WebServer.html +702 -0
  208. data/doc/TaskJuggler/WorkingHours.html +38 -18
  209. data/doc/TaskJuggler/WorkingHoursAttribute.html +61 -41
  210. data/doc/TaskJuggler/XMLBlob.html +24 -4
  211. data/doc/TaskJuggler/XMLComment.html +24 -4
  212. data/doc/TaskJuggler/XMLDocument.html +30 -10
  213. data/doc/TaskJuggler/XMLElement.html +34 -14
  214. data/doc/TaskJuggler/XMLNamedText.html +22 -2
  215. data/doc/TaskJuggler/XMLText.html +24 -4
  216. data/doc/index.html +1841 -1666
  217. data/doc/lib/AccountScenario_rb.html +1 -1
  218. data/doc/lib/Account_rb.html +1 -1
  219. data/doc/lib/Allocation_rb.html +1 -1
  220. data/doc/lib/AppConfig_rb.html +2 -2
  221. data/doc/lib/AttributeBase_rb.html +1 -1
  222. data/doc/lib/AttributeDefinition_rb.html +1 -1
  223. data/doc/lib/Attributes_rb.html +2 -2
  224. data/doc/lib/BatchProcessor_rb.html +1 -1
  225. data/doc/lib/Booking_rb.html +1 -1
  226. data/doc/lib/ChargeSet_rb.html +1 -1
  227. data/doc/lib/Charge_rb.html +1 -1
  228. data/doc/lib/HTMLDocument_rb.html +1 -1
  229. data/doc/lib/Interval_rb.html +1 -1
  230. data/doc/lib/Journal_rb.html +2 -2
  231. data/doc/lib/KeywordArray_rb.html +1 -1
  232. data/doc/lib/KeywordDocumentation_rb.html +1 -1
  233. data/doc/lib/Limits_rb.html +2 -2
  234. data/doc/lib/LogFile_rb.html +2 -2
  235. data/doc/lib/Log_rb.html +1 -1
  236. data/doc/lib/LogicalExpression_rb.html +1 -1
  237. data/doc/lib/LogicalFunction_rb.html +2 -2
  238. data/doc/lib/LogicalOperation_rb.html +2 -2
  239. data/doc/lib/MacroParser_rb.html +1 -1
  240. data/doc/lib/MacroTable_rb.html +1 -1
  241. data/doc/lib/MessageHandler_rb.html +1 -1
  242. data/doc/lib/Message_rb.html +1 -1
  243. data/doc/lib/ProjectFileParser_rb.html +4 -8
  244. data/doc/lib/ProjectFileScanner_rb.html +67 -0
  245. data/doc/lib/Project_rb.html +2 -2
  246. data/doc/lib/PropertyList_rb.html +2 -2
  247. data/doc/lib/PropertySet_rb.html +2 -2
  248. data/doc/lib/PropertyTreeNode_rb.html +2 -2
  249. data/doc/lib/Query_rb.html +2 -2
  250. data/doc/lib/RTFHandlers_rb.html +73 -0
  251. data/doc/lib/RTFNavigator_rb.html +1 -1
  252. data/doc/lib/RTFQuery_rb.html +1 -1
  253. data/doc/lib/RTFReportLink_rb.html +71 -0
  254. data/doc/lib/RTFReport_rb.html +2 -2
  255. data/doc/lib/RealFormat_rb.html +1 -1
  256. data/doc/lib/ResourceScenario_rb.html +2 -2
  257. data/doc/lib/Resource_rb.html +2 -2
  258. data/doc/lib/RichTextDocument_rb.html +1 -1
  259. data/doc/lib/RichTextElement_rb.html +2 -2
  260. data/doc/lib/RichTextFunctionExample_rb.html +1 -1
  261. data/doc/lib/RichTextFunctionHandler_rb.html +1 -1
  262. data/doc/lib/RichTextParser_rb.html +2 -2
  263. data/doc/lib/RichTextScanner_rb.html +2 -2
  264. data/doc/lib/RichTextSnip_rb.html +1 -1
  265. data/doc/lib/RichTextSyntaxRules_rb.html +2 -2
  266. data/doc/lib/RichText_rb.html +1 -1
  267. data/doc/lib/RuntimeConfig_rb.html +1 -1
  268. data/doc/lib/ScenarioData_rb.html +2 -2
  269. data/doc/lib/Scenario_rb.html +1 -1
  270. data/doc/lib/Scoreboard_rb.html +1 -1
  271. data/doc/lib/SheetHandlerBase_rb.html +1 -1
  272. data/doc/lib/SheetReceiver_rb.html +2 -2
  273. data/doc/lib/SheetSender_rb.html +4 -2
  274. data/doc/lib/ShiftAssignments_rb.html +4 -2
  275. data/doc/lib/ShiftScenario_rb.html +1 -1
  276. data/doc/lib/Shift_rb.html +1 -1
  277. data/doc/lib/SourceFileInfo_rb.html +1 -1
  278. data/doc/lib/StatusSheetReceiver_rb.html +2 -2
  279. data/doc/lib/StatusSheetSender_rb.html +2 -2
  280. data/doc/lib/SyntaxReference_rb.html +1 -1
  281. data/doc/lib/TOCEntry_rb.html +1 -1
  282. data/doc/lib/TableColumnDefinition_rb.html +2 -2
  283. data/doc/lib/TableOfContents_rb.html +1 -1
  284. data/doc/lib/TaskDependency_rb.html +1 -1
  285. data/doc/lib/TaskJuggler_rb.html +2 -2
  286. data/doc/lib/TaskScenario_rb.html +2 -2
  287. data/doc/lib/Task_rb.html +2 -2
  288. data/doc/lib/TextFormatter_rb.html +1 -1
  289. data/doc/lib/TextParser/Pattern_rb.html +1 -1
  290. data/doc/lib/TextParser/Rule_rb.html +2 -2
  291. data/doc/lib/TextParser/StackElement_rb.html +2 -2
  292. data/doc/lib/TextParser/TokenDoc_rb.html +1 -1
  293. data/doc/lib/TextParser_rb.html +2 -2
  294. data/doc/lib/TextScanner_rb.html +6 -2
  295. data/doc/lib/TimeSheetReceiver_rb.html +2 -2
  296. data/doc/lib/TimeSheetSender_rb.html +2 -2
  297. data/doc/lib/TimeSheetSummary_rb.html +2 -2
  298. data/doc/lib/TimeSheets_rb.html +2 -2
  299. data/doc/lib/Tj3AppBase_rb.html +2 -2
  300. data/doc/lib/Tj3Config_rb.html +2 -2
  301. data/doc/lib/Tj3SheetAppBase_rb.html +2 -2
  302. data/doc/lib/TjException_rb.html +1 -1
  303. data/doc/lib/TjTime_rb.html +2 -2
  304. data/doc/lib/TjpExample_rb.html +1 -1
  305. data/doc/lib/TjpSyntaxRules_rb.html +2 -2
  306. data/doc/lib/URLParameter_rb.html +67 -0
  307. data/doc/lib/UTF8String_rb.html +1 -1
  308. data/doc/lib/UserManual_rb.html +1 -1
  309. data/doc/lib/WorkingHours_rb.html +1 -1
  310. data/doc/lib/XMLDocument_rb.html +2 -2
  311. data/doc/lib/XMLElement_rb.html +1 -1
  312. data/doc/lib/daemon/Daemon_rb.html +1 -1
  313. data/doc/lib/daemon/ProcessIntercom_rb.html +2 -2
  314. data/doc/lib/daemon/ProjectBroker_rb.html +4 -2
  315. data/doc/lib/daemon/ProjectServer_rb.html +2 -2
  316. data/doc/lib/daemon/ReportServer_rb.html +2 -2
  317. data/doc/lib/daemon/WebServer_rb.html +75 -0
  318. data/doc/lib/deep_copy_rb.html +2 -2
  319. data/doc/lib/reports/CSVFile_rb.html +2 -2
  320. data/doc/lib/reports/ColumnTable_rb.html +1 -1
  321. data/doc/lib/reports/GanttChart_rb.html +2 -2
  322. data/doc/lib/reports/GanttContainer_rb.html +1 -1
  323. data/doc/lib/reports/GanttHeaderScaleItem_rb.html +1 -1
  324. data/doc/lib/reports/GanttHeader_rb.html +1 -1
  325. data/doc/lib/reports/GanttLine_rb.html +1 -1
  326. data/doc/lib/reports/GanttLoadStack_rb.html +1 -1
  327. data/doc/lib/reports/GanttMilestone_rb.html +1 -1
  328. data/doc/lib/reports/GanttRouter_rb.html +1 -1
  329. data/doc/lib/reports/GanttTaskBar_rb.html +1 -1
  330. data/doc/lib/reports/HTMLGraphics_rb.html +1 -1
  331. data/doc/lib/reports/Navigator_rb.html +2 -2
  332. data/doc/lib/reports/NikuReport_rb.html +2 -2
  333. data/doc/lib/reports/ReportBase_rb.html +2 -2
  334. data/doc/lib/reports/ReportContext_rb.html +2 -2
  335. data/doc/lib/reports/ReportTableCell_rb.html +2 -2
  336. data/doc/lib/reports/ReportTableColumn_rb.html +1 -1
  337. data/doc/lib/reports/ReportTableLegend_rb.html +1 -1
  338. data/doc/lib/reports/ReportTableLine_rb.html +1 -1
  339. data/doc/lib/reports/ReportTable_rb.html +2 -2
  340. data/doc/lib/reports/Report_rb.html +2 -2
  341. data/doc/lib/reports/ResourceListRE_rb.html +2 -2
  342. data/doc/lib/reports/StatusSheetReport_rb.html +2 -2
  343. data/doc/lib/reports/TableReport_rb.html +2 -2
  344. data/doc/lib/reports/TaskListRE_rb.html +2 -2
  345. data/doc/lib/reports/TextReport_rb.html +1 -1
  346. data/doc/lib/reports/TimeSheetReport_rb.html +2 -2
  347. data/doc/lib/reports/TjpExportRE_rb.html +2 -2
  348. data/doc/lib/ruby-signal-bug_rb.html +1 -1
  349. data/doc/lib/taskjuggler3_rb.html +2 -2
  350. data/doc/lib/tj3client_rb.html +2 -2
  351. data/doc/lib/tj3d_rb.html +2 -2
  352. data/doc/lib/tj3man_rb.html +1 -1
  353. data/doc/lib/tj3ss_receiver_rb.html +1 -1
  354. data/doc/lib/tj3ss_sender_rb.html +2 -2
  355. data/doc/lib/tj3ts_receiver_rb.html +2 -2
  356. data/doc/lib/tj3ts_sender_rb.html +1 -1
  357. data/doc/lib/tj3ts_summary_rb.html +1 -1
  358. data/doc/rdoc.css +9 -4
  359. data/examples/tutorial.tjp +17 -15
  360. data/gem_spec.rb +3 -0
  361. data/lib/AppConfig.rb +3 -1
  362. data/lib/Attributes.rb +10 -8
  363. data/lib/Journal.rb +55 -20
  364. data/lib/Limits.rb +72 -46
  365. data/lib/LogFile.rb +3 -3
  366. data/lib/LogicalFunction.rb +19 -6
  367. data/lib/LogicalOperation.rb +5 -1
  368. data/lib/Project.rb +37 -9
  369. data/lib/ProjectFileParser.rb +25 -22
  370. data/lib/ProjectFileScanner.rb +365 -0
  371. data/lib/PropertyList.rb +2 -1
  372. data/lib/PropertySet.rb +14 -4
  373. data/lib/PropertyTreeNode.rb +42 -29
  374. data/lib/Query.rb +3 -1
  375. data/lib/RTFHandlers.rb +35 -0
  376. data/lib/RTFReport.rb +23 -6
  377. data/lib/RTFReportLink.rb +72 -0
  378. data/lib/Resource.rb +8 -16
  379. data/lib/ResourceScenario.rb +1 -22
  380. data/lib/RichTextElement.rb +42 -0
  381. data/lib/RichTextParser.rb +6 -4
  382. data/lib/RichTextScanner.rb +5 -5
  383. data/lib/RichTextSyntaxRules.rb +48 -10
  384. data/lib/ScenarioData.rb +5 -3
  385. data/lib/SheetReceiver.rb +24 -6
  386. data/lib/SheetSender.rb +17 -13
  387. data/lib/ShiftAssignments.rb +56 -52
  388. data/lib/StatusSheetReceiver.rb +1 -0
  389. data/lib/StatusSheetSender.rb +1 -0
  390. data/lib/TableColumnDefinition.rb +4 -2
  391. data/lib/Task.rb +8 -9
  392. data/lib/TaskJuggler.rb +21 -11
  393. data/lib/TaskScenario.rb +61 -26
  394. data/lib/TextParser.rb +268 -106
  395. data/lib/TextParser/Rule.rb +4 -2
  396. data/lib/TextParser/StackElement.rb +6 -4
  397. data/lib/TextScanner.rb +283 -700
  398. data/lib/TimeSheetReceiver.rb +1 -0
  399. data/lib/TimeSheetSender.rb +1 -0
  400. data/lib/TimeSheetSummary.rb +51 -26
  401. data/lib/TimeSheets.rb +1 -1
  402. data/lib/Tj3AppBase.rb +8 -1
  403. data/lib/Tj3Config.rb +1 -1
  404. data/lib/TjTime.rb +5 -0
  405. data/lib/TjpSyntaxRules.rb +360 -144
  406. data/lib/URLParameter.rb +30 -0
  407. data/lib/XMLDocument.rb +2 -2
  408. data/lib/daemon/ProcessIntercom.rb +50 -9
  409. data/lib/daemon/ProjectBroker.rb +63 -10
  410. data/lib/daemon/ProjectServer.rb +47 -16
  411. data/lib/daemon/ReportServer.rb +9 -4
  412. data/lib/daemon/WebServer.rb +204 -0
  413. data/lib/deep_copy.rb +4 -1
  414. data/lib/reports/CSVFile.rb +150 -66
  415. data/lib/reports/GanttChart.rb +2 -1
  416. data/lib/reports/Navigator.rb +18 -5
  417. data/lib/reports/NikuReport.rb +32 -2
  418. data/lib/reports/Report.rb +65 -37
  419. data/lib/reports/ReportBase.rb +14 -9
  420. data/lib/reports/ReportContext.rb +19 -4
  421. data/lib/reports/ReportTable.rb +2 -2
  422. data/lib/reports/ReportTableCell.rb +54 -30
  423. data/lib/reports/ResourceListRE.rb +4 -3
  424. data/lib/reports/StatusSheetReport.rb +8 -13
  425. data/lib/reports/TableReport.rb +47 -32
  426. data/lib/reports/TaskListRE.rb +3 -3
  427. data/lib/reports/TimeSheetReport.rb +14 -5
  428. data/lib/reports/TjpExportRE.rb +14 -19
  429. data/lib/taskjuggler3.rb +15 -0
  430. data/lib/tj3client.rb +9 -7
  431. data/lib/tj3d.rb +38 -10
  432. data/lib/tj3ss_sender.rb +7 -0
  433. data/lib/tj3ts_receiver.rb +1 -0
  434. data/manual/Day_To_Day_Juggling +1 -1
  435. data/manual/Rich_Text_Attributes +8 -0
  436. data/manual/TaskJuggler_2x_Migration +7 -0
  437. data/manual/The_TaskJuggler_Syntax +20 -6
  438. data/prj_cfg.rb +3 -2
  439. data/tasks/changelog.rake +36 -0
  440. data/tasks/csts.rake +2 -3
  441. data/tasks/gem.rake +10 -0
  442. data/tasks/missing.rake +0 -17
  443. data/test/TestSuite/ReportGenerator/Correct/Journal.html +63 -0
  444. data/test/TestSuite/ReportGenerator/Correct/Journal.tjp +14 -0
  445. data/test/TestSuite/{HTML-Reports/LogicalFunctions.tjp → ReportGenerator/Correct/LogicalFunctions1.tjp} +2 -2
  446. data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.csv +3 -0
  447. data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.tjp +19 -0
  448. data/test/TestSuite/ReportGenerator/Correct/css/tjmanual.css +66 -0
  449. data/test/TestSuite/ReportGenerator/Correct/css/tjreport.css +407 -0
  450. data/test/TestSuite/ReportGenerator/Correct/icons/details.png +0 -0
  451. data/test/TestSuite/ReportGenerator/Correct/icons/flag-green.png +0 -0
  452. data/test/TestSuite/ReportGenerator/Correct/icons/flag-red.png +0 -0
  453. data/test/TestSuite/ReportGenerator/Correct/icons/flag-yellow.png +0 -0
  454. data/test/TestSuite/ReportGenerator/Correct/icons/resource.png +0 -0
  455. data/test/TestSuite/ReportGenerator/Correct/icons/resourcegroup.png +0 -0
  456. data/test/TestSuite/ReportGenerator/Correct/icons/task.png +0 -0
  457. data/test/TestSuite/ReportGenerator/Correct/icons/taskgroup.png +0 -0
  458. data/test/TestSuite/ReportGenerator/Correct/icons/trend-down.png +0 -0
  459. data/test/TestSuite/ReportGenerator/Correct/icons/trend-flat.png +0 -0
  460. data/test/TestSuite/ReportGenerator/Correct/icons/trend-up.png +0 -0
  461. data/test/TestSuite/ReportGenerator/Correct/opennodes.csv +2 -0
  462. data/test/TestSuite/ReportGenerator/Correct/opennodes.tjp +26 -0
  463. data/test/TestSuite/ReportGenerator/Correct/refs/Journal-1.csv +6 -0
  464. data/test/TestSuite/ReportGenerator/Correct/refs/LogicalFunctions1-1.csv +7 -0
  465. data/test/TestSuite/ReportGenerator/Correct/refs/LogicalFunctions2-1.csv +2 -0
  466. data/test/TestSuite/ReportGenerator/Correct/refs/opennodes-1.csv +2 -0
  467. data/test/TestSuite/ReportGenerator/Correct/scripts/wz_tooltip.js +1301 -0
  468. data/test/TestSuite/ReportGenerator/Errors/rtp_report_recursion.tjp +20 -0
  469. data/test/TestSuite/Scheduler/Correct/Container.html +349 -0
  470. data/test/TestSuite/Scheduler/Correct/Limits.tjp +11 -4
  471. data/test/TestSuite/Scheduler/Correct/Shift2.html +464 -150
  472. data/test/TestSuite/Scheduler/Correct/TimeSheet2.html +108 -0
  473. data/test/TestSuite/Scheduler/Correct/TimeSheet2.tjp +7 -0
  474. data/test/TestSuite/Scheduler/Correct/css/tjmanual.css +14 -0
  475. data/test/TestSuite/Scheduler/Correct/css/tjreport.css +233 -21
  476. data/test/TestSuite/Scheduler/Correct/scripts/wz_tooltip.js +20 -20
  477. data/test/TestSuite/StatusSheetTemplates/project.tji +35 -0
  478. data/test/TestSuite/StatusSheetTemplates/project.tjp +56 -0
  479. data/test/TestSuite/StatusSheets/run +3 -2
  480. data/test/TestSuite/Syntax/Correct/Include.tjp +1 -1
  481. data/test/TestSuite/Syntax/Correct/Macro-1.tjp +1 -1
  482. data/test/TestSuite/Syntax/Correct/Macro-2.tjp +6 -0
  483. data/test/TestSuite/Syntax/Correct/Macro-3.tjp +14 -0
  484. data/test/TestSuite/Syntax/Correct/ResourcePrefix.html +32 -0
  485. data/test/TestSuite/Syntax/Correct/css/tjmanual.css +66 -0
  486. data/test/TestSuite/Syntax/Correct/css/tjreport.css +407 -0
  487. data/test/TestSuite/Syntax/Correct/icons/details.png +0 -0
  488. data/test/TestSuite/Syntax/Correct/icons/flag-green.png +0 -0
  489. data/test/TestSuite/Syntax/Correct/icons/flag-red.png +0 -0
  490. data/test/TestSuite/Syntax/Correct/icons/flag-yellow.png +0 -0
  491. data/test/TestSuite/Syntax/Correct/icons/resource.png +0 -0
  492. data/test/TestSuite/Syntax/Correct/icons/resourcegroup.png +0 -0
  493. data/test/TestSuite/Syntax/Correct/icons/task.png +0 -0
  494. data/test/TestSuite/Syntax/Correct/icons/taskgroup.png +0 -0
  495. data/test/TestSuite/Syntax/Correct/icons/trend-down.png +0 -0
  496. data/test/TestSuite/Syntax/Correct/icons/trend-flat.png +0 -0
  497. data/test/TestSuite/Syntax/Correct/icons/trend-up.png +0 -0
  498. data/test/TestSuite/Syntax/Correct/include/dir1/file2.tji +3 -0
  499. data/test/TestSuite/Syntax/Correct/include/dir1/file5.tji +2 -0
  500. data/test/TestSuite/Syntax/Correct/include/dir3/all.tji +3 -0
  501. data/test/TestSuite/Syntax/Correct/include/dir3/file1.tji +2 -0
  502. data/test/TestSuite/Syntax/Correct/include/dir3/file2.tji +1 -0
  503. data/test/TestSuite/Syntax/Correct/scripts/wz_tooltip.js +1301 -0
  504. data/test/TestSuite/Syntax/Correct/tutorial.tjp +13 -13
  505. data/test/TestSuite/Syntax/Errors/empty.tjp +1 -1
  506. data/test/TestSuite/Syntax/Errors/include_recursion.tjp +1 -0
  507. data/test/TestSuite/Syntax/Errors/macro_stack_overflow.tjp +2 -1
  508. data/test/TestSuite/Syntax/Errors/{eof_in_istring1.tjp → no_token_match1.tjp} +2 -2
  509. data/test/TestSuite/Syntax/Errors/{eof_in_istring2.tjp → no_token_match2.tjp} +2 -2
  510. data/test/TestSuite/Syntax/Errors/{eof_in_istring3.tjp → no_token_match3.tjp} +1 -1
  511. data/test/TestSuite/Syntax/Errors/{eof_in_istring4.tjp → no_token_match4.tjp} +1 -1
  512. data/test/TestSuite/Syntax/Errors/{eof_in_istring5.tjp → no_token_match5.tjp} +1 -1
  513. data/test/TestSuite/Syntax/Errors/not_scheduled.tjp +13 -0
  514. data/test/TestSuite/Syntax/Errors/unsupported_token.tjp +1 -1
  515. data/test/TestSuite/TimeSheets/run +5 -5
  516. data/test/test_CSVFile.rb +75 -0
  517. data/test/test_Limits.rb +63 -5
  518. data/test/test_ProjectFileScanner.rb +163 -0
  519. data/test/test_ReportGenerator.rb +81 -0
  520. data/test/test_RichText.rb +21 -3
  521. data/test/test_Scheduler.rb +1 -1
  522. data/test/test_ShiftAssignments.rb +4 -4
  523. data/test/test_Syntax.rb +1 -1
  524. data/test/test_URLParameter.rb +30 -0
  525. metadata +126 -32
  526. data/test/TestSuite/Scheduler/Errors/not_scheduled.tjp +0 -8
  527. data/test/TestSuite/Syntax/Errors/bad_comment.tjp +0 -7
  528. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/boss_2002-03-01.tji +0 -36
  529. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev1_2002-03-01.tji +0 -48
  530. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev2_2002-03-01.tji +0 -67
  531. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev3_2002-03-01.tji +0 -67
  532. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/doc_2002-03-01.tji +0 -48
  533. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/resources.yml +0 -31
  534. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/test_2002-03-01.tji +0 -36
  535. data/test/TestSuite/TimeSheets/TimeSheetTemplates/acceptable_intervals +0 -1
  536. data/test/TestSuite/TimeSheets/TimeSheets/2002-03-01/all.tji +0 -1
  537. data/test/TestSuite/TimeSheets/TimeSheets/2002-03-01/dev2_2002-03-01.tji +0 -54
  538. data/test/TestSuite/TimeSheets/TimeSheets/all.tji +0 -2
  539. data/test/TestSuite/TimeSheets/receiver.log +0 -102
  540. data/test/TestSuite/TimeSheets/sender.log +0 -794
  541. data/test/TestSuite/TimeSheets/summary.log +0 -884
  542. data/test/TestSuite/TimeSheets/timesheets.log +0 -45
  543. data/test/TestSuite/TimeSheets/tj3d.log +0 -292
  544. data/test/test_TextScanner.rb +0 -95
@@ -69,21 +69,21 @@
69
69
  <h3 class="section-header">Methods</h3>
70
70
  <ul class="link-list">
71
71
 
72
- <li><a href="#M001457">::new</a></li>
72
+ <li><a href="#method-c-new">::new</a></li>
73
73
 
74
- <li><a href="#M001459">#createDirectories</a></li>
74
+ <li><a href="#method-i-createDirectories">#createDirectories</a></li>
75
75
 
76
- <li><a href="#M001463">#enableSignatureForReporting</a></li>
76
+ <li><a href="#method-i-enableSignatureForReporting">#enableSignatureForReporting</a></li>
77
77
 
78
- <li><a href="#M001460">#genResourceList</a></li>
78
+ <li><a href="#method-i-genResourceList">#genResourceList</a></li>
79
79
 
80
- <li><a href="#M001461">#genTemplates</a></li>
80
+ <li><a href="#method-i-genTemplates">#genTemplates</a></li>
81
81
 
82
- <li><a href="#M001464">#generateReport</a></li>
82
+ <li><a href="#method-i-generateReport">#generateReport</a></li>
83
83
 
84
- <li><a href="#M001462">#sendReportTemplates</a></li>
84
+ <li><a href="#method-i-sendReportTemplates">#sendReportTemplates</a></li>
85
85
 
86
- <li><a href="#M001458">#sendTemplates</a></li>
86
+ <li><a href="#method-i-sendTemplates">#sendTemplates</a></li>
87
87
 
88
88
  </ul>
89
89
  </div>
@@ -100,6 +100,8 @@
100
100
  <h3 class="section-header">Files</h3>
101
101
  <ul>
102
102
 
103
+ <li class="file"><a href="../CHANGELOG.html">CHANGELOG</a></li>
104
+
103
105
  <li class="file"><a href="../COPYING.html">COPYING</a></li>
104
106
 
105
107
  <li class="file"><a href="../README.html">README</a></li>
@@ -269,6 +271,8 @@
269
271
 
270
272
  <li><a href="../TaskJuggler/NikuResource.html">TaskJuggler::NikuResource</a></li>
271
273
 
274
+ <li><a href="../TaskJuggler/NodeListAttribute.html">TaskJuggler::NodeListAttribute</a></li>
275
+
272
276
  <li><a href="../TaskJuggler/OnShiftCache.html">TaskJuggler::OnShiftCache</a></li>
273
277
 
274
278
  <li><a href="../TaskJuggler/ProcessIntercom.html">TaskJuggler::ProcessIntercom</a></li>
@@ -283,6 +287,8 @@
283
287
 
284
288
  <li><a href="../TaskJuggler/ProjectFileParser.html">TaskJuggler::ProjectFileParser</a></li>
285
289
 
290
+ <li><a href="../TaskJuggler/ProjectFileScanner.html">TaskJuggler::ProjectFileScanner</a></li>
291
+
286
292
  <li><a href="../TaskJuggler/ProjectRecord.html">TaskJuggler::ProjectRecord</a></li>
287
293
 
288
294
  <li><a href="../TaskJuggler/ProjectServer.html">TaskJuggler::ProjectServer</a></li>
@@ -299,12 +305,16 @@
299
305
 
300
306
  <li><a href="../TaskJuggler/Query.html">TaskJuggler::Query</a></li>
301
307
 
308
+ <li><a href="../TaskJuggler/RTFHandlers.html">TaskJuggler::RTFHandlers</a></li>
309
+
302
310
  <li><a href="../TaskJuggler/RTFNavigator.html">TaskJuggler::RTFNavigator</a></li>
303
311
 
304
312
  <li><a href="../TaskJuggler/RTFQuery.html">TaskJuggler::RTFQuery</a></li>
305
313
 
306
314
  <li><a href="../TaskJuggler/RTFReport.html">TaskJuggler::RTFReport</a></li>
307
315
 
316
+ <li><a href="../TaskJuggler/RTFReportLink.html">TaskJuggler::RTFReportLink</a></li>
317
+
308
318
  <li><a href="../TaskJuggler/RealFormat.html">TaskJuggler::RealFormat</a></li>
309
319
 
310
320
  <li><a href="../TaskJuggler/RealFormatAttribute.html">TaskJuggler::RealFormatAttribute</a></li>
@@ -323,6 +333,8 @@
323
333
 
324
334
  <li><a href="../TaskJuggler/ReportServerRecord.html">TaskJuggler::ReportServerRecord</a></li>
325
335
 
336
+ <li><a href="../TaskJuggler/ReportServlet.html">TaskJuggler::ReportServlet</a></li>
337
+
326
338
  <li><a href="../TaskJuggler/ReportTable.html">TaskJuggler::ReportTable</a></li>
327
339
 
328
340
  <li><a href="../TaskJuggler/ReportTableCell.html">TaskJuggler::ReportTableCell</a></li>
@@ -451,6 +463,8 @@
451
463
 
452
464
  <li><a href="../TaskJuggler/TextScanner/FileStreamHandle.html">TaskJuggler::TextScanner::FileStreamHandle</a></li>
453
465
 
466
+ <li><a href="../TaskJuggler/TextScanner/MacroStackEntry.html">TaskJuggler::TextScanner::MacroStackEntry</a></li>
467
+
454
468
  <li><a href="../TaskJuggler/TextScanner/StreamHandle.html">TaskJuggler::TextScanner::StreamHandle</a></li>
455
469
 
456
470
  <li><a href="../TaskJuggler/TimeSheet.html">TaskJuggler::TimeSheet</a></li>
@@ -495,8 +509,12 @@
495
509
 
496
510
  <li><a href="../TaskJuggler/TjpSyntaxRules.html">TaskJuggler::TjpSyntaxRules</a></li>
497
511
 
512
+ <li><a href="../TaskJuggler/URLParameter.html">TaskJuggler::URLParameter</a></li>
513
+
498
514
  <li><a href="../TaskJuggler/UserManual.html">TaskJuggler::UserManual</a></li>
499
515
 
516
+ <li><a href="../TaskJuggler/WebServer.html">TaskJuggler::WebServer</a></li>
517
+
500
518
  <li><a href="../TaskJuggler/WorkingHours.html">TaskJuggler::WorkingHours</a></li>
501
519
 
502
520
  <li><a href="../TaskJuggler/WorkingHoursAttribute.html">TaskJuggler::WorkingHoursAttribute</a></li>
@@ -523,6 +541,8 @@
523
541
 
524
542
  <li><a href="../String.html">String</a></li>
525
543
 
544
+ <li><a href="../StringIO.html">StringIO</a></li>
545
+
526
546
  </ul>
527
547
  <div id="no-class-search-results" style="display: none;">No matching classes.</div>
528
548
  </div>
@@ -594,7 +614,7 @@ A base class for sheet senders.
594
614
 
595
615
 
596
616
  <div id="new-method" class="method-detail ">
597
- <a name="M001457"></a>
617
+ <a name="method-c-new"></a>
598
618
 
599
619
  <div class="method-heading">
600
620
 
@@ -613,34 +633,37 @@ A base class for sheet senders.
613
633
  <div class="method-source-code"
614
634
  id="new-source">
615
635
  <pre>
616
- <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 25</span>
617
- 25: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">appName</span>, <span class="ruby-identifier">type</span>)
618
- 26: <span class="ruby-keyword kw">super</span>(<span class="ruby-identifier">appName</span>)
619
- 27:
620
- 28: <span class="ruby-ivar">@sheetType</span> = <span class="ruby-identifier">type</span>
621
- 29: <span class="ruby-comment cmt"># The following settings must be provided by the deriving class.</span>
622
- 30: <span class="ruby-comment cmt"># This is a LogicalExpression string that controls what resources should</span>
623
- 31: <span class="ruby-comment cmt"># not be getting a report sheet template.</span>
624
- 32: <span class="ruby-ivar">@hideResource</span> = <span class="ruby-keyword kw">nil</span>
625
- 33: <span class="ruby-comment cmt"># This file contains the signature (date or interval) that the</span>
626
- 34: <span class="ruby-comment cmt"># SheetReceiver will accept as a valid signature.</span>
627
- 35: <span class="ruby-ivar">@signatureFile</span> = <span class="ruby-keyword kw">nil</span>
628
- 36: <span class="ruby-comment cmt"># The base directory of the sheet templates.</span>
629
- 37: <span class="ruby-ivar">@templateDir</span> = <span class="ruby-keyword kw">nil</span>
630
- 38: <span class="ruby-comment cmt"># When true, existing templates will be regenerated and send out again.</span>
631
- 39: <span class="ruby-comment cmt"># Otherwise the existing template will not be send out again.</span>
632
- 40: <span class="ruby-ivar">@force</span> = <span class="ruby-keyword kw">false</span>
633
- 41:
634
- 42: <span class="ruby-ivar">@signatureFilter</span> = <span class="ruby-keyword kw">nil</span>
635
- 43: <span class="ruby-ivar">@introText</span> = <span class="ruby-keyword kw">nil</span>
636
- 44:
637
- 45: <span class="ruby-comment cmt"># The end date of the reported interval.</span>
638
- 46: <span class="ruby-ivar">@date</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">new</span>.<span class="ruby-identifier">strftime</span>(<span class="ruby-value str">'%Y-%m-%d'</span>)
639
- 47: <span class="ruby-comment cmt"># Determines the length of the reported interval.</span>
640
- 48: <span class="ruby-ivar">@intervalDuration</span> = <span class="ruby-value str">'1w'</span>
641
- 49: <span class="ruby-comment cmt"># We need this to determine if we already sent out a report.</span>
642
- 50: <span class="ruby-ivar">@timeStamp</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">new</span>
643
- 51: <span class="ruby-keyword kw">end</span></pre>
636
+ <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 26</span>
637
+ 26: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">appName</span>, <span class="ruby-identifier">type</span>)
638
+ 27: <span class="ruby-keyword kw">super</span>(<span class="ruby-identifier">appName</span>)
639
+ 28:
640
+ 29: <span class="ruby-ivar">@sheetType</span> = <span class="ruby-identifier">type</span>
641
+ 30: <span class="ruby-comment cmt"># The following settings must be provided by the deriving class.</span>
642
+ 31: <span class="ruby-comment cmt"># This is a LogicalExpression string that controls what resources should</span>
643
+ 32: <span class="ruby-comment cmt"># not be getting a report sheet template.</span>
644
+ 33: <span class="ruby-ivar">@hideResource</span> = <span class="ruby-keyword kw">nil</span>
645
+ 34: <span class="ruby-comment cmt"># This file contains the signature (date or interval) that the</span>
646
+ 35: <span class="ruby-comment cmt"># SheetReceiver will accept as a valid signature.</span>
647
+ 36: <span class="ruby-ivar">@signatureFile</span> = <span class="ruby-keyword kw">nil</span>
648
+ 37: <span class="ruby-comment cmt"># The base directory of the sheet templates.</span>
649
+ 38: <span class="ruby-ivar">@templateDir</span> = <span class="ruby-keyword kw">nil</span>
650
+ 39: <span class="ruby-comment cmt"># When true, existing templates will be regenerated and send out again.</span>
651
+ 40: <span class="ruby-comment cmt"># Otherwise the existing template will not be send out again.</span>
652
+ 41: <span class="ruby-ivar">@force</span> = <span class="ruby-keyword kw">false</span>
653
+ 42:
654
+ 43: <span class="ruby-ivar">@signatureFilter</span> = <span class="ruby-keyword kw">nil</span>
655
+ 44: <span class="ruby-comment cmt"># The subject of the template email.</span>
656
+ 45: <span class="ruby-ivar">@mailSubject</span> = <span class="ruby-keyword kw">nil</span>
657
+ 46: <span class="ruby-comment cmt"># The into text of the template email.</span>
658
+ 47: <span class="ruby-ivar">@introText</span> = <span class="ruby-keyword kw">nil</span>
659
+ 48:
660
+ 49: <span class="ruby-comment cmt"># The end date of the reported interval.</span>
661
+ 50: <span class="ruby-ivar">@date</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">new</span>.<span class="ruby-identifier">strftime</span>(<span class="ruby-value str">'%Y-%m-%d'</span>)
662
+ 51: <span class="ruby-comment cmt"># Determines the length of the reported interval.</span>
663
+ 52: <span class="ruby-ivar">@intervalDuration</span> = <span class="ruby-value str">'1w'</span>
664
+ 53: <span class="ruby-comment cmt"># We need this to determine if we already sent out a report.</span>
665
+ 54: <span class="ruby-ivar">@timeStamp</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">new</span>
666
+ 55: <span class="ruby-keyword kw">end</span></pre>
644
667
  </div>
645
668
 
646
669
  </div>
@@ -658,7 +681,7 @@ A base class for sheet senders.
658
681
 
659
682
 
660
683
  <div id="send-emplates-method" class="method-detail ">
661
- <a name="M001458"></a>
684
+ <a name="method-i-sendTemplates"></a>
662
685
 
663
686
  <div class="method-heading">
664
687
 
@@ -682,15 +705,15 @@ and can be further limited with a list of resource IDs passed by
682
705
  <div class="method-source-code"
683
706
  id="send-emplates-source">
684
707
  <pre>
685
- <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 56</span>
686
- 56: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">sendTemplates</span>(<span class="ruby-identifier">resourceList</span>)
687
- 57: <span class="ruby-identifier">setWorkingDir</span>
688
- 58: <span class="ruby-identifier">createDirectories</span>
689
- 59:
690
- 60: <span class="ruby-identifier">resources</span> = <span class="ruby-identifier">genResourceList</span>(<span class="ruby-identifier">resourceList</span>)
691
- 61: <span class="ruby-identifier">genTemplates</span>(<span class="ruby-identifier">resources</span>)
692
- 62: <span class="ruby-identifier">sendReportTemplates</span>(<span class="ruby-identifier">resources</span>)
693
- 63: <span class="ruby-keyword kw">end</span></pre>
708
+ <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 60</span>
709
+ 60: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">sendTemplates</span>(<span class="ruby-identifier">resourceList</span>)
710
+ 61: <span class="ruby-identifier">setWorkingDir</span>
711
+ 62: <span class="ruby-identifier">createDirectories</span>
712
+ 63:
713
+ 64: <span class="ruby-identifier">resources</span> = <span class="ruby-identifier">genResourceList</span>(<span class="ruby-identifier">resourceList</span>)
714
+ 65: <span class="ruby-identifier">genTemplates</span>(<span class="ruby-identifier">resources</span>)
715
+ 66: <span class="ruby-identifier">sendReportTemplates</span>(<span class="ruby-identifier">resources</span>)
716
+ 67: <span class="ruby-keyword kw">end</span></pre>
694
717
  </div>
695
718
 
696
719
  </div>
@@ -708,7 +731,7 @@ and can be further limited with a list of resource IDs passed by
708
731
 
709
732
 
710
733
  <div id="create-irectories-method" class="method-detail ">
711
- <a name="M001459"></a>
734
+ <a name="method-i-createDirectories"></a>
712
735
 
713
736
  <div class="method-heading">
714
737
 
@@ -727,17 +750,17 @@ and can be further limited with a list of resource IDs passed by
727
750
  <div class="method-source-code"
728
751
  id="create-irectories-source">
729
752
  <pre>
730
- <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 67</span>
731
- 67: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">createDirectories</span>
732
- 68: <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">directory?</span>(<span class="ruby-ivar">@templateDir</span>)
733
- 69: <span class="ruby-identifier">warning</span>(<span class="ruby-node">&quot;Creating directory #{@templateDir}&quot;</span>)
734
- 70: <span class="ruby-constant">Dir</span>.<span class="ruby-identifier">mkdir</span>(<span class="ruby-ivar">@templateDir</span>)
735
- 71: <span class="ruby-keyword kw">end</span>
736
- 72: <span class="ruby-ivar">@templateDir</span> <span class="ruby-operator">+=</span> <span class="ruby-node">&quot;/#{@date}&quot;</span>
737
- 73: <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">directory?</span>(<span class="ruby-ivar">@templateDir</span>)
753
+ <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 71</span>
754
+ 71: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">createDirectories</span>
755
+ 72: <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">directory?</span>(<span class="ruby-ivar">@templateDir</span>)
756
+ 73: <span class="ruby-identifier">warning</span>(<span class="ruby-node">&quot;Creating directory #{@templateDir}&quot;</span>)
738
757
  74: <span class="ruby-constant">Dir</span>.<span class="ruby-identifier">mkdir</span>(<span class="ruby-ivar">@templateDir</span>)
739
758
  75: <span class="ruby-keyword kw">end</span>
740
- 76: <span class="ruby-keyword kw">end</span></pre>
759
+ 76: <span class="ruby-ivar">@templateDir</span> <span class="ruby-operator">+=</span> <span class="ruby-node">&quot;/#{@date}&quot;</span>
760
+ 77: <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">directory?</span>(<span class="ruby-ivar">@templateDir</span>)
761
+ 78: <span class="ruby-constant">Dir</span>.<span class="ruby-identifier">mkdir</span>(<span class="ruby-ivar">@templateDir</span>)
762
+ 79: <span class="ruby-keyword kw">end</span>
763
+ 80: <span class="ruby-keyword kw">end</span></pre>
741
764
  </div>
742
765
 
743
766
  </div>
@@ -749,7 +772,7 @@ and can be further limited with a list of resource IDs passed by
749
772
 
750
773
 
751
774
  <div id="enable-ignature-or-eporting-method" class="method-detail ">
752
- <a name="M001463"></a>
775
+ <a name="method-i-enableSignatureForReporting"></a>
753
776
 
754
777
  <div class="method-heading">
755
778
 
@@ -768,56 +791,56 @@ and can be further limited with a list of resource IDs passed by
768
791
  <div class="method-source-code"
769
792
  id="enable-ignature-or-eporting-source">
770
793
  <pre>
771
- <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 189</span>
772
- 189: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">enableSignatureForReporting</span>(<span class="ruby-identifier">templateFile</span>)
773
- 190: <span class="ruby-identifier">signature</span> = <span class="ruby-keyword kw">nil</span>
774
- 191: <span class="ruby-comment cmt"># That's a pretty bad hack to make reasonably certain that the tj3 server</span>
775
- 192: <span class="ruby-comment cmt"># process has put the complete file into the file system.</span>
776
- 193: <span class="ruby-identifier">i</span> = <span class="ruby-value">0</span>
777
- 194: <span class="ruby-keyword kw">begin</span>
778
- 195: <span class="ruby-keyword kw">if</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">exist?</span>(<span class="ruby-identifier">templateFile</span>)
779
- 196: <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-identifier">templateFile</span>, <span class="ruby-value str">'r'</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">file</span><span class="ruby-operator">|</span>
780
- 197: <span class="ruby-keyword kw">while</span> (<span class="ruby-identifier">line</span> = <span class="ruby-identifier">file</span>.<span class="ruby-identifier">gets</span>)
781
- 198: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">matches</span> = <span class="ruby-ivar">@signatureFilter</span>.<span class="ruby-identifier">match</span>(<span class="ruby-identifier">line</span>)
782
- 199: <span class="ruby-identifier">signature</span> = <span class="ruby-identifier">matches</span>[<span class="ruby-value">1</span>]
783
- 200: <span class="ruby-keyword kw">end</span>
784
- 201: <span class="ruby-keyword kw">end</span>
785
- 202: <span class="ruby-keyword kw">end</span>
786
- 203: <span class="ruby-keyword kw">end</span>
787
- 204: <span class="ruby-identifier">i</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
788
- 205: <span class="ruby-comment cmt"># If the file doesn't exist yet or the cannot yet be read, wait for</span>
789
- 206: <span class="ruby-comment cmt"># 300ms. We try this 100 times.</span>
790
- 207: <span class="ruby-identifier">sleep</span>(<span class="ruby-value">0.3</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">signature</span>
791
- 208: <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">signature</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">i</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">100</span>
792
- 209: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">signature</span>
793
- 210: <span class="ruby-identifier">error</span>(<span class="ruby-value str">&quot;enableSignatureForReporting: Cannot find signature in file &quot;</span> <span class="ruby-operator">+</span>
794
- 211: <span class="ruby-node">&quot;#{templateFile}&quot;</span>)
795
- 212: <span class="ruby-keyword kw">end</span>
796
- 213:
797
- 214: <span class="ruby-identifier">acceptedSignatures</span> = []
798
- 215: <span class="ruby-keyword kw">if</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">exist?</span>(<span class="ruby-ivar">@signatureFile</span>)
799
- 216: <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-ivar">@signatureFile</span>, <span class="ruby-value str">'r'</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">file</span><span class="ruby-operator">|</span>
800
- 217: <span class="ruby-identifier">acceptedSignatures</span> = <span class="ruby-identifier">file</span>.<span class="ruby-identifier">readlines</span>
801
- 218: <span class="ruby-keyword kw">end</span>
802
- 219: <span class="ruby-identifier">acceptedSignatures</span>.<span class="ruby-identifier">map!</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">s</span><span class="ruby-operator">|</span> <span class="ruby-identifier">s</span>.<span class="ruby-identifier">chomp</span> }
803
- 220: <span class="ruby-identifier">acceptedSignatures</span>.<span class="ruby-identifier">delete_if</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">s</span><span class="ruby-operator">|</span> <span class="ruby-identifier">s</span>.<span class="ruby-identifier">chomp</span>.<span class="ruby-identifier">empty?</span> }
804
- 221: <span class="ruby-keyword kw">else</span>
805
- 222: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;#{@signatureFile} does not exist yet.&quot;</span>)
806
- 223: <span class="ruby-keyword kw">end</span>
807
- 224: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">acceptedSignatures</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">signature</span>)
808
- 225: <span class="ruby-comment cmt"># Add the new signature</span>
809
- 226: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Adding #{signature} to #{@signatureFile}&quot;</span>)
810
- 227: <span class="ruby-identifier">acceptedSignatures</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">signature</span>
811
- 228: <span class="ruby-comment cmt"># And write back the adapted file.</span>
812
- 229: <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-ivar">@signatureFile</span>, <span class="ruby-value str">'w'</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">file</span><span class="ruby-operator">|</span>
813
- 230: <span class="ruby-identifier">acceptedSignatures</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">iv</span><span class="ruby-operator">|</span>
814
- 231: <span class="ruby-identifier">file</span>.<span class="ruby-identifier">write</span>(<span class="ruby-node">&quot;#{iv}\n&quot;</span>)
815
- 232: <span class="ruby-keyword kw">end</span>
816
- 233: <span class="ruby-keyword kw">end</span>
817
- 234: <span class="ruby-keyword kw">else</span>
818
- 235: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Signature #{signature} is already listed in #{@signatureFile}&quot;</span>)
819
- 236: <span class="ruby-keyword kw">end</span>
820
- 237: <span class="ruby-keyword kw">end</span></pre>
794
+ <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 193</span>
795
+ 193: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">enableSignatureForReporting</span>(<span class="ruby-identifier">templateFile</span>)
796
+ 194: <span class="ruby-identifier">signature</span> = <span class="ruby-keyword kw">nil</span>
797
+ 195: <span class="ruby-comment cmt"># That's a pretty bad hack to make reasonably certain that the tj3 server</span>
798
+ 196: <span class="ruby-comment cmt"># process has put the complete file into the file system.</span>
799
+ 197: <span class="ruby-identifier">i</span> = <span class="ruby-value">0</span>
800
+ 198: <span class="ruby-keyword kw">begin</span>
801
+ 199: <span class="ruby-keyword kw">if</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">exist?</span>(<span class="ruby-identifier">templateFile</span>)
802
+ 200: <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-identifier">templateFile</span>, <span class="ruby-value str">'r'</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">file</span><span class="ruby-operator">|</span>
803
+ 201: <span class="ruby-keyword kw">while</span> (<span class="ruby-identifier">line</span> = <span class="ruby-identifier">file</span>.<span class="ruby-identifier">gets</span>)
804
+ 202: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">matches</span> = <span class="ruby-ivar">@signatureFilter</span>.<span class="ruby-identifier">match</span>(<span class="ruby-identifier">line</span>)
805
+ 203: <span class="ruby-identifier">signature</span> = <span class="ruby-identifier">matches</span>[<span class="ruby-value">1</span>]
806
+ 204: <span class="ruby-keyword kw">end</span>
807
+ 205: <span class="ruby-keyword kw">end</span>
808
+ 206: <span class="ruby-keyword kw">end</span>
809
+ 207: <span class="ruby-keyword kw">end</span>
810
+ 208: <span class="ruby-identifier">i</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
811
+ 209: <span class="ruby-comment cmt"># If the file doesn't exist yet or the cannot yet be read, wait for</span>
812
+ 210: <span class="ruby-comment cmt"># 300ms. We try this 100 times.</span>
813
+ 211: <span class="ruby-identifier">sleep</span>(<span class="ruby-value">0.3</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">signature</span>
814
+ 212: <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">signature</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">i</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">100</span>
815
+ 213: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">signature</span>
816
+ 214: <span class="ruby-identifier">error</span>(<span class="ruby-value str">&quot;enableSignatureForReporting: Cannot find signature in file &quot;</span> <span class="ruby-operator">+</span>
817
+ 215: <span class="ruby-node">&quot;#{templateFile}&quot;</span>)
818
+ 216: <span class="ruby-keyword kw">end</span>
819
+ 217:
820
+ 218: <span class="ruby-identifier">acceptedSignatures</span> = []
821
+ 219: <span class="ruby-keyword kw">if</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">exist?</span>(<span class="ruby-ivar">@signatureFile</span>)
822
+ 220: <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-ivar">@signatureFile</span>, <span class="ruby-value str">'r'</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">file</span><span class="ruby-operator">|</span>
823
+ 221: <span class="ruby-identifier">acceptedSignatures</span> = <span class="ruby-identifier">file</span>.<span class="ruby-identifier">readlines</span>
824
+ 222: <span class="ruby-keyword kw">end</span>
825
+ 223: <span class="ruby-identifier">acceptedSignatures</span>.<span class="ruby-identifier">map!</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">s</span><span class="ruby-operator">|</span> <span class="ruby-identifier">s</span>.<span class="ruby-identifier">chomp</span> }
826
+ 224: <span class="ruby-identifier">acceptedSignatures</span>.<span class="ruby-identifier">delete_if</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">s</span><span class="ruby-operator">|</span> <span class="ruby-identifier">s</span>.<span class="ruby-identifier">chomp</span>.<span class="ruby-identifier">empty?</span> }
827
+ 225: <span class="ruby-keyword kw">else</span>
828
+ 226: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;#{@signatureFile} does not exist yet.&quot;</span>)
829
+ 227: <span class="ruby-keyword kw">end</span>
830
+ 228: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">acceptedSignatures</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">signature</span>)
831
+ 229: <span class="ruby-comment cmt"># Add the new signature</span>
832
+ 230: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Adding #{signature} to #{@signatureFile}&quot;</span>)
833
+ 231: <span class="ruby-identifier">acceptedSignatures</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">signature</span>
834
+ 232: <span class="ruby-comment cmt"># And write back the adapted file.</span>
835
+ 233: <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-ivar">@signatureFile</span>, <span class="ruby-value str">'w'</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">file</span><span class="ruby-operator">|</span>
836
+ 234: <span class="ruby-identifier">acceptedSignatures</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">iv</span><span class="ruby-operator">|</span>
837
+ 235: <span class="ruby-identifier">file</span>.<span class="ruby-identifier">write</span>(<span class="ruby-node">&quot;#{iv}\n&quot;</span>)
838
+ 236: <span class="ruby-keyword kw">end</span>
839
+ 237: <span class="ruby-keyword kw">end</span>
840
+ 238: <span class="ruby-keyword kw">else</span>
841
+ 239: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Signature #{signature} is already listed in #{@signatureFile}&quot;</span>)
842
+ 240: <span class="ruby-keyword kw">end</span>
843
+ 241: <span class="ruby-keyword kw">end</span></pre>
821
844
  </div>
822
845
 
823
846
  </div>
@@ -829,7 +852,7 @@ and can be further limited with a list of resource IDs passed by
829
852
 
830
853
 
831
854
  <div id="gen-esource-ist-method" class="method-detail ">
832
- <a name="M001460"></a>
855
+ <a name="method-i-genResourceList"></a>
833
856
 
834
857
  <div class="method-heading">
835
858
 
@@ -848,58 +871,59 @@ and can be further limited with a list of resource IDs passed by
848
871
  <div class="method-source-code"
849
872
  id="gen-esource-ist-source">
850
873
  <pre>
851
- <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 78</span>
852
- 78: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">genResourceList</span>(<span class="ruby-identifier">resourceList</span>)
853
- 79: <span class="ruby-identifier">list</span> = []
854
- 80: <span class="ruby-identifier">info</span>(<span class="ruby-value str">'Retrieving resource list...'</span>)
855
- 81: <span class="ruby-identifier">reportDef</span> = <span class="ruby-value str">resourcereport rl_21497214 '.' { formats csv columns id, name, email, effort, freework hideresource #{@hideResource} sortresources id.up loadunit days period %{#{@date} - 1w} +1w}</span>
856
- 82: <span class="ruby-identifier">report</span> = <span class="ruby-identifier">generateReport</span>(<span class="ruby-value str">'rl_21497214'</span>, <span class="ruby-identifier">reportDef</span>)
857
- 83: <span class="ruby-identifier">first</span> = <span class="ruby-keyword kw">true</span>
858
- 84: <span class="ruby-identifier">report</span>.<span class="ruby-identifier">each_line</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">line</span><span class="ruby-operator">|</span>
859
- 85: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">first</span>
860
- 86: <span class="ruby-identifier">first</span> = <span class="ruby-keyword kw">false</span>
861
- 87: <span class="ruby-keyword kw">next</span>
862
- 88: <span class="ruby-keyword kw">end</span>
863
- 89: <span class="ruby-identifier">id</span>, <span class="ruby-identifier">name</span>, <span class="ruby-identifier">email</span>, <span class="ruby-identifier">effort</span>, <span class="ruby-identifier">free</span> = <span class="ruby-identifier">line</span>.<span class="ruby-identifier">split</span>(<span class="ruby-value str">';'</span>)
864
- 90: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">email</span>.<span class="ruby-identifier">empty?</span>
865
- 91: <span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;Resource '#{id}' must have a valid email address&quot;</span>)
866
- 92: <span class="ruby-keyword kw">end</span>
867
- 93: <span class="ruby-comment cmt"># Convert effort and free values into Float objects.</span>
868
- 94: <span class="ruby-identifier">effort</span> = <span class="ruby-identifier">effort</span>.<span class="ruby-identifier">to_f</span>
869
- 95: <span class="ruby-identifier">free</span> = <span class="ruby-identifier">free</span>.<span class="ruby-identifier">to_f</span>
870
- 96:
871
- 97: <span class="ruby-comment cmt"># Ignore resources that are on vacation for the whole period.</span>
872
- 98: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">effort</span> <span class="ruby-operator">==</span> <span class="ruby-value">0.0</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">free</span> <span class="ruby-operator">==</span> <span class="ruby-value">0.0</span>
873
- 99: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Resource '#{id}' was on vacation the whole period&quot;</span>)
874
- 100: <span class="ruby-keyword kw">next</span>
875
- 101: <span class="ruby-keyword kw">end</span>
876
- 102:
877
- 103: <span class="ruby-identifier">list</span> <span class="ruby-operator">&lt;&lt;</span> [ <span class="ruby-identifier">id</span>, <span class="ruby-identifier">name</span>, <span class="ruby-identifier">email</span>, <span class="ruby-identifier">effort</span>, <span class="ruby-identifier">free</span> ]
878
- 104: <span class="ruby-keyword kw">end</span>
879
- 105:
880
- 106: <span class="ruby-comment cmt"># Save the resource list to a file. We'll need it in the receiver again.</span>
881
- 107: <span class="ruby-keyword kw">begin</span>
882
- 108: <span class="ruby-identifier">fileName</span> = <span class="ruby-ivar">@templateDir</span> <span class="ruby-operator">+</span> <span class="ruby-value str">'/resources.yml'</span>
883
- 109: <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-identifier">fileName</span>, <span class="ruby-value str">'w'</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">file</span><span class="ruby-operator">|</span>
884
- 110: <span class="ruby-constant">YAML</span>.<span class="ruby-identifier">dump</span>(<span class="ruby-identifier">list</span>, <span class="ruby-identifier">file</span>)
885
- 111: <span class="ruby-keyword kw">end</span>
886
- 112: <span class="ruby-keyword kw">rescue</span>
887
- 113: <span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;Saving of #{fileName} failed: #{$!}&quot;</span>)
888
- 114: <span class="ruby-keyword kw">end</span>
889
- 115:
890
- 116: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">resourceList</span>.<span class="ruby-identifier">empty?</span>
891
- 117: <span class="ruby-comment cmt"># When the user specified resource list is empty, we generate templates</span>
892
- 118: <span class="ruby-comment cmt"># for all users that don't match the @hideResource filter. Otherwise we</span>
893
- 119: <span class="ruby-comment cmt"># only generate templates for those in the list and that are not hidden</span>
894
- 120: <span class="ruby-comment cmt"># by the filter.</span>
895
- 121: <span class="ruby-identifier">list</span>.<span class="ruby-identifier">delete_if</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">item</span><span class="ruby-operator">|</span> <span class="ruby-operator">!</span><span class="ruby-identifier">resourceList</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">item</span>[<span class="ruby-value">0</span>]) }
896
- 122: <span class="ruby-keyword kw">end</span>
897
- 123:
898
- 124: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'genResourceList: list is empty'</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">list</span>.<span class="ruby-identifier">empty?</span>
899
- 125:
900
- 126: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;#{list.length} resources found&quot;</span>)
901
- 127: <span class="ruby-identifier">list</span>
902
- 128: <span class="ruby-keyword kw">end</span></pre>
874
+ <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 82</span>
875
+ 82: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">genResourceList</span>(<span class="ruby-identifier">resourceList</span>)
876
+ 83: <span class="ruby-identifier">list</span> = []
877
+ 84: <span class="ruby-identifier">info</span>(<span class="ruby-value str">'Retrieving resource list...'</span>)
878
+ 85: <span class="ruby-comment cmt"># Create a TJP report definition for a CSV report that contains the id,</span>
879
+ 86: <span class="ruby-comment cmt"># name, email, effort and free work for each resource that is not hidden</span>
880
+ 87: <span class="ruby-comment cmt"># by @hideResource.</span>
881
+ 88: <span class="ruby-identifier">reportDef</span> = <span class="ruby-value str">resourcereport rl_21497214 '.' { formats csv columns id, name, email, effort, freework hideresource #{@hideResource} sortresources id.up loadunit days period %{#{@date} - 1w} +1w}</span>
882
+ 89: <span class="ruby-identifier">report</span> = <span class="ruby-identifier">generateReport</span>(<span class="ruby-value str">'rl_21497214'</span>, <span class="ruby-identifier">reportDef</span>)
883
+ 90: <span class="ruby-comment cmt"># Parse the CSV report into an Array of Arrays</span>
884
+ 91: <span class="ruby-identifier">csv</span> = <span class="ruby-constant">CSVFile</span>.<span class="ruby-identifier">new</span>.<span class="ruby-identifier">parse</span>(<span class="ruby-identifier">report</span>)
885
+ 92:
886
+ 93: <span class="ruby-comment cmt"># Get rid of the column title line</span>
887
+ 94: <span class="ruby-identifier">csv</span>.<span class="ruby-identifier">delete_at</span>(<span class="ruby-value">0</span>)
888
+ 95:
889
+ 96: <span class="ruby-comment cmt"># Process the CSV report line by line</span>
890
+ 97: <span class="ruby-identifier">csv</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">id</span>, <span class="ruby-identifier">name</span>, <span class="ruby-identifier">email</span>, <span class="ruby-identifier">effort</span>, <span class="ruby-identifier">free</span><span class="ruby-operator">|</span>
891
+ 98: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">email</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">email</span>.<span class="ruby-identifier">empty?</span>
892
+ 99: <span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;Resource '#{id}' must have a valid email address&quot;</span>)
893
+ 100: <span class="ruby-keyword kw">end</span>
894
+ 101:
895
+ 102: <span class="ruby-comment cmt"># Ignore resources that are on vacation for the whole period.</span>
896
+ 103: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">effort</span> <span class="ruby-operator">==</span> <span class="ruby-value">0.0</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">free</span> <span class="ruby-operator">==</span> <span class="ruby-value">0.0</span>
897
+ 104: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Resource '#{id}' was on vacation the whole period&quot;</span>)
898
+ 105: <span class="ruby-keyword kw">next</span>
899
+ 106: <span class="ruby-keyword kw">end</span>
900
+ 107:
901
+ 108: <span class="ruby-identifier">list</span> <span class="ruby-operator">&lt;&lt;</span> [ <span class="ruby-identifier">id</span>, <span class="ruby-identifier">name</span>, <span class="ruby-identifier">email</span>, <span class="ruby-identifier">effort</span>, <span class="ruby-identifier">free</span> ]
902
+ 109: <span class="ruby-keyword kw">end</span>
903
+ 110:
904
+ 111: <span class="ruby-comment cmt"># Save the resource list to a file. We'll need it in the receiver again.</span>
905
+ 112: <span class="ruby-keyword kw">begin</span>
906
+ 113: <span class="ruby-identifier">fileName</span> = <span class="ruby-ivar">@templateDir</span> <span class="ruby-operator">+</span> <span class="ruby-value str">'/resources.yml'</span>
907
+ 114: <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-identifier">fileName</span>, <span class="ruby-value str">'w'</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">file</span><span class="ruby-operator">|</span>
908
+ 115: <span class="ruby-constant">YAML</span>.<span class="ruby-identifier">dump</span>(<span class="ruby-identifier">list</span>, <span class="ruby-identifier">file</span>)
909
+ 116: <span class="ruby-keyword kw">end</span>
910
+ 117: <span class="ruby-keyword kw">rescue</span>
911
+ 118: <span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;Saving of #{fileName} failed: #{$!}&quot;</span>)
912
+ 119: <span class="ruby-keyword kw">end</span>
913
+ 120:
914
+ 121: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">resourceList</span>.<span class="ruby-identifier">empty?</span>
915
+ 122: <span class="ruby-comment cmt"># When the user specified resource list is empty, we generate templates</span>
916
+ 123: <span class="ruby-comment cmt"># for all users that don't match the @hideResource filter. Otherwise we</span>
917
+ 124: <span class="ruby-comment cmt"># only generate templates for those in the list and that are not hidden</span>
918
+ 125: <span class="ruby-comment cmt"># by the filter.</span>
919
+ 126: <span class="ruby-identifier">list</span>.<span class="ruby-identifier">delete_if</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">item</span><span class="ruby-operator">|</span> <span class="ruby-operator">!</span><span class="ruby-identifier">resourceList</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">item</span>[<span class="ruby-value">0</span>]) }
920
+ 127: <span class="ruby-keyword kw">end</span>
921
+ 128:
922
+ 129: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'genResourceList: list is empty'</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">list</span>.<span class="ruby-identifier">empty?</span>
923
+ 130:
924
+ 131: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;#{list.length} resources found&quot;</span>)
925
+ 132: <span class="ruby-identifier">list</span>
926
+ 133: <span class="ruby-keyword kw">end</span></pre>
903
927
  </div>
904
928
 
905
929
  </div>
@@ -911,7 +935,7 @@ and can be further limited with a list of resource IDs passed by
911
935
 
912
936
 
913
937
  <div id="gen-emplates-method" class="method-detail ">
914
- <a name="M001461"></a>
938
+ <a name="method-i-genTemplates"></a>
915
939
 
916
940
  <div class="method-heading">
917
941
 
@@ -930,29 +954,29 @@ and can be further limited with a list of resource IDs passed by
930
954
  <div class="method-source-code"
931
955
  id="gen-emplates-source">
932
956
  <pre>
933
- <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 139</span>
934
- 139: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">genTemplates</span>(<span class="ruby-identifier">resources</span>)
935
- 140: <span class="ruby-identifier">firstTemplateFile</span> = <span class="ruby-keyword kw">nil</span>
936
- 141: <span class="ruby-identifier">resources</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resInfo</span><span class="ruby-operator">|</span>
937
- 142: <span class="ruby-identifier">res</span> = <span class="ruby-identifier">resInfo</span>[<span class="ruby-value">0</span>]
938
- 143: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Generating template for #{res}...&quot;</span>)
939
- 144: <span class="ruby-identifier">reportId</span> = <span class="ruby-node">&quot;sheet_template_#{res}&quot;</span>
940
- 145: <span class="ruby-identifier">templateFile</span> = <span class="ruby-node">&quot;#{@templateDir}/#{res}_#{@date}&quot;</span>
941
- 146: <span class="ruby-comment cmt"># We use the first template file to get the sheet interval.</span>
942
- 147: <span class="ruby-identifier">firstTemplateFile</span> = <span class="ruby-identifier">templateFile</span> <span class="ruby-operator">+</span> <span class="ruby-value str">'.tji'</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">firstTemplateFile</span>
943
- 148:
944
- 149: <span class="ruby-comment cmt"># Don't re-generate already existing templates unless we are in force</span>
945
- 150: <span class="ruby-comment cmt"># mode. We probably have sent them out earlier with a manual trigger.</span>
946
- 151: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@force</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">exist?</span>(<span class="ruby-identifier">templateFile</span> <span class="ruby-operator">+</span> <span class="ruby-value str">'.tji'</span>)
947
- 152: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Skipping already existing #{templateFile}.tji.&quot;</span>)
948
- 153: <span class="ruby-keyword kw">next</span>
949
- 154: <span class="ruby-keyword kw">end</span>
950
- 155:
951
- 156: <span class="ruby-identifier">reportDef</span> = <span class="ruby-value str">#{@sheetType}sheetreport #{reportId} \&quot;#{templateFile}\&quot; { hideresource ~(plan.id = \&quot;#{res}\&quot;) period %{#{@date} - #{@intervalDuration}} +#{@intervalDuration} sorttasks id.up}</span>
952
- 157: <span class="ruby-identifier">generateReport</span>(<span class="ruby-identifier">reportId</span>, <span class="ruby-identifier">reportDef</span>)
953
- 158: <span class="ruby-keyword kw">end</span>
954
- 159: <span class="ruby-identifier">enableSignatureForReporting</span>(<span class="ruby-identifier">firstTemplateFile</span>)
955
- 160: <span class="ruby-keyword kw">end</span></pre>
957
+ <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 144</span>
958
+ 144: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">genTemplates</span>(<span class="ruby-identifier">resources</span>)
959
+ 145: <span class="ruby-identifier">firstTemplateFile</span> = <span class="ruby-keyword kw">nil</span>
960
+ 146: <span class="ruby-identifier">resources</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resInfo</span><span class="ruby-operator">|</span>
961
+ 147: <span class="ruby-identifier">res</span> = <span class="ruby-identifier">resInfo</span>[<span class="ruby-value">0</span>]
962
+ 148: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Generating template for #{res}...&quot;</span>)
963
+ 149: <span class="ruby-identifier">reportId</span> = <span class="ruby-node">&quot;sheet_template_#{res}&quot;</span>
964
+ 150: <span class="ruby-identifier">templateFile</span> = <span class="ruby-node">&quot;#{@templateDir}/#{res}_#{@date}&quot;</span>
965
+ 151: <span class="ruby-comment cmt"># We use the first template file to get the sheet interval.</span>
966
+ 152: <span class="ruby-identifier">firstTemplateFile</span> = <span class="ruby-identifier">templateFile</span> <span class="ruby-operator">+</span> <span class="ruby-value str">'.tji'</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">firstTemplateFile</span>
967
+ 153:
968
+ 154: <span class="ruby-comment cmt"># Don't re-generate already existing templates unless we are in force</span>
969
+ 155: <span class="ruby-comment cmt"># mode. We probably have sent them out earlier with a manual trigger.</span>
970
+ 156: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@force</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">exist?</span>(<span class="ruby-identifier">templateFile</span> <span class="ruby-operator">+</span> <span class="ruby-value str">'.tji'</span>)
971
+ 157: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Skipping already existing #{templateFile}.tji.&quot;</span>)
972
+ 158: <span class="ruby-keyword kw">next</span>
973
+ 159: <span class="ruby-keyword kw">end</span>
974
+ 160:
975
+ 161: <span class="ruby-identifier">reportDef</span> = <span class="ruby-value str">#{@sheetType}sheetreport #{reportId} \&quot;#{templateFile}\&quot; { hideresource ~(plan.id = \&quot;#{res}\&quot;) period %{#{@date} - #{@intervalDuration}} +#{@intervalDuration} sorttasks id.up}</span>
976
+ 162: <span class="ruby-identifier">generateReport</span>(<span class="ruby-identifier">reportId</span>, <span class="ruby-identifier">reportDef</span>)
977
+ 163: <span class="ruby-keyword kw">end</span>
978
+ 164: <span class="ruby-identifier">enableSignatureForReporting</span>(<span class="ruby-identifier">firstTemplateFile</span>)
979
+ 165: <span class="ruby-keyword kw">end</span></pre>
956
980
  </div>
957
981
 
958
982
  </div>
@@ -964,7 +988,7 @@ and can be further limited with a list of resource IDs passed by
964
988
 
965
989
 
966
990
  <div id="generate-eport-method" class="method-detail ">
967
- <a name="M001464"></a>
991
+ <a name="method-i-generateReport"></a>
968
992
 
969
993
  <div class="method-heading">
970
994
 
@@ -983,28 +1007,28 @@ and can be further limited with a list of resource IDs passed by
983
1007
  <div class="method-source-code"
984
1008
  id="generate-eport-source">
985
1009
  <pre>
986
- <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 239</span>
987
- 239: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">generateReport</span>(<span class="ruby-identifier">id</span>, <span class="ruby-identifier">reportDef</span>)
988
- 240: <span class="ruby-identifier">out</span> = <span class="ruby-value str">''</span>
989
- 241: <span class="ruby-identifier">err</span> = <span class="ruby-value str">''</span>
990
- 242: <span class="ruby-keyword kw">begin</span>
991
- 243: <span class="ruby-identifier">command</span> = <span class="ruby-node">&quot;tj3client --silent report #{@projectId} #{id} = .&quot;</span>
992
- 244: <span class="ruby-identifier">status</span> = <span class="ruby-constant">Open4</span>.<span class="ruby-identifier">popen4</span>(<span class="ruby-identifier">command</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">pid</span>, <span class="ruby-identifier">stdin</span>, <span class="ruby-identifier">stdout</span>, <span class="ruby-identifier">stderr</span><span class="ruby-operator">|</span>
993
- 245: <span class="ruby-comment cmt"># Send the report definition to the tj3client process via stdin.</span>
994
- 246: <span class="ruby-identifier">stdin</span>.<span class="ruby-identifier">write</span>(<span class="ruby-identifier">reportDef</span>)
995
- 247: <span class="ruby-identifier">stdin</span>.<span class="ruby-identifier">close</span>
996
- 248: <span class="ruby-comment cmt"># Retrieve the output</span>
997
- 249: <span class="ruby-identifier">out</span> = <span class="ruby-identifier">stdout</span>.<span class="ruby-identifier">read</span>
998
- 250: <span class="ruby-identifier">err</span> = <span class="ruby-identifier">stderr</span>.<span class="ruby-identifier">read</span>
999
- 251: <span class="ruby-keyword kw">end</span>
1000
- 252: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">status</span>.<span class="ruby-identifier">exitstatus</span> <span class="ruby-operator">!=</span> <span class="ruby-value">0</span>
1001
- 253: <span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;generateReport: #{err}&quot;</span>)
1002
- 254: <span class="ruby-keyword kw">end</span>
1003
- 255: <span class="ruby-keyword kw">rescue</span>
1004
- 256: <span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;generateReport: Report generation failed: #{$!}&quot;</span>)
1005
- 257: <span class="ruby-keyword kw">end</span>
1006
- 258: <span class="ruby-identifier">out</span>
1007
- 259: <span class="ruby-keyword kw">end</span></pre>
1010
+ <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 243</span>
1011
+ 243: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">generateReport</span>(<span class="ruby-identifier">id</span>, <span class="ruby-identifier">reportDef</span>)
1012
+ 244: <span class="ruby-identifier">out</span> = <span class="ruby-value str">''</span>
1013
+ 245: <span class="ruby-identifier">err</span> = <span class="ruby-value str">''</span>
1014
+ 246: <span class="ruby-keyword kw">begin</span>
1015
+ 247: <span class="ruby-identifier">command</span> = <span class="ruby-node">&quot;tj3client --silent report #{@projectId} #{id} = .&quot;</span>
1016
+ 248: <span class="ruby-identifier">status</span> = <span class="ruby-constant">Open4</span>.<span class="ruby-identifier">popen4</span>(<span class="ruby-identifier">command</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">pid</span>, <span class="ruby-identifier">stdin</span>, <span class="ruby-identifier">stdout</span>, <span class="ruby-identifier">stderr</span><span class="ruby-operator">|</span>
1017
+ 249: <span class="ruby-comment cmt"># Send the report definition to the tj3client process via stdin.</span>
1018
+ 250: <span class="ruby-identifier">stdin</span>.<span class="ruby-identifier">write</span>(<span class="ruby-identifier">reportDef</span>)
1019
+ 251: <span class="ruby-identifier">stdin</span>.<span class="ruby-identifier">close</span>
1020
+ 252: <span class="ruby-comment cmt"># Retrieve the output</span>
1021
+ 253: <span class="ruby-identifier">out</span> = <span class="ruby-identifier">stdout</span>.<span class="ruby-identifier">read</span>
1022
+ 254: <span class="ruby-identifier">err</span> = <span class="ruby-identifier">stderr</span>.<span class="ruby-identifier">read</span>
1023
+ 255: <span class="ruby-keyword kw">end</span>
1024
+ 256: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">status</span>.<span class="ruby-identifier">exitstatus</span> <span class="ruby-operator">!=</span> <span class="ruby-value">0</span>
1025
+ 257: <span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;generateReport: #{err}&quot;</span>)
1026
+ 258: <span class="ruby-keyword kw">end</span>
1027
+ 259: <span class="ruby-keyword kw">rescue</span>
1028
+ 260: <span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;generateReport: Report generation failed: #{$!}&quot;</span>)
1029
+ 261: <span class="ruby-keyword kw">end</span>
1030
+ 262: <span class="ruby-identifier">out</span>
1031
+ 263: <span class="ruby-keyword kw">end</span></pre>
1008
1032
  </div>
1009
1033
 
1010
1034
  </div>
@@ -1016,7 +1040,7 @@ and can be further limited with a list of resource IDs passed by
1016
1040
 
1017
1041
 
1018
1042
  <div id="send-eport-emplates-method" class="method-detail ">
1019
- <a name="M001462"></a>
1043
+ <a name="method-i-sendReportTemplates"></a>
1020
1044
 
1021
1045
  <div class="method-heading">
1022
1046
 
@@ -1035,27 +1059,26 @@ and can be further limited with a list of resource IDs passed by
1035
1059
  <div class="method-source-code"
1036
1060
  id="send-eport-emplates-source">
1037
1061
  <pre>
1038
- <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 168</span>
1039
- 168: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">sendReportTemplates</span>(<span class="ruby-identifier">resources</span>)
1040
- 169: <span class="ruby-identifier">resources</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">id</span>, <span class="ruby-identifier">name</span>, <span class="ruby-identifier">email</span><span class="ruby-operator">|</span>
1041
- 170: <span class="ruby-identifier">attachment</span> = <span class="ruby-node">&quot;#{@templateDir}/#{id}_#{@date}.tji&quot;</span>
1042
- 171: <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">exist?</span>(<span class="ruby-identifier">attachment</span>)
1043
- 172: <span class="ruby-identifier">error</span>(<span class="ruby-value str">&quot;sendReportTemplates: &quot;</span> <span class="ruby-operator">+</span>
1044
- 173: <span class="ruby-node">&quot;#{@sheetType} sheet #{attachment} for #{name} not found&quot;</span>)
1045
- 174: <span class="ruby-keyword kw">end</span>
1046
- 175: <span class="ruby-comment cmt"># Don't send out old templates again. @timeStamp has a higher</span>
1047
- 176: <span class="ruby-comment cmt"># resolution. We add 1s to avoid truncation errors.</span>
1048
- 177: <span class="ruby-keyword kw">if</span> (<span class="ruby-constant">File</span>.<span class="ruby-identifier">mtime</span>(<span class="ruby-identifier">attachment</span>) <span class="ruby-operator">+</span> <span class="ruby-value">1</span>) <span class="ruby-operator">&lt;</span> <span class="ruby-ivar">@timeStamp</span>
1049
- 178: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Old template #{attachment} found. Not sending it out.&quot;</span>)
1050
- 179: <span class="ruby-keyword kw">next</span>
1051
- 180: <span class="ruby-keyword kw">end</span>
1052
- 181:
1053
- 182: <span class="ruby-identifier">message</span> = <span class="ruby-node">&quot; Hello #{name}!\n\n#{@introText}&quot;</span> <span class="ruby-operator">+</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">read</span>(<span class="ruby-identifier">attachment</span>)
1054
- 183:
1055
- 184: <span class="ruby-identifier">sendEmail</span>(<span class="ruby-identifier">email</span>, <span class="ruby-node">&quot;Your weekly report template for #{@date}&quot;</span>,
1056
- 185: <span class="ruby-identifier">message</span>, <span class="ruby-identifier">attachment</span>)
1057
- 186: <span class="ruby-keyword kw">end</span>
1058
- 187: <span class="ruby-keyword kw">end</span></pre>
1062
+ <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 173</span>
1063
+ 173: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">sendReportTemplates</span>(<span class="ruby-identifier">resources</span>)
1064
+ 174: <span class="ruby-identifier">resources</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">id</span>, <span class="ruby-identifier">name</span>, <span class="ruby-identifier">email</span><span class="ruby-operator">|</span>
1065
+ 175: <span class="ruby-identifier">attachment</span> = <span class="ruby-node">&quot;#{@templateDir}/#{id}_#{@date}.tji&quot;</span>
1066
+ 176: <span class="ruby-keyword kw">unless</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">exist?</span>(<span class="ruby-identifier">attachment</span>)
1067
+ 177: <span class="ruby-identifier">error</span>(<span class="ruby-value str">&quot;sendReportTemplates: &quot;</span> <span class="ruby-operator">+</span>
1068
+ 178: <span class="ruby-node">&quot;#{@sheetType} sheet #{attachment} for #{name} not found&quot;</span>)
1069
+ 179: <span class="ruby-keyword kw">end</span>
1070
+ 180: <span class="ruby-comment cmt"># Don't send out old templates again. @timeStamp has a higher</span>
1071
+ 181: <span class="ruby-comment cmt"># resolution. We add 1s to avoid truncation errors.</span>
1072
+ 182: <span class="ruby-keyword kw">if</span> (<span class="ruby-constant">File</span>.<span class="ruby-identifier">mtime</span>(<span class="ruby-identifier">attachment</span>) <span class="ruby-operator">+</span> <span class="ruby-value">1</span>) <span class="ruby-operator">&lt;</span> <span class="ruby-ivar">@timeStamp</span>
1073
+ 183: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Old template #{attachment} found. Not sending it out.&quot;</span>)
1074
+ 184: <span class="ruby-keyword kw">next</span>
1075
+ 185: <span class="ruby-keyword kw">end</span>
1076
+ 186:
1077
+ 187: <span class="ruby-identifier">message</span> = <span class="ruby-node">&quot; Hello #{name}!\n\n#{@introText}&quot;</span> <span class="ruby-operator">+</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">read</span>(<span class="ruby-identifier">attachment</span>)
1078
+ 188:
1079
+ 189: <span class="ruby-identifier">sendEmail</span>(<span class="ruby-identifier">email</span>, <span class="ruby-identifier">sprintf</span>(<span class="ruby-ivar">@mailSubject</span>, <span class="ruby-ivar">@date</span>), <span class="ruby-identifier">message</span>, <span class="ruby-identifier">attachment</span>)
1080
+ 190: <span class="ruby-keyword kw">end</span>
1081
+ 191: <span class="ruby-keyword kw">end</span></pre>
1059
1082
  </div>
1060
1083
 
1061
1084
  </div>