taskjuggler 0.0.8 → 0.0.9

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 (613) hide show
  1. data/CHANGELOG +1144 -2047
  2. data/README +1 -1
  3. data/Rakefile +6 -6
  4. data/data/css/tjmanual.css +20 -0
  5. data/data/css/tjreport.css +7 -6
  6. data/doc/AppConfig.html +136 -130
  7. data/doc/Arguments.html +46 -40
  8. data/doc/CHANGELOG.html +1162 -2057
  9. data/doc/COPYING.html +8 -2
  10. data/doc/Object.html +205 -199
  11. data/doc/README.html +9 -3
  12. data/doc/RuntimeConfig.html +75 -69
  13. data/doc/String.html +69 -63
  14. data/doc/TaskJuggler.html +350 -291
  15. data/doc/TaskJuggler/Account.html +26 -20
  16. data/doc/TaskJuggler/AccountAttribute.html +24 -18
  17. data/doc/TaskJuggler/AccountScenario.html +24 -18
  18. data/doc/TaskJuggler/Allocation.html +74 -68
  19. data/doc/TaskJuggler/AllocationAttribute.html +54 -48
  20. data/doc/TaskJuggler/AttributeBase.html +172 -93
  21. data/doc/TaskJuggler/AttributeDefinition.html +22 -16
  22. data/doc/TaskJuggler/AttributeOverwrite.html +586 -0
  23. data/doc/TaskJuggler/BatchProcessor.html +263 -257
  24. data/doc/TaskJuggler/Booking.html +44 -38
  25. data/doc/TaskJuggler/BookingListAttribute.html +25 -21
  26. data/doc/TaskJuggler/BooleanAttribute.html +24 -18
  27. data/doc/TaskJuggler/CSVFile.html +193 -187
  28. data/doc/TaskJuggler/CellSettingPattern.html +13 -7
  29. data/doc/TaskJuggler/CellSettingPatternList.html +25 -19
  30. data/doc/TaskJuggler/Charge.html +49 -43
  31. data/doc/TaskJuggler/ChargeListAttribute.html +21 -15
  32. data/doc/TaskJuggler/ChargeSet.html +94 -88
  33. data/doc/TaskJuggler/ChargeSetListAttribute.html +29 -25
  34. data/doc/TaskJuggler/CollisionDetector.html +142 -136
  35. data/doc/TaskJuggler/ColumnListAttribute.html +21 -17
  36. data/doc/TaskJuggler/ColumnTable.html +50 -44
  37. data/doc/TaskJuggler/Daemon.html +71 -50
  38. data/doc/TaskJuggler/DataCache.html +110 -58
  39. data/doc/TaskJuggler/DataCacheEntry.html +22 -16
  40. data/doc/TaskJuggler/DateAttribute.html +24 -18
  41. data/doc/TaskJuggler/DefinitionListAttribute.html +12 -6
  42. data/doc/TaskJuggler/DependencyListAttribute.html +29 -25
  43. data/doc/TaskJuggler/DurationAttribute.html +25 -19
  44. data/doc/TaskJuggler/FileList.html +25 -19
  45. data/doc/TaskJuggler/FileRecord.html +17 -11
  46. data/doc/TaskJuggler/FixnumAttribute.html +16 -10
  47. data/doc/TaskJuggler/FlagListAttribute.html +25 -21
  48. data/doc/TaskJuggler/FloatAttribute.html +20 -14
  49. data/doc/TaskJuggler/FormatListAttribute.html +17 -11
  50. data/doc/TaskJuggler/GanttChart.html +242 -236
  51. data/doc/TaskJuggler/GanttContainer.html +71 -67
  52. data/doc/TaskJuggler/GanttHeader.html +113 -107
  53. data/doc/TaskJuggler/GanttHeaderScaleItem.html +26 -20
  54. data/doc/TaskJuggler/GanttLine.html +217 -210
  55. data/doc/TaskJuggler/GanttLoadStack.html +89 -83
  56. data/doc/TaskJuggler/GanttMilestone.html +11 -6
  57. data/doc/TaskJuggler/GanttRouter.html +194 -186
  58. data/doc/TaskJuggler/GanttTaskBar.html +41 -34
  59. data/doc/TaskJuggler/HTMLDocument.html +52 -46
  60. data/doc/TaskJuggler/HTMLGraphics.html +58 -52
  61. data/doc/TaskJuggler/Interval.html +90 -84
  62. data/doc/TaskJuggler/IntervalList.html +777 -0
  63. data/doc/TaskJuggler/IntervalListAttribute.html +29 -25
  64. data/doc/TaskJuggler/JobInfo.html +36 -30
  65. data/doc/TaskJuggler/Journal.html +188 -177
  66. data/doc/TaskJuggler/JournalEntry.html +36 -30
  67. data/doc/TaskJuggler/JournalEntryList.html +88 -82
  68. data/doc/TaskJuggler/KeywordArray.html +12 -6
  69. data/doc/TaskJuggler/KeywordDocumentation.html +512 -503
  70. data/doc/TaskJuggler/Limits.html +111 -105
  71. data/doc/TaskJuggler/Limits/Limit.html +71 -65
  72. data/doc/TaskJuggler/LimitsAttribute.html +21 -15
  73. data/doc/TaskJuggler/ListAttributeBase.html +16 -10
  74. data/doc/TaskJuggler/Log.html +111 -105
  75. data/doc/TaskJuggler/LogFile.html +54 -48
  76. data/doc/TaskJuggler/LogicalAttribute.html +35 -29
  77. data/doc/TaskJuggler/LogicalExpression.html +32 -26
  78. data/doc/TaskJuggler/LogicalExpressionAttribute.html +16 -10
  79. data/doc/TaskJuggler/LogicalExpressionListAttribute.html +671 -0
  80. data/doc/TaskJuggler/LogicalFlag.html +24 -18
  81. data/doc/TaskJuggler/LogicalFunction.html +164 -158
  82. data/doc/TaskJuggler/LogicalOperation.html +138 -132
  83. data/doc/TaskJuggler/Macro.html +14 -8
  84. data/doc/TaskJuggler/MacroTable.html +42 -36
  85. data/doc/TaskJuggler/ManagerResponsibilities.html +19 -13
  86. data/doc/TaskJuggler/ManagerStatusRecord.html +23 -17
  87. data/doc/TaskJuggler/Message.html +56 -50
  88. data/doc/TaskJuggler/MessageHandler.html +73 -67
  89. data/doc/TaskJuggler/Navigator.html +92 -86
  90. data/doc/TaskJuggler/NavigatorElement.html +88 -82
  91. data/doc/TaskJuggler/NikuProject.html +15 -9
  92. data/doc/TaskJuggler/NikuReport.html +405 -370
  93. data/doc/TaskJuggler/NikuResource.html +13 -7
  94. data/doc/TaskJuggler/NodeListAttribute.html +13 -9
  95. data/doc/TaskJuggler/PlaceHolderCell.html +22 -16
  96. data/doc/TaskJuggler/ProcessIntercom.html +116 -110
  97. data/doc/TaskJuggler/ProcessIntercomIface.html +39 -33
  98. data/doc/TaskJuggler/Project.html +1064 -895
  99. data/doc/TaskJuggler/ProjectBroker.html +439 -366
  100. data/doc/TaskJuggler/ProjectBrokerIface.html +63 -53
  101. data/doc/TaskJuggler/ProjectFileParser.html +329 -319
  102. data/doc/TaskJuggler/ProjectFileScanner.html +351 -345
  103. data/doc/TaskJuggler/ProjectRecord.html +66 -60
  104. data/doc/TaskJuggler/ProjectServer.html +287 -280
  105. data/doc/TaskJuggler/ProjectServerIface.html +43 -37
  106. data/doc/TaskJuggler/PropertyAttribute.html +16 -10
  107. data/doc/TaskJuggler/PropertyList.html +205 -199
  108. data/doc/TaskJuggler/PropertySet.html +264 -296
  109. data/doc/TaskJuggler/PropertyTreeNode.html +455 -505
  110. data/doc/TaskJuggler/Query.html +309 -524
  111. data/doc/TaskJuggler/RTFHandlers.html +17 -11
  112. data/doc/TaskJuggler/RTFNavigator.html +33 -27
  113. data/doc/TaskJuggler/RTFQuery.html +135 -129
  114. data/doc/TaskJuggler/RTFReport.html +63 -57
  115. data/doc/TaskJuggler/RTFReportLink.html +55 -49
  116. data/doc/TaskJuggler/RTFWithQuerySupport.html +17 -11
  117. data/doc/TaskJuggler/RealFormat.html +64 -58
  118. data/doc/TaskJuggler/RealFormatAttribute.html +12 -6
  119. data/doc/TaskJuggler/ReferenceAttribute.html +35 -29
  120. data/doc/TaskJuggler/Report.html +294 -249
  121. data/doc/TaskJuggler/ReportBase.html +229 -223
  122. data/doc/TaskJuggler/ReportContext.html +52 -46
  123. data/doc/TaskJuggler/ReportServer.html +143 -137
  124. data/doc/TaskJuggler/ReportServerIface.html +51 -43
  125. data/doc/TaskJuggler/ReportServerRecord.html +36 -30
  126. data/doc/TaskJuggler/ReportServlet.html +167 -140
  127. data/doc/TaskJuggler/ReportTable.html +137 -131
  128. data/doc/TaskJuggler/ReportTableCell.html +332 -292
  129. data/doc/TaskJuggler/ReportTableColumn.html +46 -40
  130. data/doc/TaskJuggler/ReportTableLegend.html +43 -38
  131. data/doc/TaskJuggler/ReportTableLine.html +66 -60
  132. data/doc/TaskJuggler/Resource.html +166 -160
  133. data/doc/TaskJuggler/ResourceListAttribute.html +54 -32
  134. data/doc/TaskJuggler/ResourceListRE.html +47 -41
  135. data/doc/TaskJuggler/ResourceScenario.html +671 -644
  136. data/doc/TaskJuggler/RichText.html +51 -45
  137. data/doc/TaskJuggler/RichTextAttribute.html +28 -22
  138. data/doc/TaskJuggler/RichTextDocument.html +96 -90
  139. data/doc/TaskJuggler/RichTextElement.html +503 -497
  140. data/doc/TaskJuggler/RichTextFunctionExample.html +41 -35
  141. data/doc/TaskJuggler/RichTextFunctionHandler.html +19 -13
  142. data/doc/TaskJuggler/RichTextImage.html +14 -8
  143. data/doc/TaskJuggler/RichTextIntermediate.html +86 -80
  144. data/doc/TaskJuggler/RichTextParser.html +59 -53
  145. data/doc/TaskJuggler/RichTextScanner.html +184 -178
  146. data/doc/TaskJuggler/RichTextSnip.html +69 -63
  147. data/doc/TaskJuggler/RichTextSyntaxRules.html +416 -410
  148. data/doc/TaskJuggler/Scenario.html +13 -7
  149. data/doc/TaskJuggler/ScenarioData.html +40 -34
  150. data/doc/TaskJuggler/ScenarioListAttribute.html +21 -15
  151. data/doc/TaskJuggler/Scoreboard.html +129 -107
  152. data/doc/TaskJuggler/SheetHandlerBase.html +245 -239
  153. data/doc/TaskJuggler/SheetReceiver.html +333 -327
  154. data/doc/TaskJuggler/SheetSender.html +227 -221
  155. data/doc/TaskJuggler/Shift.html +26 -20
  156. data/doc/TaskJuggler/ShiftAssignment.html +45 -39
  157. data/doc/TaskJuggler/ShiftAssignments.html +178 -172
  158. data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +21 -15
  159. data/doc/TaskJuggler/ShiftScenario.html +29 -23
  160. data/doc/TaskJuggler/SimpleQueryExpander.html +36 -30
  161. data/doc/TaskJuggler/SortListAttribute.html +17 -13
  162. data/doc/TaskJuggler/SourceFileInfo.html +19 -13
  163. data/doc/TaskJuggler/StatusSheetReceiver.html +31 -25
  164. data/doc/TaskJuggler/StatusSheetReport.html +166 -159
  165. data/doc/TaskJuggler/StatusSheetSender.html +80 -74
  166. data/doc/TaskJuggler/StringAttribute.html +20 -14
  167. data/doc/TaskJuggler/SymbolAttribute.html +16 -10
  168. data/doc/TaskJuggler/SyntaxReference.html +231 -225
  169. data/doc/TaskJuggler/TOCEntry.html +46 -40
  170. data/doc/TaskJuggler/TSResourceRecord.html +15 -9
  171. data/doc/TaskJuggler/TSTaskRecord.html +16 -10
  172. data/doc/TaskJuggler/TableColumnDefinition.html +84 -39
  173. data/doc/TaskJuggler/TableOfContents.html +28 -22
  174. data/doc/TaskJuggler/TableReport.html +906 -866
  175. data/doc/TaskJuggler/Task.html +99 -93
  176. data/doc/TaskJuggler/TaskDependency.html +24 -18
  177. data/doc/TaskJuggler/TaskListAttribute.html +29 -25
  178. data/doc/TaskJuggler/TaskListRE.html +46 -39
  179. data/doc/TaskJuggler/TaskScenario.html +2218 -1965
  180. data/doc/TaskJuggler/TextFormatter.html +154 -148
  181. data/doc/TaskJuggler/TextParser.html +362 -348
  182. data/doc/TaskJuggler/TextParser/Pattern.html +313 -307
  183. data/doc/TaskJuggler/TextParser/Rule.html +147 -141
  184. data/doc/TaskJuggler/TextParser/StackElement.html +58 -52
  185. data/doc/TaskJuggler/TextParser/State.html +88 -82
  186. data/doc/TaskJuggler/TextParser/StateTransition.html +42 -36
  187. data/doc/TaskJuggler/TextParser/TextParserResultArray.html +20 -14
  188. data/doc/TaskJuggler/TextParser/TokenDoc.html +19 -13
  189. data/doc/TaskJuggler/TextReport.html +80 -74
  190. data/doc/TaskJuggler/TextScanner.html +284 -272
  191. data/doc/TaskJuggler/TextScanner/BufferStreamHandle.html +14 -8
  192. data/doc/TaskJuggler/TextScanner/FileStreamHandle.html +21 -15
  193. data/doc/TaskJuggler/TextScanner/MacroStackEntry.html +15 -9
  194. data/doc/TaskJuggler/TextScanner/StreamHandle.html +102 -96
  195. data/doc/TaskJuggler/TimeSheet.html +123 -117
  196. data/doc/TaskJuggler/TimeSheetReceiver.html +28 -22
  197. data/doc/TaskJuggler/TimeSheetRecord.html +212 -206
  198. data/doc/TaskJuggler/TimeSheetReport.html +206 -199
  199. data/doc/TaskJuggler/TimeSheetSender.html +27 -21
  200. data/doc/TaskJuggler/TimeSheetSummary.html +140 -134
  201. data/doc/TaskJuggler/TimeSheets.html +20 -14
  202. data/doc/TaskJuggler/Tj3AppBase.html +100 -94
  203. data/doc/TaskJuggler/Tj3Client.html +407 -483
  204. data/doc/TaskJuggler/Tj3Daemon.html +116 -107
  205. data/doc/TaskJuggler/Tj3SheetAppBase.html +45 -39
  206. data/doc/TaskJuggler/Tj3SsReceiver.html +31 -25
  207. data/doc/TaskJuggler/Tj3SsSender.html +64 -58
  208. data/doc/TaskJuggler/Tj3TsReceiver.html +31 -25
  209. data/doc/TaskJuggler/Tj3TsSender.html +51 -45
  210. data/doc/TaskJuggler/Tj3TsSummary.html +59 -53
  211. data/doc/TaskJuggler/TjException.html +13 -7
  212. data/doc/TaskJuggler/TjTime.html +444 -438
  213. data/doc/TaskJuggler/TjpExample.html +84 -78
  214. data/doc/TaskJuggler/TjpExportRE.html +356 -349
  215. data/doc/TaskJuggler/TjpSyntaxRules.html +4279 -4151
  216. data/doc/TaskJuggler/URLParameter.html +16 -10
  217. data/doc/TaskJuggler/UserManual.html +185 -179
  218. data/doc/TaskJuggler/VimSyntax.html +144 -138
  219. data/doc/TaskJuggler/WebServer.html +46 -39
  220. data/doc/TaskJuggler/WelcomePage.html +769 -0
  221. data/doc/TaskJuggler/WorkingHours.html +185 -179
  222. data/doc/TaskJuggler/WorkingHoursAttribute.html +42 -36
  223. data/doc/TaskJuggler/XMLBlob.html +21 -15
  224. data/doc/TaskJuggler/XMLComment.html +17 -11
  225. data/doc/TaskJuggler/XMLDocument.html +33 -27
  226. data/doc/TaskJuggler/XMLElement.html +97 -91
  227. data/doc/TaskJuggler/XMLNamedText.html +13 -7
  228. data/doc/TaskJuggler/XMLText.html +32 -26
  229. data/doc/index.html +601 -563
  230. data/doc/lib/AccountScenario_rb.html +5 -3
  231. data/doc/lib/Account_rb.html +5 -3
  232. data/doc/lib/Allocation_rb.html +5 -3
  233. data/doc/lib/AppConfig_rb.html +5 -3
  234. data/doc/lib/AttributeBase_rb.html +5 -3
  235. data/doc/lib/AttributeDefinition_rb.html +5 -3
  236. data/doc/lib/Attributes_rb.html +5 -3
  237. data/doc/lib/BatchProcessor_rb.html +5 -3
  238. data/doc/lib/Booking_rb.html +5 -3
  239. data/doc/lib/ChargeSet_rb.html +5 -3
  240. data/doc/lib/Charge_rb.html +5 -3
  241. data/doc/lib/DataCache_rb.html +5 -3
  242. data/doc/lib/FileList_rb.html +5 -3
  243. data/doc/lib/HTMLDocument_rb.html +5 -3
  244. data/doc/lib/IntervalList_rb.html +69 -0
  245. data/doc/lib/Interval_rb.html +5 -3
  246. data/doc/lib/Journal_rb.html +5 -3
  247. data/doc/lib/KeywordArray_rb.html +5 -3
  248. data/doc/lib/KeywordDocumentation_rb.html +5 -3
  249. data/doc/lib/Limits_rb.html +5 -3
  250. data/doc/lib/LogFile_rb.html +5 -3
  251. data/doc/lib/Log_rb.html +5 -3
  252. data/doc/lib/LogicalExpression_rb.html +5 -3
  253. data/doc/lib/LogicalFunction_rb.html +5 -3
  254. data/doc/lib/LogicalOperation_rb.html +5 -3
  255. data/doc/lib/MacroTable_rb.html +5 -3
  256. data/doc/lib/MessageHandler_rb.html +5 -3
  257. data/doc/lib/ProjectFileParser_rb.html +5 -3
  258. data/doc/lib/ProjectFileScanner_rb.html +5 -3
  259. data/doc/lib/Project_rb.html +5 -3
  260. data/doc/lib/PropertyList_rb.html +5 -3
  261. data/doc/lib/PropertySet_rb.html +5 -3
  262. data/doc/lib/PropertyTreeNode_rb.html +5 -3
  263. data/doc/lib/Query_rb.html +5 -3
  264. data/doc/lib/RTFHandlers_rb.html +5 -3
  265. data/doc/lib/RTFNavigator_rb.html +5 -3
  266. data/doc/lib/RTFQuery_rb.html +5 -3
  267. data/doc/lib/RTFReportLink_rb.html +5 -3
  268. data/doc/lib/RTFReport_rb.html +5 -3
  269. data/doc/lib/RTFWithQuerySupport_rb.html +5 -3
  270. data/doc/lib/RealFormat_rb.html +5 -3
  271. data/doc/lib/ResourceScenario_rb.html +5 -3
  272. data/doc/lib/Resource_rb.html +5 -3
  273. data/doc/lib/RichTextDocument_rb.html +5 -3
  274. data/doc/lib/RichTextElement_rb.html +5 -3
  275. data/doc/lib/RichTextFunctionExample_rb.html +5 -3
  276. data/doc/lib/RichTextFunctionHandler_rb.html +5 -3
  277. data/doc/lib/RichTextParser_rb.html +5 -3
  278. data/doc/lib/RichTextScanner_rb.html +5 -3
  279. data/doc/lib/RichTextSnip_rb.html +5 -3
  280. data/doc/lib/RichTextSyntaxRules_rb.html +5 -3
  281. data/doc/lib/RichText_rb.html +5 -3
  282. data/doc/lib/RuntimeConfig_rb.html +5 -3
  283. data/doc/lib/ScenarioData_rb.html +5 -3
  284. data/doc/lib/Scenario_rb.html +5 -3
  285. data/doc/lib/Scoreboard_rb.html +7 -3
  286. data/doc/lib/SheetHandlerBase_rb.html +5 -3
  287. data/doc/lib/SheetReceiver_rb.html +5 -3
  288. data/doc/lib/SheetSender_rb.html +5 -3
  289. data/doc/lib/ShiftAssignments_rb.html +5 -3
  290. data/doc/lib/ShiftScenario_rb.html +5 -3
  291. data/doc/lib/Shift_rb.html +5 -3
  292. data/doc/lib/SimpleQueryExpander_rb.html +5 -3
  293. data/doc/lib/SourceFileInfo_rb.html +5 -3
  294. data/doc/lib/StatusSheetReceiver_rb.html +5 -3
  295. data/doc/lib/StatusSheetSender_rb.html +5 -3
  296. data/doc/lib/SyntaxReference_rb.html +5 -3
  297. data/doc/lib/TOCEntry_rb.html +5 -3
  298. data/doc/lib/TableColumnDefinition_rb.html +5 -3
  299. data/doc/lib/TableOfContents_rb.html +5 -3
  300. data/doc/lib/TaskDependency_rb.html +5 -3
  301. data/doc/lib/TaskJuggler_rb.html +5 -3
  302. data/doc/lib/TaskScenario_rb.html +5 -3
  303. data/doc/lib/Task_rb.html +5 -3
  304. data/doc/lib/TextFormatter_rb.html +6 -4
  305. data/doc/lib/TextParser/Pattern_rb.html +5 -3
  306. data/doc/lib/TextParser/Rule_rb.html +5 -3
  307. data/doc/lib/TextParser/StackElement_rb.html +5 -3
  308. data/doc/lib/TextParser/State_rb.html +6 -4
  309. data/doc/lib/TextParser/TokenDoc_rb.html +5 -3
  310. data/doc/lib/TextParser_rb.html +5 -3
  311. data/doc/lib/TextScanner_rb.html +5 -3
  312. data/doc/lib/TimeSheetReceiver_rb.html +5 -3
  313. data/doc/lib/TimeSheetSender_rb.html +5 -3
  314. data/doc/lib/TimeSheetSummary_rb.html +6 -4
  315. data/doc/lib/TimeSheets_rb.html +5 -3
  316. data/doc/lib/Tj3AppBase_rb.html +5 -3
  317. data/doc/lib/Tj3Config_rb.html +5 -3
  318. data/doc/lib/Tj3SheetAppBase_rb.html +5 -3
  319. data/doc/lib/TjException_rb.html +5 -3
  320. data/doc/lib/TjTime_rb.html +5 -3
  321. data/doc/lib/TjpExample_rb.html +5 -3
  322. data/doc/lib/TjpSyntaxRules_rb.html +5 -3
  323. data/doc/lib/URLParameter_rb.html +5 -3
  324. data/doc/lib/UTF8String_rb.html +5 -3
  325. data/doc/lib/UserManual_rb.html +5 -3
  326. data/doc/lib/VimSyntax_rb.html +6 -4
  327. data/doc/lib/WorkingHours_rb.html +5 -3
  328. data/doc/lib/XMLDocument_rb.html +5 -3
  329. data/doc/lib/XMLElement_rb.html +5 -3
  330. data/doc/lib/daemon/Daemon_rb.html +5 -3
  331. data/doc/lib/daemon/ProcessIntercom_rb.html +7 -3
  332. data/doc/lib/daemon/ProjectBroker_rb.html +5 -3
  333. data/doc/lib/daemon/ProjectServer_rb.html +5 -3
  334. data/doc/lib/daemon/ReportServer_rb.html +5 -3
  335. data/doc/lib/daemon/ReportServlet_rb.html +69 -0
  336. data/doc/lib/daemon/WebServer_rb.html +9 -3
  337. data/doc/lib/daemon/WelcomePage_rb.html +71 -0
  338. data/doc/lib/deep_copy_rb.html +5 -3
  339. data/doc/lib/reports/CSVFile_rb.html +5 -3
  340. data/doc/lib/reports/CollisionDetector_rb.html +5 -3
  341. data/doc/lib/reports/ColumnTable_rb.html +5 -3
  342. data/doc/lib/reports/GanttChart_rb.html +5 -3
  343. data/doc/lib/reports/GanttContainer_rb.html +5 -3
  344. data/doc/lib/reports/GanttHeaderScaleItem_rb.html +5 -3
  345. data/doc/lib/reports/GanttHeader_rb.html +5 -3
  346. data/doc/lib/reports/GanttLine_rb.html +5 -3
  347. data/doc/lib/reports/GanttLoadStack_rb.html +5 -3
  348. data/doc/lib/reports/GanttMilestone_rb.html +5 -3
  349. data/doc/lib/reports/GanttRouter_rb.html +5 -3
  350. data/doc/lib/reports/GanttTaskBar_rb.html +5 -3
  351. data/doc/lib/reports/HTMLGraphics_rb.html +5 -3
  352. data/doc/lib/reports/Navigator_rb.html +5 -3
  353. data/doc/lib/reports/NikuReport_rb.html +5 -3
  354. data/doc/lib/reports/ReportBase_rb.html +5 -3
  355. data/doc/lib/reports/ReportContext_rb.html +5 -3
  356. data/doc/lib/reports/ReportTableCell_rb.html +5 -3
  357. data/doc/lib/reports/ReportTableColumn_rb.html +5 -3
  358. data/doc/lib/reports/ReportTableLegend_rb.html +5 -3
  359. data/doc/lib/reports/ReportTableLine_rb.html +5 -3
  360. data/doc/lib/reports/ReportTable_rb.html +5 -3
  361. data/doc/lib/reports/Report_rb.html +5 -3
  362. data/doc/lib/reports/ResourceListRE_rb.html +5 -3
  363. data/doc/lib/reports/StatusSheetReport_rb.html +5 -3
  364. data/doc/lib/reports/TableReport_rb.html +5 -3
  365. data/doc/lib/reports/TaskListRE_rb.html +5 -3
  366. data/doc/lib/reports/TextReport_rb.html +5 -3
  367. data/doc/lib/reports/TimeSheetReport_rb.html +5 -3
  368. data/doc/lib/reports/TjpExportRE_rb.html +5 -3
  369. data/doc/lib/{taskjuggler3_rb.html → tj3_rb.html} +7 -5
  370. data/doc/lib/tj3client_rb.html +5 -3
  371. data/doc/lib/tj3d_rb.html +6 -4
  372. data/doc/lib/tj3man_rb.html +5 -3
  373. data/doc/lib/tj3ss_receiver_rb.html +5 -3
  374. data/doc/lib/tj3ss_sender_rb.html +5 -3
  375. data/doc/lib/tj3ts_receiver_rb.html +5 -3
  376. data/doc/lib/tj3ts_sender_rb.html +5 -3
  377. data/doc/lib/tj3ts_summary_rb.html +5 -3
  378. data/examples/tutorial.tjp +13 -5
  379. data/gem_spec.rb +3 -0
  380. data/lib/Account.rb +2 -1
  381. data/lib/AccountScenario.rb +2 -1
  382. data/lib/Allocation.rb +2 -1
  383. data/lib/AppConfig.rb +2 -1
  384. data/lib/AttributeBase.rb +19 -5
  385. data/lib/AttributeDefinition.rb +2 -1
  386. data/lib/Attributes.rb +49 -38
  387. data/lib/BatchProcessor.rb +2 -1
  388. data/lib/Booking.rb +2 -1
  389. data/lib/Charge.rb +2 -1
  390. data/lib/ChargeSet.rb +2 -1
  391. data/lib/DataCache.rb +15 -1
  392. data/lib/FileList.rb +2 -1
  393. data/lib/HTMLDocument.rb +2 -1
  394. data/lib/Interval.rb +2 -1
  395. data/lib/IntervalList.rb +100 -0
  396. data/lib/Journal.rb +8 -2
  397. data/lib/KeywordArray.rb +2 -1
  398. data/lib/KeywordDocumentation.rb +10 -6
  399. data/lib/Limits.rb +2 -1
  400. data/lib/Log.rb +3 -2
  401. data/lib/LogFile.rb +2 -1
  402. data/lib/LogicalExpression.rb +2 -1
  403. data/lib/LogicalFunction.rb +2 -1
  404. data/lib/LogicalOperation.rb +2 -1
  405. data/lib/MacroTable.rb +2 -1
  406. data/lib/MessageHandler.rb +2 -1
  407. data/lib/Project.rb +92 -25
  408. data/lib/ProjectFileParser.rb +7 -2
  409. data/lib/ProjectFileScanner.rb +2 -1
  410. data/lib/PropertyList.rb +2 -1
  411. data/lib/PropertySet.rb +2 -6
  412. data/lib/PropertyTreeNode.rb +22 -44
  413. data/lib/Query.rb +32 -13
  414. data/lib/RTFHandlers.rb +2 -1
  415. data/lib/RTFNavigator.rb +2 -1
  416. data/lib/RTFQuery.rb +3 -2
  417. data/lib/RTFReport.rb +2 -1
  418. data/lib/RTFReportLink.rb +2 -1
  419. data/lib/RTFWithQuerySupport.rb +2 -1
  420. data/lib/RealFormat.rb +2 -1
  421. data/lib/Resource.rb +2 -1
  422. data/lib/ResourceScenario.rb +35 -14
  423. data/lib/RichText.rb +2 -1
  424. data/lib/RichTextDocument.rb +2 -1
  425. data/lib/RichTextElement.rb +2 -1
  426. data/lib/RichTextFunctionExample.rb +2 -1
  427. data/lib/RichTextFunctionHandler.rb +2 -1
  428. data/lib/RichTextParser.rb +2 -1
  429. data/lib/RichTextScanner.rb +2 -1
  430. data/lib/RichTextSnip.rb +2 -1
  431. data/lib/RichTextSyntaxRules.rb +2 -1
  432. data/lib/RuntimeConfig.rb +2 -1
  433. data/lib/Scenario.rb +2 -1
  434. data/lib/ScenarioData.rb +2 -1
  435. data/lib/Scoreboard.rb +27 -8
  436. data/lib/SheetHandlerBase.rb +2 -1
  437. data/lib/SheetReceiver.rb +2 -1
  438. data/lib/SheetSender.rb +2 -1
  439. data/lib/Shift.rb +2 -1
  440. data/lib/ShiftAssignments.rb +2 -1
  441. data/lib/ShiftScenario.rb +2 -1
  442. data/lib/SimpleQueryExpander.rb +2 -1
  443. data/lib/SourceFileInfo.rb +2 -1
  444. data/lib/StatusSheetReceiver.rb +2 -1
  445. data/lib/StatusSheetSender.rb +2 -1
  446. data/lib/SyntaxReference.rb +2 -1
  447. data/lib/TOCEntry.rb +2 -1
  448. data/lib/TableColumnDefinition.rb +9 -2
  449. data/lib/TableOfContents.rb +2 -1
  450. data/lib/Task.rb +2 -1
  451. data/lib/TaskDependency.rb +2 -1
  452. data/lib/TaskJuggler.rb +8 -6
  453. data/lib/TaskScenario.rb +337 -153
  454. data/lib/TextFormatter.rb +3 -2
  455. data/lib/TextParser.rb +7 -2
  456. data/lib/TextParser/Pattern.rb +2 -1
  457. data/lib/TextParser/Rule.rb +2 -1
  458. data/lib/TextParser/StackElement.rb +2 -1
  459. data/lib/TextParser/State.rb +3 -2
  460. data/lib/TextParser/TokenDoc.rb +2 -1
  461. data/lib/TextScanner.rb +12 -5
  462. data/lib/TimeSheetReceiver.rb +2 -1
  463. data/lib/TimeSheetSender.rb +2 -1
  464. data/lib/TimeSheetSummary.rb +3 -2
  465. data/lib/TimeSheets.rb +2 -1
  466. data/lib/Tj3AppBase.rb +6 -5
  467. data/lib/Tj3Config.rb +5 -4
  468. data/lib/Tj3SheetAppBase.rb +2 -1
  469. data/lib/TjException.rb +2 -1
  470. data/lib/TjTime.rb +2 -1
  471. data/lib/TjpExample.rb +2 -1
  472. data/lib/TjpSyntaxRules.rb +264 -65
  473. data/lib/URLParameter.rb +2 -1
  474. data/lib/UTF8String.rb +2 -1
  475. data/lib/UserManual.rb +2 -1
  476. data/lib/VimSyntax.rb +3 -2
  477. data/lib/WorkingHours.rb +2 -1
  478. data/lib/XMLDocument.rb +2 -1
  479. data/lib/XMLElement.rb +2 -1
  480. data/lib/daemon/Daemon.rb +3 -1
  481. data/lib/daemon/ProcessIntercom.rb +3 -1
  482. data/lib/daemon/ProjectBroker.rb +84 -32
  483. data/lib/daemon/ProjectServer.rb +5 -3
  484. data/lib/daemon/ReportServer.rb +8 -5
  485. data/lib/daemon/ReportServlet.rb +166 -0
  486. data/lib/daemon/WebServer.rb +6 -150
  487. data/lib/daemon/WelcomePage.rb +80 -0
  488. data/lib/deep_copy.rb +2 -1
  489. data/lib/reports/CSVFile.rb +2 -1
  490. data/lib/reports/CollisionDetector.rb +2 -1
  491. data/lib/reports/ColumnTable.rb +2 -1
  492. data/lib/reports/GanttChart.rb +2 -1
  493. data/lib/reports/GanttContainer.rb +3 -4
  494. data/lib/reports/GanttHeader.rb +2 -1
  495. data/lib/reports/GanttHeaderScaleItem.rb +2 -1
  496. data/lib/reports/GanttLine.rb +12 -10
  497. data/lib/reports/GanttLoadStack.rb +2 -1
  498. data/lib/reports/GanttMilestone.rb +3 -3
  499. data/lib/reports/GanttRouter.rb +4 -1
  500. data/lib/reports/GanttTaskBar.rb +9 -7
  501. data/lib/reports/HTMLGraphics.rb +2 -1
  502. data/lib/reports/Navigator.rb +2 -1
  503. data/lib/reports/NikuReport.rb +79 -49
  504. data/lib/reports/Report.rb +42 -10
  505. data/lib/reports/ReportBase.rb +2 -1
  506. data/lib/reports/ReportContext.rb +2 -1
  507. data/lib/reports/ReportTable.rb +2 -1
  508. data/lib/reports/ReportTableCell.rb +63 -28
  509. data/lib/reports/ReportTableColumn.rb +2 -1
  510. data/lib/reports/ReportTableLegend.rb +5 -5
  511. data/lib/reports/ReportTableLine.rb +2 -1
  512. data/lib/reports/ResourceListRE.rb +2 -1
  513. data/lib/reports/StatusSheetReport.rb +4 -2
  514. data/lib/reports/TableReport.rb +42 -38
  515. data/lib/reports/TaskListRE.rb +4 -2
  516. data/lib/reports/TextReport.rb +2 -1
  517. data/lib/reports/TimeSheetReport.rb +4 -2
  518. data/lib/reports/TjpExportRE.rb +4 -2
  519. data/lib/{taskjuggler3.rb → tj3.rb} +6 -5
  520. data/lib/tj3client.rb +19 -36
  521. data/lib/tj3d.rb +6 -2
  522. data/lib/tj3man.rb +4 -3
  523. data/lib/tj3ss_receiver.rb +2 -1
  524. data/lib/tj3ss_sender.rb +2 -1
  525. data/lib/tj3ts_receiver.rb +2 -1
  526. data/lib/tj3ts_sender.rb +2 -1
  527. data/lib/tj3ts_summary.rb +2 -1
  528. data/manual/Day_To_Day_Juggling +36 -0
  529. data/manual/How_To_Contribute +9 -4
  530. data/manual/Installation +10 -3
  531. data/manual/TaskJuggler_Internals +0 -2
  532. data/manual/Tutorial +25 -3
  533. data/prj_cfg.rb +4 -2
  534. data/spec/IntervalList_spec.rb +138 -0
  535. data/spec/ProjectBroker_spec.rb +133 -0
  536. data/tasks/changelog.rake +41 -24
  537. data/tasks/csts.rake +1 -0
  538. data/tasks/gem.rake +1 -0
  539. data/tasks/rcov.rake +1 -1
  540. data/tasks/spec.rake +7 -0
  541. data/tasks/test.rake +1 -0
  542. data/test/MessageChecker.rb +2 -1
  543. data/test/TestSuite/CSV-Reports/niku.tjp +70 -0
  544. data/test/TestSuite/CSV-Reports/{celltext-Reference.csv → refs/celltext.csv} +0 -0
  545. data/test/TestSuite/CSV-Reports/refs/niku.csv +5 -0
  546. data/test/TestSuite/CSV-Reports/{resourcereport-Reference.csv → refs/resourcereport.csv} +0 -0
  547. data/test/TestSuite/CSV-Reports/{resourcereport_with_tasks-Reference.csv → refs/resourcereport_with_tasks.csv} +0 -0
  548. data/test/TestSuite/CSV-Reports/{sortByTree-Reference.csv → refs/sortByTree.csv} +0 -0
  549. data/test/TestSuite/CSV-Reports/{sortBy_duration.down-Reference.csv → refs/sortBy_duration.down.csv} +0 -0
  550. data/test/TestSuite/CSV-Reports/{sortBy_effort.up-Reference.csv → refs/sortBy_effort.up.csv} +0 -0
  551. data/test/TestSuite/CSV-Reports/{sortBy_plan.start.down-Reference.csv → refs/sortBy_plan.start.down.csv} +0 -0
  552. data/test/TestSuite/CSV-Reports/{taskreport-Reference.csv → refs/taskreport.csv} +0 -0
  553. data/test/TestSuite/CSV-Reports/{taskreport_with_resources-Reference.csv → refs/taskreport_with_resources.csv} +0 -0
  554. data/test/TestSuite/CSV-Reports/{weekly-Reference.csv → refs/weekly.csv} +0 -0
  555. data/test/TestSuite/HTML-Reports/Alerts.tjp +12 -0
  556. data/test/TestSuite/Scheduler/Correct/Allocate.tjp +2 -2
  557. data/test/TestSuite/Scheduler/Correct/Container-2.tjp +1 -2
  558. data/test/TestSuite/Scheduler/Correct/InheritedAttributes.tjp +77 -0
  559. data/test/TestSuite/Scheduler/Correct/WeakDeps.tjp +40 -0
  560. data/test/TestSuite/Scheduler/Errors/loop_detected_12.tjp +2 -2
  561. data/test/TestSuite/Scheduler/Errors/loop_detected_13.tjp +3 -4
  562. data/test/TestSuite/Scheduler/Errors/loop_detected_3.tjp +2 -2
  563. data/test/TestSuite/Scheduler/Errors/loop_detected_6.tjp +8 -7
  564. data/test/TestSuite/Scheduler/Errors/onend_wrong_direction.tjp +19 -0
  565. data/test/TestSuite/Scheduler/Errors/onstart_wrong_direction.tjp +18 -0
  566. data/test/TestSuite/Scheduler/Errors/task_depend_multi.tjp +1 -2
  567. data/test/TestSuite/StatusSheets/StatusSheetTemplates/2002-03-02/boss_2002-03-02.tji +46 -0
  568. data/test/TestSuite/StatusSheets/StatusSheetTemplates/2002-03-02/dev2_2002-03-02.tji +22 -0
  569. data/test/TestSuite/StatusSheets/StatusSheetTemplates/2002-03-02/resources.yml +11 -0
  570. data/test/TestSuite/StatusSheets/StatusSheetTemplates/acceptable_intervals +1 -0
  571. data/test/TestSuite/StatusSheets/sender.log +256 -0
  572. data/test/TestSuite/StatusSheets/statussheets.log +9 -0
  573. data/test/TestSuite/StatusSheets/tj3d.log +395 -0
  574. data/test/TestSuite/Syntax/Correct/Limits-1.tjp +2 -0
  575. data/test/TestSuite/Syntax/Correct/Niku.tjp +6 -1
  576. data/test/TestSuite/Syntax/Correct/Scenario.tjp +4 -1
  577. data/test/TestSuite/Syntax/Correct/Supplement.tjp +12 -5
  578. data/test/TestSuite/Syntax/Correct/TaskPrefix.tji +3 -0
  579. data/test/TestSuite/Syntax/Correct/TaskPrefix.tjp +24 -0
  580. data/test/TestSuite/Syntax/Correct/css/tjreport.css +7 -2
  581. data/test/TestSuite/Syntax/Correct/tutorial.tjp +15 -5
  582. data/test/all.rb +2 -4
  583. data/test/test_BatchProcessor.rb +2 -1
  584. data/test/test_CSV-Reports.rb +34 -23
  585. data/test/test_CSVFile.rb +2 -1
  586. data/test/test_CollisionDetector.rb +3 -2
  587. data/test/test_Journal.rb +2 -1
  588. data/test/test_Limits.rb +2 -1
  589. data/test/test_LogicalExpression.rb +2 -1
  590. data/test/test_MacroTable.rb +2 -1
  591. data/test/test_Project.rb +3 -2
  592. data/test/test_ProjectFileScanner.rb +2 -1
  593. data/test/test_PropertySet.rb +2 -1
  594. data/test/test_Query.rb +2 -1
  595. data/test/test_RealFormat.rb +2 -1
  596. data/test/test_ReportGenerator.rb +2 -1
  597. data/test/test_RichText.rb +2 -1
  598. data/test/test_Scheduler.rb +2 -1
  599. data/test/test_ShiftAssignments.rb +2 -1
  600. data/test/test_SimpleQueryExpander.rb +2 -1
  601. data/test/test_Syntax.rb +2 -1
  602. data/test/test_TextFormatter.rb +3 -2
  603. data/test/test_TjTime.rb +2 -1
  604. data/test/test_TjpExample.rb +2 -1
  605. data/test/test_URLParameter.rb +2 -1
  606. data/test/test_UTF8String.rb +2 -1
  607. data/test/test_WorkingHours.rb +2 -1
  608. data/test/test_deep_copy.rb +2 -1
  609. metadata +74 -20
  610. data/doc/StringIO.html +0 -595
  611. data/test/TestSuite/Scheduler/Errors/loop_detected_7.tjp +0 -46
  612. data/test/TestSuite/Scheduler/Errors/loop_detected_8.tjp +0 -51
  613. data/test/TestSuite/Scheduler/Errors/multiple_durations.tjp +0 -11
@@ -141,6 +141,8 @@
141
141
 
142
142
  <li><a href="../TaskJuggler/AttributeDefinition.html">TaskJuggler::AttributeDefinition</a></li>
143
143
 
144
+ <li><a href="../TaskJuggler/AttributeOverwrite.html">TaskJuggler::AttributeOverwrite</a></li>
145
+
144
146
  <li><a href="../TaskJuggler/BatchProcessor.html">TaskJuggler::BatchProcessor</a></li>
145
147
 
146
148
  <li><a href="../TaskJuggler/Booking.html">TaskJuggler::Booking</a></li>
@@ -219,6 +221,8 @@
219
221
 
220
222
  <li><a href="../TaskJuggler/Interval.html">TaskJuggler::Interval</a></li>
221
223
 
224
+ <li><a href="../TaskJuggler/IntervalList.html">TaskJuggler::IntervalList</a></li>
225
+
222
226
  <li><a href="../TaskJuggler/IntervalListAttribute.html">TaskJuggler::IntervalListAttribute</a></li>
223
227
 
224
228
  <li><a href="../TaskJuggler/JobInfo.html">TaskJuggler::JobInfo</a></li>
@@ -251,6 +255,8 @@
251
255
 
252
256
  <li><a href="../TaskJuggler/LogicalExpressionAttribute.html">TaskJuggler::LogicalExpressionAttribute</a></li>
253
257
 
258
+ <li><a href="../TaskJuggler/LogicalExpressionListAttribute.html">TaskJuggler::LogicalExpressionListAttribute</a></li>
259
+
254
260
  <li><a href="../TaskJuggler/LogicalFlag.html">TaskJuggler::LogicalFlag</a></li>
255
261
 
256
262
  <li><a href="../TaskJuggler/LogicalFunction.html">TaskJuggler::LogicalFunction</a></li>
@@ -531,6 +537,8 @@
531
537
 
532
538
  <li><a href="../TaskJuggler/WebServer.html">TaskJuggler::WebServer</a></li>
533
539
 
540
+ <li><a href="../TaskJuggler/WelcomePage.html">TaskJuggler::WelcomePage</a></li>
541
+
534
542
  <li><a href="../TaskJuggler/WorkingHours.html">TaskJuggler::WorkingHours</a></li>
535
543
 
536
544
  <li><a href="../TaskJuggler/WorkingHoursAttribute.html">TaskJuggler::WorkingHoursAttribute</a></li>
@@ -557,8 +565,6 @@
557
565
 
558
566
  <li><a href="../String.html">String</a></li>
559
567
 
560
- <li><a href="../StringIO.html">StringIO</a></li>
561
-
562
568
  </ul>
563
569
  <div id="no-class-search-results" style="display: none;">No matching classes.</div>
564
570
  </div>
@@ -649,37 +655,37 @@ A base class for sheet senders.
649
655
  <div class="method-source-code"
650
656
  id="new-source">
651
657
  <pre>
652
- <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 26</span>
653
- 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>)
654
- 27: <span class="ruby-keyword kw">super</span>(<span class="ruby-identifier">appName</span>)
655
- 28:
656
- 29: <span class="ruby-ivar">@sheetType</span> = <span class="ruby-identifier">type</span>
657
- 30: <span class="ruby-comment cmt"># The following settings must be provided by the deriving class.</span>
658
- 31: <span class="ruby-comment cmt"># This is a LogicalExpression string that controls what resources should</span>
659
- 32: <span class="ruby-comment cmt"># not be getting a report sheet template.</span>
660
- 33: <span class="ruby-ivar">@hideResource</span> = <span class="ruby-keyword kw">nil</span>
661
- 34: <span class="ruby-comment cmt"># This file contains the signature (date or interval) that the</span>
662
- 35: <span class="ruby-comment cmt"># SheetReceiver will accept as a valid signature.</span>
663
- 36: <span class="ruby-ivar">@signatureFile</span> = <span class="ruby-keyword kw">nil</span>
664
- 37: <span class="ruby-comment cmt"># The base directory of the sheet templates.</span>
665
- 38: <span class="ruby-ivar">@templateDir</span> = <span class="ruby-keyword kw">nil</span>
666
- 39: <span class="ruby-comment cmt"># When true, existing templates will be regenerated and send out again.</span>
667
- 40: <span class="ruby-comment cmt"># Otherwise the existing template will not be send out again.</span>
668
- 41: <span class="ruby-ivar">@force</span> = <span class="ruby-keyword kw">false</span>
669
- 42:
670
- 43: <span class="ruby-ivar">@signatureFilter</span> = <span class="ruby-keyword kw">nil</span>
671
- 44: <span class="ruby-comment cmt"># The subject of the template email.</span>
672
- 45: <span class="ruby-ivar">@mailSubject</span> = <span class="ruby-keyword kw">nil</span>
673
- 46: <span class="ruby-comment cmt"># The into text of the template email.</span>
674
- 47: <span class="ruby-ivar">@introText</span> = <span class="ruby-keyword kw">nil</span>
675
- 48:
676
- 49: <span class="ruby-comment cmt"># The end date of the reported interval.</span>
677
- 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>)
678
- 51: <span class="ruby-comment cmt"># Determines the length of the reported interval.</span>
679
- 52: <span class="ruby-ivar">@intervalDuration</span> = <span class="ruby-value str">'1w'</span>
680
- 53: <span class="ruby-comment cmt"># We need this to determine if we already sent out a report.</span>
681
- 54: <span class="ruby-ivar">@timeStamp</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">new</span>
682
- 55: <span class="ruby-keyword kw">end</span></pre>
658
+ <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 27</span>
659
+ 27: <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>)
660
+ 28: <span class="ruby-keyword kw">super</span>(<span class="ruby-identifier">appName</span>)
661
+ 29:
662
+ 30: <span class="ruby-ivar">@sheetType</span> = <span class="ruby-identifier">type</span>
663
+ 31: <span class="ruby-comment cmt"># The following settings must be provided by the deriving class.</span>
664
+ 32: <span class="ruby-comment cmt"># This is a LogicalExpression string that controls what resources should</span>
665
+ 33: <span class="ruby-comment cmt"># not be getting a report sheet template.</span>
666
+ 34: <span class="ruby-ivar">@hideResource</span> = <span class="ruby-keyword kw">nil</span>
667
+ 35: <span class="ruby-comment cmt"># This file contains the signature (date or interval) that the</span>
668
+ 36: <span class="ruby-comment cmt"># SheetReceiver will accept as a valid signature.</span>
669
+ 37: <span class="ruby-ivar">@signatureFile</span> = <span class="ruby-keyword kw">nil</span>
670
+ 38: <span class="ruby-comment cmt"># The base directory of the sheet templates.</span>
671
+ 39: <span class="ruby-ivar">@templateDir</span> = <span class="ruby-keyword kw">nil</span>
672
+ 40: <span class="ruby-comment cmt"># When true, existing templates will be regenerated and send out again.</span>
673
+ 41: <span class="ruby-comment cmt"># Otherwise the existing template will not be send out again.</span>
674
+ 42: <span class="ruby-ivar">@force</span> = <span class="ruby-keyword kw">false</span>
675
+ 43:
676
+ 44: <span class="ruby-ivar">@signatureFilter</span> = <span class="ruby-keyword kw">nil</span>
677
+ 45: <span class="ruby-comment cmt"># The subject of the template email.</span>
678
+ 46: <span class="ruby-ivar">@mailSubject</span> = <span class="ruby-keyword kw">nil</span>
679
+ 47: <span class="ruby-comment cmt"># The into text of the template email.</span>
680
+ 48: <span class="ruby-ivar">@introText</span> = <span class="ruby-keyword kw">nil</span>
681
+ 49:
682
+ 50: <span class="ruby-comment cmt"># The end date of the reported interval.</span>
683
+ 51: <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>)
684
+ 52: <span class="ruby-comment cmt"># Determines the length of the reported interval.</span>
685
+ 53: <span class="ruby-ivar">@intervalDuration</span> = <span class="ruby-value str">'1w'</span>
686
+ 54: <span class="ruby-comment cmt"># We need this to determine if we already sent out a report.</span>
687
+ 55: <span class="ruby-ivar">@timeStamp</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">new</span>
688
+ 56: <span class="ruby-keyword kw">end</span></pre>
683
689
  </div>
684
690
 
685
691
  </div>
@@ -721,15 +727,15 @@ and can be further limited with a list of resource IDs passed by
721
727
  <div class="method-source-code"
722
728
  id="send-emplates-source">
723
729
  <pre>
724
- <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 60</span>
725
- 60: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">sendTemplates</span>(<span class="ruby-identifier">resourceList</span>)
726
- 61: <span class="ruby-identifier">setWorkingDir</span>
727
- 62: <span class="ruby-identifier">createDirectories</span>
728
- 63:
729
- 64: <span class="ruby-identifier">resources</span> = <span class="ruby-identifier">genResourceList</span>(<span class="ruby-identifier">resourceList</span>)
730
- 65: <span class="ruby-identifier">genTemplates</span>(<span class="ruby-identifier">resources</span>)
731
- 66: <span class="ruby-identifier">sendReportTemplates</span>(<span class="ruby-identifier">resources</span>)
732
- 67: <span class="ruby-keyword kw">end</span></pre>
730
+ <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 61</span>
731
+ 61: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">sendTemplates</span>(<span class="ruby-identifier">resourceList</span>)
732
+ 62: <span class="ruby-identifier">setWorkingDir</span>
733
+ 63: <span class="ruby-identifier">createDirectories</span>
734
+ 64:
735
+ 65: <span class="ruby-identifier">resources</span> = <span class="ruby-identifier">genResourceList</span>(<span class="ruby-identifier">resourceList</span>)
736
+ 66: <span class="ruby-identifier">genTemplates</span>(<span class="ruby-identifier">resources</span>)
737
+ 67: <span class="ruby-identifier">sendReportTemplates</span>(<span class="ruby-identifier">resources</span>)
738
+ 68: <span class="ruby-keyword kw">end</span></pre>
733
739
  </div>
734
740
 
735
741
  </div>
@@ -766,17 +772,17 @@ and can be further limited with a list of resource IDs passed by
766
772
  <div class="method-source-code"
767
773
  id="create-irectories-source">
768
774
  <pre>
769
- <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 71</span>
770
- 71: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">createDirectories</span>
771
- 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>)
772
- 73: <span class="ruby-identifier">warning</span>(<span class="ruby-node">&quot;Creating directory #{@templateDir}&quot;</span>)
773
- 74: <span class="ruby-constant">Dir</span>.<span class="ruby-identifier">mkdir</span>(<span class="ruby-ivar">@templateDir</span>)
774
- 75: <span class="ruby-keyword kw">end</span>
775
- 76: <span class="ruby-ivar">@templateDir</span> <span class="ruby-operator">+=</span> <span class="ruby-node">&quot;/#{@date}&quot;</span>
776
- 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>)
777
- 78: <span class="ruby-constant">Dir</span>.<span class="ruby-identifier">mkdir</span>(<span class="ruby-ivar">@templateDir</span>)
778
- 79: <span class="ruby-keyword kw">end</span>
779
- 80: <span class="ruby-keyword kw">end</span></pre>
775
+ <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 72</span>
776
+ 72: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">createDirectories</span>
777
+ 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>)
778
+ 74: <span class="ruby-identifier">warning</span>(<span class="ruby-node">&quot;Creating directory #{@templateDir}&quot;</span>)
779
+ 75: <span class="ruby-constant">Dir</span>.<span class="ruby-identifier">mkdir</span>(<span class="ruby-ivar">@templateDir</span>)
780
+ 76: <span class="ruby-keyword kw">end</span>
781
+ 77: <span class="ruby-ivar">@templateDir</span> <span class="ruby-operator">+=</span> <span class="ruby-node">&quot;/#{@date}&quot;</span>
782
+ 78: <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>)
783
+ 79: <span class="ruby-constant">Dir</span>.<span class="ruby-identifier">mkdir</span>(<span class="ruby-ivar">@templateDir</span>)
784
+ 80: <span class="ruby-keyword kw">end</span>
785
+ 81: <span class="ruby-keyword kw">end</span></pre>
780
786
  </div>
781
787
 
782
788
  </div>
@@ -807,56 +813,56 @@ and can be further limited with a list of resource IDs passed by
807
813
  <div class="method-source-code"
808
814
  id="enable-ignature-or-eporting-source">
809
815
  <pre>
810
- <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 193</span>
811
- 193: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">enableSignatureForReporting</span>(<span class="ruby-identifier">templateFile</span>)
812
- 194: <span class="ruby-identifier">signature</span> = <span class="ruby-keyword kw">nil</span>
813
- 195: <span class="ruby-comment cmt"># That's a pretty bad hack to make reasonably certain that the tj3 server</span>
814
- 196: <span class="ruby-comment cmt"># process has put the complete file into the file system.</span>
815
- 197: <span class="ruby-identifier">i</span> = <span class="ruby-value">0</span>
816
- 198: <span class="ruby-keyword kw">begin</span>
817
- 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>)
818
- 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>
819
- 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>)
820
- 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>)
821
- 203: <span class="ruby-identifier">signature</span> = <span class="ruby-identifier">matches</span>[<span class="ruby-value">1</span>]
822
- 204: <span class="ruby-keyword kw">end</span>
823
- 205: <span class="ruby-keyword kw">end</span>
824
- 206: <span class="ruby-keyword kw">end</span>
825
- 207: <span class="ruby-keyword kw">end</span>
826
- 208: <span class="ruby-identifier">i</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
827
- 209: <span class="ruby-comment cmt"># If the file doesn't exist yet or the cannot yet be read, wait for</span>
828
- 210: <span class="ruby-comment cmt"># 300ms. We try this 100 times.</span>
829
- 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>
830
- 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>
831
- 213: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">signature</span>
832
- 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>
833
- 215: <span class="ruby-node">&quot;#{templateFile}&quot;</span>)
834
- 216: <span class="ruby-keyword kw">end</span>
835
- 217:
836
- 218: <span class="ruby-identifier">acceptedSignatures</span> = []
837
- 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>)
838
- 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>
839
- 221: <span class="ruby-identifier">acceptedSignatures</span> = <span class="ruby-identifier">file</span>.<span class="ruby-identifier">readlines</span>
840
- 222: <span class="ruby-keyword kw">end</span>
841
- 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> }
842
- 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> }
843
- 225: <span class="ruby-keyword kw">else</span>
844
- 226: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;#{@signatureFile} does not exist yet.&quot;</span>)
845
- 227: <span class="ruby-keyword kw">end</span>
846
- 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>)
847
- 229: <span class="ruby-comment cmt"># Add the new signature</span>
848
- 230: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Adding #{signature} to #{@signatureFile}&quot;</span>)
849
- 231: <span class="ruby-identifier">acceptedSignatures</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">signature</span>
850
- 232: <span class="ruby-comment cmt"># And write back the adapted file.</span>
851
- 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>
852
- 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>
853
- 235: <span class="ruby-identifier">file</span>.<span class="ruby-identifier">write</span>(<span class="ruby-node">&quot;#{iv}\n&quot;</span>)
854
- 236: <span class="ruby-keyword kw">end</span>
855
- 237: <span class="ruby-keyword kw">end</span>
856
- 238: <span class="ruby-keyword kw">else</span>
857
- 239: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Signature #{signature} is already listed in #{@signatureFile}&quot;</span>)
858
- 240: <span class="ruby-keyword kw">end</span>
859
- 241: <span class="ruby-keyword kw">end</span></pre>
816
+ <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 194</span>
817
+ 194: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">enableSignatureForReporting</span>(<span class="ruby-identifier">templateFile</span>)
818
+ 195: <span class="ruby-identifier">signature</span> = <span class="ruby-keyword kw">nil</span>
819
+ 196: <span class="ruby-comment cmt"># That's a pretty bad hack to make reasonably certain that the tj3 server</span>
820
+ 197: <span class="ruby-comment cmt"># process has put the complete file into the file system.</span>
821
+ 198: <span class="ruby-identifier">i</span> = <span class="ruby-value">0</span>
822
+ 199: <span class="ruby-keyword kw">begin</span>
823
+ 200: <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>)
824
+ 201: <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>
825
+ 202: <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>)
826
+ 203: <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>)
827
+ 204: <span class="ruby-identifier">signature</span> = <span class="ruby-identifier">matches</span>[<span class="ruby-value">1</span>]
828
+ 205: <span class="ruby-keyword kw">end</span>
829
+ 206: <span class="ruby-keyword kw">end</span>
830
+ 207: <span class="ruby-keyword kw">end</span>
831
+ 208: <span class="ruby-keyword kw">end</span>
832
+ 209: <span class="ruby-identifier">i</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
833
+ 210: <span class="ruby-comment cmt"># If the file doesn't exist yet or the cannot yet be read, wait for</span>
834
+ 211: <span class="ruby-comment cmt"># 300ms. We try this 100 times.</span>
835
+ 212: <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>
836
+ 213: <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>
837
+ 214: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">signature</span>
838
+ 215: <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>
839
+ 216: <span class="ruby-node">&quot;#{templateFile}&quot;</span>)
840
+ 217: <span class="ruby-keyword kw">end</span>
841
+ 218:
842
+ 219: <span class="ruby-identifier">acceptedSignatures</span> = []
843
+ 220: <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>)
844
+ 221: <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>
845
+ 222: <span class="ruby-identifier">acceptedSignatures</span> = <span class="ruby-identifier">file</span>.<span class="ruby-identifier">readlines</span>
846
+ 223: <span class="ruby-keyword kw">end</span>
847
+ 224: <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> }
848
+ 225: <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> }
849
+ 226: <span class="ruby-keyword kw">else</span>
850
+ 227: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;#{@signatureFile} does not exist yet.&quot;</span>)
851
+ 228: <span class="ruby-keyword kw">end</span>
852
+ 229: <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>)
853
+ 230: <span class="ruby-comment cmt"># Add the new signature</span>
854
+ 231: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Adding #{signature} to #{@signatureFile}&quot;</span>)
855
+ 232: <span class="ruby-identifier">acceptedSignatures</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">signature</span>
856
+ 233: <span class="ruby-comment cmt"># And write back the adapted file.</span>
857
+ 234: <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>
858
+ 235: <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>
859
+ 236: <span class="ruby-identifier">file</span>.<span class="ruby-identifier">write</span>(<span class="ruby-node">&quot;#{iv}\n&quot;</span>)
860
+ 237: <span class="ruby-keyword kw">end</span>
861
+ 238: <span class="ruby-keyword kw">end</span>
862
+ 239: <span class="ruby-keyword kw">else</span>
863
+ 240: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Signature #{signature} is already listed in #{@signatureFile}&quot;</span>)
864
+ 241: <span class="ruby-keyword kw">end</span>
865
+ 242: <span class="ruby-keyword kw">end</span></pre>
860
866
  </div>
861
867
 
862
868
  </div>
@@ -887,59 +893,59 @@ and can be further limited with a list of resource IDs passed by
887
893
  <div class="method-source-code"
888
894
  id="gen-esource-ist-source">
889
895
  <pre>
890
- <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 82</span>
891
- 82: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">genResourceList</span>(<span class="ruby-identifier">resourceList</span>)
892
- 83: <span class="ruby-identifier">list</span> = []
893
- 84: <span class="ruby-identifier">info</span>(<span class="ruby-value str">'Retrieving resource list...'</span>)
894
- 85: <span class="ruby-comment cmt"># Create a TJP report definition for a CSV report that contains the id,</span>
895
- 86: <span class="ruby-comment cmt"># name, email, effort and free work for each resource that is not hidden</span>
896
- 87: <span class="ruby-comment cmt"># by @hideResource.</span>
897
- 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>
898
- 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>)
899
- 90: <span class="ruby-comment cmt"># Parse the CSV report into an Array of Arrays</span>
900
- 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>)
901
- 92:
902
- 93: <span class="ruby-comment cmt"># Get rid of the column title line</span>
903
- 94: <span class="ruby-identifier">csv</span>.<span class="ruby-identifier">delete_at</span>(<span class="ruby-value">0</span>)
904
- 95:
905
- 96: <span class="ruby-comment cmt"># Process the CSV report line by line</span>
906
- 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>
907
- 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>
908
- 99: <span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;Resource '#{id}' must have a valid email address&quot;</span>)
909
- 100: <span class="ruby-keyword kw">end</span>
910
- 101:
911
- 102: <span class="ruby-comment cmt"># Ignore resources that are on vacation for the whole period.</span>
912
- 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>
913
- 104: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Resource '#{id}' was on vacation the whole period&quot;</span>)
914
- 105: <span class="ruby-keyword kw">next</span>
915
- 106: <span class="ruby-keyword kw">end</span>
916
- 107:
917
- 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> ]
918
- 109: <span class="ruby-keyword kw">end</span>
919
- 110:
920
- 111: <span class="ruby-comment cmt"># Save the resource list to a file. We'll need it in the receiver again.</span>
921
- 112: <span class="ruby-keyword kw">begin</span>
922
- 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>
923
- 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>
924
- 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>)
925
- 116: <span class="ruby-keyword kw">end</span>
926
- 117: <span class="ruby-keyword kw">rescue</span>
927
- 118: <span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;Saving of #{fileName} failed: #{$!}&quot;</span>)
928
- 119: <span class="ruby-keyword kw">end</span>
929
- 120:
930
- 121: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">resourceList</span>.<span class="ruby-identifier">empty?</span>
931
- 122: <span class="ruby-comment cmt"># When the user specified resource list is empty, we generate templates</span>
932
- 123: <span class="ruby-comment cmt"># for all users that don't match the @hideResource filter. Otherwise we</span>
933
- 124: <span class="ruby-comment cmt"># only generate templates for those in the list and that are not hidden</span>
934
- 125: <span class="ruby-comment cmt"># by the filter.</span>
935
- 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>]) }
936
- 127: <span class="ruby-keyword kw">end</span>
937
- 128:
938
- 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>
939
- 130:
940
- 131: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;#{list.length} resources found&quot;</span>)
941
- 132: <span class="ruby-identifier">list</span>
942
- 133: <span class="ruby-keyword kw">end</span></pre>
896
+ <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 83</span>
897
+ 83: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">genResourceList</span>(<span class="ruby-identifier">resourceList</span>)
898
+ 84: <span class="ruby-identifier">list</span> = []
899
+ 85: <span class="ruby-identifier">info</span>(<span class="ruby-value str">'Retrieving resource list...'</span>)
900
+ 86: <span class="ruby-comment cmt"># Create a TJP report definition for a CSV report that contains the id,</span>
901
+ 87: <span class="ruby-comment cmt"># name, email, effort and free work for each resource that is not hidden</span>
902
+ 88: <span class="ruby-comment cmt"># by @hideResource.</span>
903
+ 89: <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>
904
+ 90: <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>)
905
+ 91: <span class="ruby-comment cmt"># Parse the CSV report into an Array of Arrays</span>
906
+ 92: <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>)
907
+ 93:
908
+ 94: <span class="ruby-comment cmt"># Get rid of the column title line</span>
909
+ 95: <span class="ruby-identifier">csv</span>.<span class="ruby-identifier">delete_at</span>(<span class="ruby-value">0</span>)
910
+ 96:
911
+ 97: <span class="ruby-comment cmt"># Process the CSV report line by line</span>
912
+ 98: <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>
913
+ 99: <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>
914
+ 100: <span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;Resource '#{id}' must have a valid email address&quot;</span>)
915
+ 101: <span class="ruby-keyword kw">end</span>
916
+ 102:
917
+ 103: <span class="ruby-comment cmt"># Ignore resources that are on vacation for the whole period.</span>
918
+ 104: <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>
919
+ 105: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Resource '#{id}' was on vacation the whole period&quot;</span>)
920
+ 106: <span class="ruby-keyword kw">next</span>
921
+ 107: <span class="ruby-keyword kw">end</span>
922
+ 108:
923
+ 109: <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> ]
924
+ 110: <span class="ruby-keyword kw">end</span>
925
+ 111:
926
+ 112: <span class="ruby-comment cmt"># Save the resource list to a file. We'll need it in the receiver again.</span>
927
+ 113: <span class="ruby-keyword kw">begin</span>
928
+ 114: <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>
929
+ 115: <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>
930
+ 116: <span class="ruby-constant">YAML</span>.<span class="ruby-identifier">dump</span>(<span class="ruby-identifier">list</span>, <span class="ruby-identifier">file</span>)
931
+ 117: <span class="ruby-keyword kw">end</span>
932
+ 118: <span class="ruby-keyword kw">rescue</span>
933
+ 119: <span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;Saving of #{fileName} failed: #{$!}&quot;</span>)
934
+ 120: <span class="ruby-keyword kw">end</span>
935
+ 121:
936
+ 122: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">resourceList</span>.<span class="ruby-identifier">empty?</span>
937
+ 123: <span class="ruby-comment cmt"># When the user specified resource list is empty, we generate templates</span>
938
+ 124: <span class="ruby-comment cmt"># for all users that don't match the @hideResource filter. Otherwise we</span>
939
+ 125: <span class="ruby-comment cmt"># only generate templates for those in the list and that are not hidden</span>
940
+ 126: <span class="ruby-comment cmt"># by the filter.</span>
941
+ 127: <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>]) }
942
+ 128: <span class="ruby-keyword kw">end</span>
943
+ 129:
944
+ 130: <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>
945
+ 131:
946
+ 132: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;#{list.length} resources found&quot;</span>)
947
+ 133: <span class="ruby-identifier">list</span>
948
+ 134: <span class="ruby-keyword kw">end</span></pre>
943
949
  </div>
944
950
 
945
951
  </div>
@@ -970,29 +976,29 @@ and can be further limited with a list of resource IDs passed by
970
976
  <div class="method-source-code"
971
977
  id="gen-emplates-source">
972
978
  <pre>
973
- <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 144</span>
974
- 144: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">genTemplates</span>(<span class="ruby-identifier">resources</span>)
975
- 145: <span class="ruby-identifier">firstTemplateFile</span> = <span class="ruby-keyword kw">nil</span>
976
- 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>
977
- 147: <span class="ruby-identifier">res</span> = <span class="ruby-identifier">resInfo</span>[<span class="ruby-value">0</span>]
978
- 148: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Generating template for #{res}...&quot;</span>)
979
- 149: <span class="ruby-identifier">reportId</span> = <span class="ruby-node">&quot;sheet_template_#{res}&quot;</span>
980
- 150: <span class="ruby-identifier">templateFile</span> = <span class="ruby-node">&quot;#{@templateDir}/#{res}_#{@date}&quot;</span>
981
- 151: <span class="ruby-comment cmt"># We use the first template file to get the sheet interval.</span>
982
- 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>
983
- 153:
984
- 154: <span class="ruby-comment cmt"># Don't re-generate already existing templates unless we are in force</span>
985
- 155: <span class="ruby-comment cmt"># mode. We probably have sent them out earlier with a manual trigger.</span>
986
- 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>)
987
- 157: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Skipping already existing #{templateFile}.tji.&quot;</span>)
988
- 158: <span class="ruby-keyword kw">next</span>
989
- 159: <span class="ruby-keyword kw">end</span>
990
- 160:
991
- 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>
992
- 162: <span class="ruby-identifier">generateReport</span>(<span class="ruby-identifier">reportId</span>, <span class="ruby-identifier">reportDef</span>)
993
- 163: <span class="ruby-keyword kw">end</span>
994
- 164: <span class="ruby-identifier">enableSignatureForReporting</span>(<span class="ruby-identifier">firstTemplateFile</span>)
995
- 165: <span class="ruby-keyword kw">end</span></pre>
979
+ <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 145</span>
980
+ 145: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">genTemplates</span>(<span class="ruby-identifier">resources</span>)
981
+ 146: <span class="ruby-identifier">firstTemplateFile</span> = <span class="ruby-keyword kw">nil</span>
982
+ 147: <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>
983
+ 148: <span class="ruby-identifier">res</span> = <span class="ruby-identifier">resInfo</span>[<span class="ruby-value">0</span>]
984
+ 149: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Generating template for #{res}...&quot;</span>)
985
+ 150: <span class="ruby-identifier">reportId</span> = <span class="ruby-node">&quot;sheet_template_#{res}&quot;</span>
986
+ 151: <span class="ruby-identifier">templateFile</span> = <span class="ruby-node">&quot;#{@templateDir}/#{res}_#{@date}&quot;</span>
987
+ 152: <span class="ruby-comment cmt"># We use the first template file to get the sheet interval.</span>
988
+ 153: <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>
989
+ 154:
990
+ 155: <span class="ruby-comment cmt"># Don't re-generate already existing templates unless we are in force</span>
991
+ 156: <span class="ruby-comment cmt"># mode. We probably have sent them out earlier with a manual trigger.</span>
992
+ 157: <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>)
993
+ 158: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Skipping already existing #{templateFile}.tji.&quot;</span>)
994
+ 159: <span class="ruby-keyword kw">next</span>
995
+ 160: <span class="ruby-keyword kw">end</span>
996
+ 161:
997
+ 162: <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>
998
+ 163: <span class="ruby-identifier">generateReport</span>(<span class="ruby-identifier">reportId</span>, <span class="ruby-identifier">reportDef</span>)
999
+ 164: <span class="ruby-keyword kw">end</span>
1000
+ 165: <span class="ruby-identifier">enableSignatureForReporting</span>(<span class="ruby-identifier">firstTemplateFile</span>)
1001
+ 166: <span class="ruby-keyword kw">end</span></pre>
996
1002
  </div>
997
1003
 
998
1004
  </div>
@@ -1023,28 +1029,28 @@ and can be further limited with a list of resource IDs passed by
1023
1029
  <div class="method-source-code"
1024
1030
  id="generate-eport-source">
1025
1031
  <pre>
1026
- <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 243</span>
1027
- 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>)
1028
- 244: <span class="ruby-identifier">out</span> = <span class="ruby-value str">''</span>
1029
- 245: <span class="ruby-identifier">err</span> = <span class="ruby-value str">''</span>
1030
- 246: <span class="ruby-keyword kw">begin</span>
1031
- 247: <span class="ruby-identifier">command</span> = <span class="ruby-node">&quot;tj3client --silent report #{@projectId} #{id} = .&quot;</span>
1032
- 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>
1033
- 249: <span class="ruby-comment cmt"># Send the report definition to the tj3client process via stdin.</span>
1034
- 250: <span class="ruby-identifier">stdin</span>.<span class="ruby-identifier">write</span>(<span class="ruby-identifier">reportDef</span>)
1035
- 251: <span class="ruby-identifier">stdin</span>.<span class="ruby-identifier">close</span>
1036
- 252: <span class="ruby-comment cmt"># Retrieve the output</span>
1037
- 253: <span class="ruby-identifier">out</span> = <span class="ruby-identifier">stdout</span>.<span class="ruby-identifier">read</span>
1038
- 254: <span class="ruby-identifier">err</span> = <span class="ruby-identifier">stderr</span>.<span class="ruby-identifier">read</span>
1039
- 255: <span class="ruby-keyword kw">end</span>
1040
- 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>
1041
- 257: <span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;generateReport: #{err}&quot;</span>)
1042
- 258: <span class="ruby-keyword kw">end</span>
1043
- 259: <span class="ruby-keyword kw">rescue</span>
1044
- 260: <span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;generateReport: Report generation failed: #{$!}&quot;</span>)
1045
- 261: <span class="ruby-keyword kw">end</span>
1046
- 262: <span class="ruby-identifier">out</span>
1047
- 263: <span class="ruby-keyword kw">end</span></pre>
1032
+ <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 244</span>
1033
+ 244: <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>)
1034
+ 245: <span class="ruby-identifier">out</span> = <span class="ruby-value str">''</span>
1035
+ 246: <span class="ruby-identifier">err</span> = <span class="ruby-value str">''</span>
1036
+ 247: <span class="ruby-keyword kw">begin</span>
1037
+ 248: <span class="ruby-identifier">command</span> = <span class="ruby-node">&quot;tj3client --silent report #{@projectId} #{id} = .&quot;</span>
1038
+ 249: <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>
1039
+ 250: <span class="ruby-comment cmt"># Send the report definition to the tj3client process via stdin.</span>
1040
+ 251: <span class="ruby-identifier">stdin</span>.<span class="ruby-identifier">write</span>(<span class="ruby-identifier">reportDef</span>)
1041
+ 252: <span class="ruby-identifier">stdin</span>.<span class="ruby-identifier">close</span>
1042
+ 253: <span class="ruby-comment cmt"># Retrieve the output</span>
1043
+ 254: <span class="ruby-identifier">out</span> = <span class="ruby-identifier">stdout</span>.<span class="ruby-identifier">read</span>
1044
+ 255: <span class="ruby-identifier">err</span> = <span class="ruby-identifier">stderr</span>.<span class="ruby-identifier">read</span>
1045
+ 256: <span class="ruby-keyword kw">end</span>
1046
+ 257: <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>
1047
+ 258: <span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;generateReport: #{err}&quot;</span>)
1048
+ 259: <span class="ruby-keyword kw">end</span>
1049
+ 260: <span class="ruby-keyword kw">rescue</span>
1050
+ 261: <span class="ruby-identifier">error</span>(<span class="ruby-node">&quot;generateReport: Report generation failed: #{$!}&quot;</span>)
1051
+ 262: <span class="ruby-keyword kw">end</span>
1052
+ 263: <span class="ruby-identifier">out</span>
1053
+ 264: <span class="ruby-keyword kw">end</span></pre>
1048
1054
  </div>
1049
1055
 
1050
1056
  </div>
@@ -1075,26 +1081,26 @@ and can be further limited with a list of resource IDs passed by
1075
1081
  <div class="method-source-code"
1076
1082
  id="send-eport-emplates-source">
1077
1083
  <pre>
1078
- <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 173</span>
1079
- 173: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">sendReportTemplates</span>(<span class="ruby-identifier">resources</span>)
1080
- 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>
1081
- 175: <span class="ruby-identifier">attachment</span> = <span class="ruby-node">&quot;#{@templateDir}/#{id}_#{@date}.tji&quot;</span>
1082
- 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>)
1083
- 177: <span class="ruby-identifier">error</span>(<span class="ruby-value str">&quot;sendReportTemplates: &quot;</span> <span class="ruby-operator">+</span>
1084
- 178: <span class="ruby-node">&quot;#{@sheetType} sheet #{attachment} for #{name} not found&quot;</span>)
1085
- 179: <span class="ruby-keyword kw">end</span>
1086
- 180: <span class="ruby-comment cmt"># Don't send out old templates again. @timeStamp has a higher</span>
1087
- 181: <span class="ruby-comment cmt"># resolution. We add 1s to avoid truncation errors.</span>
1088
- 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>
1089
- 183: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Old template #{attachment} found. Not sending it out.&quot;</span>)
1090
- 184: <span class="ruby-keyword kw">next</span>
1091
- 185: <span class="ruby-keyword kw">end</span>
1092
- 186:
1093
- 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>)
1094
- 188:
1095
- 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>)
1096
- 190: <span class="ruby-keyword kw">end</span>
1097
- 191: <span class="ruby-keyword kw">end</span></pre>
1084
+ <span class="ruby-comment cmt"># File lib/SheetSender.rb, line 174</span>
1085
+ 174: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">sendReportTemplates</span>(<span class="ruby-identifier">resources</span>)
1086
+ 175: <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>
1087
+ 176: <span class="ruby-identifier">attachment</span> = <span class="ruby-node">&quot;#{@templateDir}/#{id}_#{@date}.tji&quot;</span>
1088
+ 177: <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>)
1089
+ 178: <span class="ruby-identifier">error</span>(<span class="ruby-value str">&quot;sendReportTemplates: &quot;</span> <span class="ruby-operator">+</span>
1090
+ 179: <span class="ruby-node">&quot;#{@sheetType} sheet #{attachment} for #{name} not found&quot;</span>)
1091
+ 180: <span class="ruby-keyword kw">end</span>
1092
+ 181: <span class="ruby-comment cmt"># Don't send out old templates again. @timeStamp has a higher</span>
1093
+ 182: <span class="ruby-comment cmt"># resolution. We add 1s to avoid truncation errors.</span>
1094
+ 183: <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>
1095
+ 184: <span class="ruby-identifier">info</span>(<span class="ruby-node">&quot;Old template #{attachment} found. Not sending it out.&quot;</span>)
1096
+ 185: <span class="ruby-keyword kw">next</span>
1097
+ 186: <span class="ruby-keyword kw">end</span>
1098
+ 187:
1099
+ 188: <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>)
1100
+ 189:
1101
+ 190: <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>)
1102
+ 191: <span class="ruby-keyword kw">end</span>
1103
+ 192: <span class="ruby-keyword kw">end</span></pre>
1098
1104
  </div>
1099
1105
 
1100
1106
  </div>