framework_gem 0.1.0

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 (872) hide show
  1. checksums.yaml +7 -0
  2. data/lib/EXECUTION_ENGINE.md +282 -0
  3. data/lib/Gemfile +12 -0
  4. data/lib/README.md +138 -0
  5. data/lib/User_Lib/helpers/helpers.rb +13 -0
  6. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_black_rois.rb +7 -0
  7. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_color_rois.rb +9 -0
  8. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_image_rois.rb +7 -0
  9. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_rois.rb +23 -0
  10. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_text_rois.rb +48 -0
  11. data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_video_rois.rb +11 -0
  12. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_black_rois.rb +7 -0
  13. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_color_rois.rb +7 -0
  14. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_image_rois.rb +7 -0
  15. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_rois.rb +23 -0
  16. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_text_rois.rb +7 -0
  17. data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_video_rois.rb +11 -0
  18. data/lib/User_Lib/rois/apple_tv/apple_tv_black_rois.rb +7 -0
  19. data/lib/User_Lib/rois/apple_tv/apple_tv_color_rois.rb +7 -0
  20. data/lib/User_Lib/rois/apple_tv/apple_tv_image_rois.rb +7 -0
  21. data/lib/User_Lib/rois/apple_tv/apple_tv_rois.rb +23 -0
  22. data/lib/User_Lib/rois/apple_tv/apple_tv_text_rois.rb +7 -0
  23. data/lib/User_Lib/rois/apple_tv/apple_tv_video_rois.rb +7 -0
  24. data/lib/User_Lib/rois/black_rois.rb +33 -0
  25. data/lib/User_Lib/rois/color_rois.rb +38 -0
  26. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_black_rois.rb +8 -0
  27. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_color_rois.rb +8 -0
  28. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_image_rois.rb +8 -0
  29. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_rois.rb +26 -0
  30. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_text_rois.rb +8 -0
  31. data/lib/User_Lib/rois/dta/dta_1080/dta_1080_video_rois.rb +8 -0
  32. data/lib/User_Lib/rois/dta/dta_720/dta_720_black_rois.rb +8 -0
  33. data/lib/User_Lib/rois/dta/dta_720/dta_720_color_rois.rb +8 -0
  34. data/lib/User_Lib/rois/dta/dta_720/dta_720_image_rois.rb +8 -0
  35. data/lib/User_Lib/rois/dta/dta_720/dta_720_rois.rb +26 -0
  36. data/lib/User_Lib/rois/dta/dta_720/dta_720_text_rois.rb +8 -0
  37. data/lib/User_Lib/rois/dta/dta_720/dta_720_video_rois.rb +8 -0
  38. data/lib/User_Lib/rois/dta/dta_black_rois.rb +9 -0
  39. data/lib/User_Lib/rois/dta/dta_color_rois.rb +9 -0
  40. data/lib/User_Lib/rois/dta/dta_image_rois.rb +9 -0
  41. data/lib/User_Lib/rois/dta/dta_rois.rb +26 -0
  42. data/lib/User_Lib/rois/dta/dta_text_rois.rb +9 -0
  43. data/lib/User_Lib/rois/dta/dta_video_rois.rb +9 -0
  44. data/lib/User_Lib/rois/image_rois.rb +38 -0
  45. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_black_rois.rb +8 -0
  46. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_color_rois.rb +8 -0
  47. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_image_rois.rb +8 -0
  48. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_rois.rb +26 -0
  49. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_text_rois.rb +8 -0
  50. data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_video_rois.rb +8 -0
  51. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_black_rois.rb +8 -0
  52. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_color_rois.rb +8 -0
  53. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_image_rois.rb +8 -0
  54. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_rois.rb +26 -0
  55. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_text_rois.rb +8 -0
  56. data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_video_rois.rb +8 -0
  57. data/lib/User_Lib/rois/mdn/mdn_black_rois.rb +9 -0
  58. data/lib/User_Lib/rois/mdn/mdn_color_rois.rb +9 -0
  59. data/lib/User_Lib/rois/mdn/mdn_image_rois.rb +9 -0
  60. data/lib/User_Lib/rois/mdn/mdn_rois.rb +26 -0
  61. data/lib/User_Lib/rois/mdn/mdn_text_rois.rb +13 -0
  62. data/lib/User_Lib/rois/mdn/mdn_video_rois.rb +9 -0
  63. data/lib/User_Lib/rois/mobile/android/android_black_rois.rb +8 -0
  64. data/lib/User_Lib/rois/mobile/android/android_color_rois.rb +8 -0
  65. data/lib/User_Lib/rois/mobile/android/android_image_rois.rb +8 -0
  66. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_black_rois.rb +8 -0
  67. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_color_rois.rb +8 -0
  68. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_image_rois.rb +43 -0
  69. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_rois.rb +22 -0
  70. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_text_rois.rb +8 -0
  71. data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_video_rois.rb +8 -0
  72. data/lib/User_Lib/rois/mobile/android/android_rois.rb +22 -0
  73. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_black_rois.rb +8 -0
  74. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_color_rois.rb +8 -0
  75. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_image_rois.rb +54 -0
  76. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_rois.rb +22 -0
  77. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_text_rois.rb +8 -0
  78. data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_video_rois.rb +8 -0
  79. data/lib/User_Lib/rois/mobile/android/android_text_rois.rb +8 -0
  80. data/lib/User_Lib/rois/mobile/android/android_video_rois.rb +8 -0
  81. data/lib/User_Lib/rois/mobile/ios/ios_black_rois.rb +8 -0
  82. data/lib/User_Lib/rois/mobile/ios/ios_color_rois.rb +8 -0
  83. data/lib/User_Lib/rois/mobile/ios/ios_image_rois.rb +8 -0
  84. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_black_rois.rb +8 -0
  85. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_color_rois.rb +8 -0
  86. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_image_rois.rb +8 -0
  87. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_rois.rb +22 -0
  88. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_text_rois.rb +8 -0
  89. data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_video_rois.rb +8 -0
  90. data/lib/User_Lib/rois/mobile/ios/ios_rois.rb +22 -0
  91. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_black_rois.rb +8 -0
  92. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_color_rois.rb +8 -0
  93. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_image_rois.rb +8 -0
  94. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_rois.rb +22 -0
  95. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_text_rois.rb +8 -0
  96. data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_video_rois.rb +8 -0
  97. data/lib/User_Lib/rois/mobile/ios/ios_text_rois.rb +8 -0
  98. data/lib/User_Lib/rois/mobile/ios/ios_video_rois.rb +8 -0
  99. data/lib/User_Lib/rois/mobile/mobile_black_rois.rb +8 -0
  100. data/lib/User_Lib/rois/mobile/mobile_color_rois.rb +12 -0
  101. data/lib/User_Lib/rois/mobile/mobile_image_rois.rb +38 -0
  102. data/lib/User_Lib/rois/mobile/mobile_rois.rb +22 -0
  103. data/lib/User_Lib/rois/mobile/mobile_text_rois.rb +8 -0
  104. data/lib/User_Lib/rois/mobile/mobile_video_rois.rb +8 -0
  105. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_black_rois.rb +7 -0
  106. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_color_rois.rb +9 -0
  107. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_image_rois.rb +7 -0
  108. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_rois.rb +23 -0
  109. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_text_rois.rb +8 -0
  110. data/lib/User_Lib/rois/passport/passport_1080/passport_1080_video_rois.rb +8 -0
  111. data/lib/User_Lib/rois/passport/passport_720/passport_720_black_rois.rb +7 -0
  112. data/lib/User_Lib/rois/passport/passport_720/passport_720_color_rois.rb +7 -0
  113. data/lib/User_Lib/rois/passport/passport_720/passport_720_image_rois.rb +7 -0
  114. data/lib/User_Lib/rois/passport/passport_720/passport_720_rois.rb +23 -0
  115. data/lib/User_Lib/rois/passport/passport_720/passport_720_text_rois.rb +7 -0
  116. data/lib/User_Lib/rois/passport/passport_720/passport_720_video_rois.rb +7 -0
  117. data/lib/User_Lib/rois/passport/passport_black_rois.rb +7 -0
  118. data/lib/User_Lib/rois/passport/passport_color_rois.rb +7 -0
  119. data/lib/User_Lib/rois/passport/passport_image_rois.rb +7 -0
  120. data/lib/User_Lib/rois/passport/passport_rois.rb +23 -0
  121. data/lib/User_Lib/rois/passport/passport_text_rois.rb +7 -0
  122. data/lib/User_Lib/rois/passport/passport_video_rois.rb +7 -0
  123. data/lib/User_Lib/rois/rois.rb +22 -0
  124. data/lib/User_Lib/rois/roku/roku_720/roku_720_black_rois.rb +37 -0
  125. data/lib/User_Lib/rois/roku/roku_720/roku_720_color_rois.rb +336 -0
  126. data/lib/User_Lib/rois/roku/roku_720/roku_720_image_rois.rb +235 -0
  127. data/lib/User_Lib/rois/roku/roku_720/roku_720_rois.rb +23 -0
  128. data/lib/User_Lib/rois/roku/roku_720/roku_720_text_rois.rb +1523 -0
  129. data/lib/User_Lib/rois/roku/roku_720/roku_720_video_rois.rb +32 -0
  130. data/lib/User_Lib/rois/roku/roku_black_rois.rb +14 -0
  131. data/lib/User_Lib/rois/roku/roku_color_rois.rb +9 -0
  132. data/lib/User_Lib/rois/roku/roku_image_rois.rb +13 -0
  133. data/lib/User_Lib/rois/roku/roku_rois.rb +23 -0
  134. data/lib/User_Lib/rois/roku/roku_text_rois.rb +9 -0
  135. data/lib/User_Lib/rois/roku/roku_video_rois.rb +9 -0
  136. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_black_rois.rb +12 -0
  137. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_color_rois.rb +11 -0
  138. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_image_rois.rb +12 -0
  139. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_rois.rb +23 -0
  140. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_text_rois.rb +12 -0
  141. data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_video_rois.rb +12 -0
  142. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_black_rois.rb +12 -0
  143. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_color_rois.rb +12 -0
  144. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_image_rois.rb +12 -0
  145. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_rois.rb +23 -0
  146. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_text_rois.rb +12 -0
  147. data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_video_rois.rb +12 -0
  148. data/lib/User_Lib/rois/roku_tv/roku_tv_black_rois.rb +12 -0
  149. data/lib/User_Lib/rois/roku_tv/roku_tv_color_rois.rb +12 -0
  150. data/lib/User_Lib/rois/roku_tv/roku_tv_image_rois.rb +12 -0
  151. data/lib/User_Lib/rois/roku_tv/roku_tv_rois.rb +23 -0
  152. data/lib/User_Lib/rois/roku_tv/roku_tv_text_rois.rb +12 -0
  153. data/lib/User_Lib/rois/roku_tv/roku_tv_video_rois.rb +12 -0
  154. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_black_rois.rb +13 -0
  155. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_color_rois.rb +29 -0
  156. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_image_rois.rb +9 -0
  157. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_rois.rb +23 -0
  158. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_text_rois.rb +92 -0
  159. data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_video_rois.rb +11 -0
  160. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_black_rois.rb +9 -0
  161. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_color_rois.rb +9 -0
  162. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_image_rois.rb +9 -0
  163. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_rois.rb +23 -0
  164. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_text_rois.rb +12 -0
  165. data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_video_rois.rb +11 -0
  166. data/lib/User_Lib/rois/samsung_tv/samsung_tv_black_rois.rb +9 -0
  167. data/lib/User_Lib/rois/samsung_tv/samsung_tv_color_rois.rb +9 -0
  168. data/lib/User_Lib/rois/samsung_tv/samsung_tv_image_rois.rb +9 -0
  169. data/lib/User_Lib/rois/samsung_tv/samsung_tv_rois.rb +23 -0
  170. data/lib/User_Lib/rois/samsung_tv/samsung_tv_text_rois.rb +12 -0
  171. data/lib/User_Lib/rois/samsung_tv/samsung_tv_video_rois.rb +9 -0
  172. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_black_rois.rb +8 -0
  173. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_color_rois.rb +8 -0
  174. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_image_rois.rb +8 -0
  175. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_rois.rb +26 -0
  176. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_text_rois.rb +8 -0
  177. data/lib/User_Lib/rois/sara/sara_1080/sara_1080_video_rois.rb +8 -0
  178. data/lib/User_Lib/rois/sara/sara_720/sara_720_black_rois.rb +8 -0
  179. data/lib/User_Lib/rois/sara/sara_720/sara_720_color_rois.rb +8 -0
  180. data/lib/User_Lib/rois/sara/sara_720/sara_720_image_rois.rb +8 -0
  181. data/lib/User_Lib/rois/sara/sara_720/sara_720_rois.rb +26 -0
  182. data/lib/User_Lib/rois/sara/sara_720/sara_720_text_rois.rb +8 -0
  183. data/lib/User_Lib/rois/sara/sara_720/sara_720_video_rois.rb +8 -0
  184. data/lib/User_Lib/rois/sara/sara_black_rois.rb +9 -0
  185. data/lib/User_Lib/rois/sara/sara_color_rois.rb +9 -0
  186. data/lib/User_Lib/rois/sara/sara_image_rois.rb +9 -0
  187. data/lib/User_Lib/rois/sara/sara_rois.rb +26 -0
  188. data/lib/User_Lib/rois/sara/sara_text_rois.rb +9 -0
  189. data/lib/User_Lib/rois/sara/sara_video_rois.rb +9 -0
  190. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_black_rois.rb +9 -0
  191. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_color_rois.rb +17 -0
  192. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_image_rois.rb +19 -0
  193. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_rois.rb +23 -0
  194. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_text_rois.rb +47 -0
  195. data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_video_rois.rb +23 -0
  196. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_black_rois.rb +9 -0
  197. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_color_rois.rb +9 -0
  198. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_image_rois.rb +9 -0
  199. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_rois.rb +23 -0
  200. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_text_rois.rb +17 -0
  201. data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_video_rois.rb +11 -0
  202. data/lib/User_Lib/rois/stb/iguide/iguide_black_rois.rb +9 -0
  203. data/lib/User_Lib/rois/stb/iguide/iguide_color_rois.rb +9 -0
  204. data/lib/User_Lib/rois/stb/iguide/iguide_image_rois.rb +9 -0
  205. data/lib/User_Lib/rois/stb/iguide/iguide_rois.rb +23 -0
  206. data/lib/User_Lib/rois/stb/iguide/iguide_text_rois.rb +9 -0
  207. data/lib/User_Lib/rois/stb/iguide/iguide_video_rois.rb +9 -0
  208. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_black_rois.rb +8 -0
  209. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_color_rois.rb +8 -0
  210. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_image_rois.rb +12 -0
  211. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_rois.rb +23 -0
  212. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_text_rois.rb +23 -0
  213. data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_video_rois.rb +11 -0
  214. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_black_rois.rb +46 -0
  215. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_color_rois.rb +142 -0
  216. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_image_rois.rb +103 -0
  217. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_black_rois.rb +6 -0
  218. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_color_rois.rb +6 -0
  219. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_image_rois.rb +6 -0
  220. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_rois.rb +23 -0
  221. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_text_rois.rb +7 -0
  222. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_video_rois.rb +7 -0
  223. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_rois.rb +23 -0
  224. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_black_rois.rb +6 -0
  225. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_color_rois.rb +6 -0
  226. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_image_rois.rb +6 -0
  227. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_rois.rb +23 -0
  228. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_text_rois.rb +7 -0
  229. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_video_rois.rb +7 -0
  230. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_black_rois.rb +6 -0
  231. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_color_rois.rb +77 -0
  232. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_image_rois.rb +67 -0
  233. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_rois.rb +23 -0
  234. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_text_rois.rb +159 -0
  235. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_video_rois.rb +17 -0
  236. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_text_rois.rb +221 -0
  237. data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_video_rois.rb +26 -0
  238. data/lib/User_Lib/rois/stb/odn/odn_black_rois.rb +10 -0
  239. data/lib/User_Lib/rois/stb/odn/odn_color_rois.rb +10 -0
  240. data/lib/User_Lib/rois/stb/odn/odn_image_rois.rb +58 -0
  241. data/lib/User_Lib/rois/stb/odn/odn_rois.rb +23 -0
  242. data/lib/User_Lib/rois/stb/odn/odn_text_rois.rb +70 -0
  243. data/lib/User_Lib/rois/stb/odn/odn_video_rois.rb +19 -0
  244. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_black_rois.rb +16 -0
  245. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_color_rois.rb +373 -0
  246. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_black_rois.rb +7 -0
  247. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_color_rois.rb +7 -0
  248. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_image_rois.rb +7 -0
  249. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_rois.rb +23 -0
  250. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_text_rois.rb +7 -0
  251. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_video_rois.rb +7 -0
  252. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_black_rois.rb +8 -0
  253. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_color_rois.rb +8 -0
  254. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_image_rois.rb +8 -0
  255. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_rois.rb +26 -0
  256. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_text_rois.rb +8 -0
  257. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_video_rois.rb +8 -0
  258. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_black_rois.rb +8 -0
  259. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_color_rois.rb +8 -0
  260. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_image_rois.rb +8 -0
  261. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_rois.rb +26 -0
  262. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_text_rois.rb +8 -0
  263. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_video_rois.rb +8 -0
  264. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_black_rois.rb +8 -0
  265. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_color_rois.rb +8 -0
  266. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_image_rois.rb +8 -0
  267. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_rois.rb +26 -0
  268. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_text_rois.rb +8 -0
  269. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_video_rois.rb +8 -0
  270. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_image_rois.rb +1592 -0
  271. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_black_rois.rb +7 -0
  272. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_color_rois.rb +7 -0
  273. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_image_rois.rb +7 -0
  274. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_rois.rb +23 -0
  275. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_text_rois.rb +7 -0
  276. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_video_rois.rb +7 -0
  277. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_rois.rb +23 -0
  278. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_text_rois.rb +2489 -0
  279. data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_video_rois.rb +64 -0
  280. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_black_rois.rb +7 -0
  281. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_color_rois.rb +63 -0
  282. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_black_rois.rb +8 -0
  283. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_color_rois.rb +8 -0
  284. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_image_rois.rb +8 -0
  285. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_rois.rb +26 -0
  286. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_text_rois.rb +8 -0
  287. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_video_rois.rb +8 -0
  288. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_black_rois.rb +8 -0
  289. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_color_rois.rb +8 -0
  290. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_image_rois.rb +8 -0
  291. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_rois.rb +26 -0
  292. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_text_rois.rb +8 -0
  293. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_video_rois.rb +8 -0
  294. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_black_rois.rb +8 -0
  295. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_color_rois.rb +8 -0
  296. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_image_rois.rb +8 -0
  297. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_rois.rb +26 -0
  298. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_text_rois.rb +8 -0
  299. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_video_rois.rb +8 -0
  300. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_image_rois.rb +117 -0
  301. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_rois.rb +23 -0
  302. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_text_rois.rb +84 -0
  303. data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_video_rois.rb +35 -0
  304. data/lib/User_Lib/rois/stb/spectrum/spectrum_black_rois.rb +9 -0
  305. data/lib/User_Lib/rois/stb/spectrum/spectrum_color_rois.rb +17 -0
  306. data/lib/User_Lib/rois/stb/spectrum/spectrum_image_rois.rb +49 -0
  307. data/lib/User_Lib/rois/stb/spectrum/spectrum_rois.rb +23 -0
  308. data/lib/User_Lib/rois/stb/spectrum/spectrum_text_rois.rb +51 -0
  309. data/lib/User_Lib/rois/stb/spectrum/spectrum_video_rois.rb +9 -0
  310. data/lib/User_Lib/rois/stb/stb_black_rois.rb +9 -0
  311. data/lib/User_Lib/rois/stb/stb_color_rois.rb +9 -0
  312. data/lib/User_Lib/rois/stb/stb_image_rois.rb +9 -0
  313. data/lib/User_Lib/rois/stb/stb_rois.rb +23 -0
  314. data/lib/User_Lib/rois/stb/stb_text_rois.rb +9 -0
  315. data/lib/User_Lib/rois/stb/stb_video_rois.rb +9 -0
  316. data/lib/User_Lib/rois/template.txt +23 -0
  317. data/lib/User_Lib/rois/text_rois.rb +36 -0
  318. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_black_rois.rb +7 -0
  319. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_color_rois.rb +9 -0
  320. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_image_rois.rb +7 -0
  321. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_rois.rb +23 -0
  322. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_text_rois.rb +9 -0
  323. data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_video_rois.rb +7 -0
  324. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_black_rois.rb +7 -0
  325. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_color_rois.rb +7 -0
  326. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_image_rois.rb +7 -0
  327. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_rois.rb +23 -0
  328. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_text_rois.rb +7 -0
  329. data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_video_rois.rb +7 -0
  330. data/lib/User_Lib/rois/tivo/tivo_black_rois.rb +7 -0
  331. data/lib/User_Lib/rois/tivo/tivo_color_rois.rb +7 -0
  332. data/lib/User_Lib/rois/tivo/tivo_image_rois.rb +7 -0
  333. data/lib/User_Lib/rois/tivo/tivo_rois.rb +23 -0
  334. data/lib/User_Lib/rois/tivo/tivo_text_rois.rb +7 -0
  335. data/lib/User_Lib/rois/tivo/tivo_video_rois.rb +7 -0
  336. data/lib/User_Lib/rois/video_rois.rb +33 -0
  337. data/lib/User_Lib/screen/apple_tv/apple_tv_dvr.rb +25 -0
  338. data/lib/User_Lib/screen/apple_tv/apple_tv_guide.rb +25 -0
  339. data/lib/User_Lib/screen/apple_tv/apple_tv_library.rb +25 -0
  340. data/lib/User_Lib/screen/apple_tv/apple_tv_live_tv.rb +17 -0
  341. data/lib/User_Lib/screen/apple_tv/apple_tv_login.rb +24 -0
  342. data/lib/User_Lib/screen/apple_tv/apple_tv_main_menu.rb +25 -0
  343. data/lib/User_Lib/screen/apple_tv/apple_tv_mini_guide.rb +25 -0
  344. data/lib/User_Lib/screen/apple_tv/apple_tv_movies.rb +25 -0
  345. data/lib/User_Lib/screen/apple_tv/apple_tv_on_demand.rb +25 -0
  346. data/lib/User_Lib/screen/apple_tv/apple_tv_parental_controls.rb +25 -0
  347. data/lib/User_Lib/screen/apple_tv/apple_tv_product_page.rb +25 -0
  348. data/lib/User_Lib/screen/apple_tv/apple_tv_screen.rb +23 -0
  349. data/lib/User_Lib/screen/apple_tv/apple_tv_search.rb +31 -0
  350. data/lib/User_Lib/screen/apple_tv/apple_tv_settings.rb +25 -0
  351. data/lib/User_Lib/screen/apple_tv/apple_tv_tv_shows.rb +25 -0
  352. data/lib/User_Lib/screen/apple_tv/apple_tv_video_store.rb +25 -0
  353. data/lib/User_Lib/screen/dta/dta_dvr.rb +26 -0
  354. data/lib/User_Lib/screen/dta/dta_guide.rb +26 -0
  355. data/lib/User_Lib/screen/dta/dta_library.rb +26 -0
  356. data/lib/User_Lib/screen/dta/dta_live_tv.rb +26 -0
  357. data/lib/User_Lib/screen/dta/dta_log_in.rb +26 -0
  358. data/lib/User_Lib/screen/dta/dta_main_menu.rb +26 -0
  359. data/lib/User_Lib/screen/dta/dta_mini_guide.rb +26 -0
  360. data/lib/User_Lib/screen/dta/dta_movies.rb +26 -0
  361. data/lib/User_Lib/screen/dta/dta_on_demand.rb +26 -0
  362. data/lib/User_Lib/screen/dta/dta_parental_controls.rb +26 -0
  363. data/lib/User_Lib/screen/dta/dta_product_page.rb +26 -0
  364. data/lib/User_Lib/screen/dta/dta_screen.rb +24 -0
  365. data/lib/User_Lib/screen/dta/dta_search.rb +26 -0
  366. data/lib/User_Lib/screen/dta/dta_settings.rb +26 -0
  367. data/lib/User_Lib/screen/dta/dta_tv_shows.rb +26 -0
  368. data/lib/User_Lib/screen/dta/dta_video_store.rb +26 -0
  369. data/lib/User_Lib/screen/mdn/mdn_dvr.rb +26 -0
  370. data/lib/User_Lib/screen/mdn/mdn_guide.rb +26 -0
  371. data/lib/User_Lib/screen/mdn/mdn_library.rb +26 -0
  372. data/lib/User_Lib/screen/mdn/mdn_live_tv.rb +26 -0
  373. data/lib/User_Lib/screen/mdn/mdn_log_in.rb +26 -0
  374. data/lib/User_Lib/screen/mdn/mdn_main_menu.rb +26 -0
  375. data/lib/User_Lib/screen/mdn/mdn_mini_guide.rb +26 -0
  376. data/lib/User_Lib/screen/mdn/mdn_movies.rb +26 -0
  377. data/lib/User_Lib/screen/mdn/mdn_on_demand.rb +26 -0
  378. data/lib/User_Lib/screen/mdn/mdn_parental_controls.rb +26 -0
  379. data/lib/User_Lib/screen/mdn/mdn_product_page.rb +26 -0
  380. data/lib/User_Lib/screen/mdn/mdn_screen.rb +24 -0
  381. data/lib/User_Lib/screen/mdn/mdn_search.rb +26 -0
  382. data/lib/User_Lib/screen/mdn/mdn_settings.rb +26 -0
  383. data/lib/User_Lib/screen/mdn/mdn_tv_shows.rb +26 -0
  384. data/lib/User_Lib/screen/mdn/mdn_video_store.rb +26 -0
  385. data/lib/User_Lib/screen/mobile/android/android_devices.rb +35 -0
  386. data/lib/User_Lib/screen/mobile/android/android_dvr.rb +337 -0
  387. data/lib/User_Lib/screen/mobile/android/android_favorites.rb +164 -0
  388. data/lib/User_Lib/screen/mobile/android/android_guide.rb +256 -0
  389. data/lib/User_Lib/screen/mobile/android/android_live_tv.rb +372 -0
  390. data/lib/User_Lib/screen/mobile/android/android_login.rb +111 -0
  391. data/lib/User_Lib/screen/mobile/android/android_main_menu.rb +53 -0
  392. data/lib/User_Lib/screen/mobile/android/android_on_demand.rb +402 -0
  393. data/lib/User_Lib/screen/mobile/android/android_parental_controls.rb +73 -0
  394. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_dvr.rb +31 -0
  395. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_guide.rb +39 -0
  396. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_live_tv.rb +104 -0
  397. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_main_menu.rb +27 -0
  398. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_on_demand.rb +35 -0
  399. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_product_page.rb +7 -0
  400. data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_search.rb +26 -0
  401. data/lib/User_Lib/screen/mobile/android/android_privacy_legal.rb +54 -0
  402. data/lib/User_Lib/screen/mobile/android/android_product_page.rb +484 -0
  403. data/lib/User_Lib/screen/mobile/android/android_screen.rb +56 -0
  404. data/lib/User_Lib/screen/mobile/android/android_search.rb +39 -0
  405. data/lib/User_Lib/screen/mobile/android/android_settings.rb +90 -0
  406. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_dvr.rb +58 -0
  407. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_guide.rb +24 -0
  408. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_live_tv.rb +24 -0
  409. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_main_menu.rb +19 -0
  410. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_on_demand.rb +16 -0
  411. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_product_page.rb +45 -0
  412. data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_search.rb +14 -0
  413. data/lib/User_Lib/screen/mobile/devices_mobile.rb +53 -0
  414. data/lib/User_Lib/screen/mobile/dvr_mobile.rb +5 -0
  415. data/lib/User_Lib/screen/mobile/favorites_mobile.rb +5 -0
  416. data/lib/User_Lib/screen/mobile/guide_mobile.rb +5 -0
  417. data/lib/User_Lib/screen/mobile/ios/ios_devices.rb +43 -0
  418. data/lib/User_Lib/screen/mobile/ios/ios_dvr.rb +231 -0
  419. data/lib/User_Lib/screen/mobile/ios/ios_favorites.rb +79 -0
  420. data/lib/User_Lib/screen/mobile/ios/ios_guide.rb +53 -0
  421. data/lib/User_Lib/screen/mobile/ios/ios_live_tv.rb +413 -0
  422. data/lib/User_Lib/screen/mobile/ios/ios_login.rb +76 -0
  423. data/lib/User_Lib/screen/mobile/ios/ios_main_menu.rb +38 -0
  424. data/lib/User_Lib/screen/mobile/ios/ios_on_demand.rb +371 -0
  425. data/lib/User_Lib/screen/mobile/ios/ios_parental_controls.rb +104 -0
  426. data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_dvr.rb +14 -0
  427. data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_live_tv.rb +36 -0
  428. data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_main_menu.rb +7 -0
  429. data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_on_demand.rb +7 -0
  430. data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_search.rb +13 -0
  431. data/lib/User_Lib/screen/mobile/ios/ios_privacy_legal.rb +56 -0
  432. data/lib/User_Lib/screen/mobile/ios/ios_product_page.rb +441 -0
  433. data/lib/User_Lib/screen/mobile/ios/ios_screen.rb +60 -0
  434. data/lib/User_Lib/screen/mobile/ios/ios_search.rb +145 -0
  435. data/lib/User_Lib/screen/mobile/ios/ios_settings.rb +34 -0
  436. data/lib/User_Lib/screen/mobile/ios/ios_tablet/ios_tablet_live_tv.rb +34 -0
  437. data/lib/User_Lib/screen/mobile/ios/ios_tablet/ios_tablet_main_menu.rb +7 -0
  438. data/lib/User_Lib/screen/mobile/ios/ios_tablet/ios_tablet_on_demand.rb +7 -0
  439. data/lib/User_Lib/screen/mobile/ios/ios_tablet/ios_tablet_search.rb +13 -0
  440. data/lib/User_Lib/screen/mobile/live_tv_mobile.rb +73 -0
  441. data/lib/User_Lib/screen/mobile/login_mobile.rb +5 -0
  442. data/lib/User_Lib/screen/mobile/main_menu_mobile.rb +83 -0
  443. data/lib/User_Lib/screen/mobile/mobile_screen.rb +232 -0
  444. data/lib/User_Lib/screen/mobile/on_demand_mobile.rb +70 -0
  445. data/lib/User_Lib/screen/mobile/parental_controls_mobile.rb +5 -0
  446. data/lib/User_Lib/screen/mobile/privacy_legal_mobile.rb +5 -0
  447. data/lib/User_Lib/screen/mobile/product_page_mobile.rb +5 -0
  448. data/lib/User_Lib/screen/mobile/search_mobile.rb +5 -0
  449. data/lib/User_Lib/screen/mobile/settings_mobile.rb +33 -0
  450. data/lib/User_Lib/screen/passport/passport_dvr.rb +25 -0
  451. data/lib/User_Lib/screen/passport/passport_guide.rb +37 -0
  452. data/lib/User_Lib/screen/passport/passport_library.rb +25 -0
  453. data/lib/User_Lib/screen/passport/passport_live_tv.rb +17 -0
  454. data/lib/User_Lib/screen/passport/passport_main_menu.rb +25 -0
  455. data/lib/User_Lib/screen/passport/passport_mini_guide.rb +25 -0
  456. data/lib/User_Lib/screen/passport/passport_movies.rb +25 -0
  457. data/lib/User_Lib/screen/passport/passport_on_demand.rb +25 -0
  458. data/lib/User_Lib/screen/passport/passport_parental_controls.rb +25 -0
  459. data/lib/User_Lib/screen/passport/passport_product_page.rb +25 -0
  460. data/lib/User_Lib/screen/passport/passport_screen.rb +23 -0
  461. data/lib/User_Lib/screen/passport/passport_search.rb +25 -0
  462. data/lib/User_Lib/screen/passport/passport_settings.rb +25 -0
  463. data/lib/User_Lib/screen/passport/passport_tv_shows.rb +25 -0
  464. data/lib/User_Lib/screen/passport/passport_video_store.rb +25 -0
  465. data/lib/User_Lib/screen/roku/brs/roku_guide_brs.rb +12 -0
  466. data/lib/User_Lib/screen/roku/brs/roku_home_brs.rb +12 -0
  467. data/lib/User_Lib/screen/roku/brs/roku_live_tv_brs.rb +12 -0
  468. data/lib/User_Lib/screen/roku/brs/roku_login_brs.rb +103 -0
  469. data/lib/User_Lib/screen/roku/brs/roku_main_menu_brs.rb +46 -0
  470. data/lib/User_Lib/screen/roku/brs/roku_on_demand_brs.rb +12 -0
  471. data/lib/User_Lib/screen/roku/brs/roku_product_page_brs.rb +12 -0
  472. data/lib/User_Lib/screen/roku/brs/roku_screen_brs.rb +9 -0
  473. data/lib/User_Lib/screen/roku/brs/roku_search_brs.rb +12 -0
  474. data/lib/User_Lib/screen/roku/brs/roku_settings_brs.rb +42 -0
  475. data/lib/User_Lib/screen/roku/brs/roku_watch_later_brs.rb +12 -0
  476. data/lib/User_Lib/screen/roku/brs/roku_welcome_brs.rb +12 -0
  477. data/lib/User_Lib/screen/roku/roku_dvr.rb +7 -0
  478. data/lib/User_Lib/screen/roku/roku_guide.rb +590 -0
  479. data/lib/User_Lib/screen/roku/roku_home.rb +346 -0
  480. data/lib/User_Lib/screen/roku/roku_library.rb +26 -0
  481. data/lib/User_Lib/screen/roku/roku_live_tv.rb +210 -0
  482. data/lib/User_Lib/screen/roku/roku_login.rb +795 -0
  483. data/lib/User_Lib/screen/roku/roku_main_menu.rb +425 -0
  484. data/lib/User_Lib/screen/roku/roku_mini_guide.rb +7 -0
  485. data/lib/User_Lib/screen/roku/roku_on_demand.rb +479 -0
  486. data/lib/User_Lib/screen/roku/roku_product_page.rb +483 -0
  487. data/lib/User_Lib/screen/roku/roku_screen.rb +85 -0
  488. data/lib/User_Lib/screen/roku/roku_search.rb +229 -0
  489. data/lib/User_Lib/screen/roku/roku_settings.rb +304 -0
  490. data/lib/User_Lib/screen/roku/roku_watch_later.rb +51 -0
  491. data/lib/User_Lib/screen/roku/roku_welcome.rb +10 -0
  492. data/lib/User_Lib/screen/roku_tv/roku_tv_dvr.rb +14 -0
  493. data/lib/User_Lib/screen/roku_tv/roku_tv_guide.rb +14 -0
  494. data/lib/User_Lib/screen/roku_tv/roku_tv_home.rb +14 -0
  495. data/lib/User_Lib/screen/roku_tv/roku_tv_library.rb +14 -0
  496. data/lib/User_Lib/screen/roku_tv/roku_tv_live_tv.rb +14 -0
  497. data/lib/User_Lib/screen/roku_tv/roku_tv_login.rb +14 -0
  498. data/lib/User_Lib/screen/roku_tv/roku_tv_main_menu.rb +14 -0
  499. data/lib/User_Lib/screen/roku_tv/roku_tv_mini_guide.rb +14 -0
  500. data/lib/User_Lib/screen/roku_tv/roku_tv_on_demand.rb +26 -0
  501. data/lib/User_Lib/screen/roku_tv/roku_tv_product_page.rb +14 -0
  502. data/lib/User_Lib/screen/roku_tv/roku_tv_screen.rb +7 -0
  503. data/lib/User_Lib/screen/roku_tv/roku_tv_search.rb +14 -0
  504. data/lib/User_Lib/screen/roku_tv/roku_tv_settings.rb +14 -0
  505. data/lib/User_Lib/screen/roku_tv/roku_tv_watch_later.rb +14 -0
  506. data/lib/User_Lib/screen/roku_tv/roku_tv_welcome.rb +14 -0
  507. data/lib/User_Lib/screen/samsung_tv/samsung_tv_dvr.rb +24 -0
  508. data/lib/User_Lib/screen/samsung_tv/samsung_tv_guide.rb +24 -0
  509. data/lib/User_Lib/screen/samsung_tv/samsung_tv_library.rb +24 -0
  510. data/lib/User_Lib/screen/samsung_tv/samsung_tv_live_tv.rb +21 -0
  511. data/lib/User_Lib/screen/samsung_tv/samsung_tv_login.rb +13 -0
  512. data/lib/User_Lib/screen/samsung_tv/samsung_tv_main_menu.rb +64 -0
  513. data/lib/User_Lib/screen/samsung_tv/samsung_tv_mini_guide.rb +24 -0
  514. data/lib/User_Lib/screen/samsung_tv/samsung_tv_movies.rb +140 -0
  515. data/lib/User_Lib/screen/samsung_tv/samsung_tv_on_demand.rb +76 -0
  516. data/lib/User_Lib/screen/samsung_tv/samsung_tv_parental_controls.rb +24 -0
  517. data/lib/User_Lib/screen/samsung_tv/samsung_tv_product_page.rb +24 -0
  518. data/lib/User_Lib/screen/samsung_tv/samsung_tv_screen.rb +74 -0
  519. data/lib/User_Lib/screen/samsung_tv/samsung_tv_search.rb +29 -0
  520. data/lib/User_Lib/screen/samsung_tv/samsung_tv_settings.rb +189 -0
  521. data/lib/User_Lib/screen/samsung_tv/samsung_tv_tv_shows.rb +24 -0
  522. data/lib/User_Lib/screen/samsung_tv/samsung_tv_video_store.rb +24 -0
  523. data/lib/User_Lib/screen/sara/sara_dvr.rb +26 -0
  524. data/lib/User_Lib/screen/sara/sara_guide.rb +43 -0
  525. data/lib/User_Lib/screen/sara/sara_library.rb +26 -0
  526. data/lib/User_Lib/screen/sara/sara_live_tv.rb +26 -0
  527. data/lib/User_Lib/screen/sara/sara_log_in.rb +26 -0
  528. data/lib/User_Lib/screen/sara/sara_main_menu.rb +26 -0
  529. data/lib/User_Lib/screen/sara/sara_mini_guide.rb +26 -0
  530. data/lib/User_Lib/screen/sara/sara_movies.rb +26 -0
  531. data/lib/User_Lib/screen/sara/sara_on_demand.rb +26 -0
  532. data/lib/User_Lib/screen/sara/sara_parental_controls.rb +26 -0
  533. data/lib/User_Lib/screen/sara/sara_product_page.rb +26 -0
  534. data/lib/User_Lib/screen/sara/sara_screen.rb +24 -0
  535. data/lib/User_Lib/screen/sara/sara_search.rb +26 -0
  536. data/lib/User_Lib/screen/sara/sara_settings.rb +26 -0
  537. data/lib/User_Lib/screen/sara/sara_tv_shows.rb +26 -0
  538. data/lib/User_Lib/screen/sara/sara_video_store.rb +26 -0
  539. data/lib/User_Lib/screen/stb/iguide/iguide_devices.rb +10 -0
  540. data/lib/User_Lib/screen/stb/iguide/iguide_dvr.rb +10 -0
  541. data/lib/User_Lib/screen/stb/iguide/iguide_favorites.rb +10 -0
  542. data/lib/User_Lib/screen/stb/iguide/iguide_guide.rb +39 -0
  543. data/lib/User_Lib/screen/stb/iguide/iguide_home.rb +10 -0
  544. data/lib/User_Lib/screen/stb/iguide/iguide_library.rb +10 -0
  545. data/lib/User_Lib/screen/stb/iguide/iguide_live_tv.rb +59 -0
  546. data/lib/User_Lib/screen/stb/iguide/iguide_login.rb +10 -0
  547. data/lib/User_Lib/screen/stb/iguide/iguide_main_menu.rb +10 -0
  548. data/lib/User_Lib/screen/stb/iguide/iguide_mini_guide.rb +10 -0
  549. data/lib/User_Lib/screen/stb/iguide/iguide_movies.rb +10 -0
  550. data/lib/User_Lib/screen/stb/iguide/iguide_on_demand.rb +531 -0
  551. data/lib/User_Lib/screen/stb/iguide/iguide_parental_controls.rb +10 -0
  552. data/lib/User_Lib/screen/stb/iguide/iguide_privacy_legal.rb +10 -0
  553. data/lib/User_Lib/screen/stb/iguide/iguide_product_page.rb +10 -0
  554. data/lib/User_Lib/screen/stb/iguide/iguide_quick_menu.rb +7 -0
  555. data/lib/User_Lib/screen/stb/iguide/iguide_screen.rb +21 -0
  556. data/lib/User_Lib/screen/stb/iguide/iguide_search.rb +10 -0
  557. data/lib/User_Lib/screen/stb/iguide/iguide_settings.rb +10 -0
  558. data/lib/User_Lib/screen/stb/iguide/iguide_tv_shows.rb +10 -0
  559. data/lib/User_Lib/screen/stb/iguide/iguide_video_store.rb +10 -0
  560. data/lib/User_Lib/screen/stb/login_stb.rb +5 -0
  561. data/lib/User_Lib/screen/stb/odn/odn_dvr.rb +59 -0
  562. data/lib/User_Lib/screen/stb/odn/odn_favorites.rb +8 -0
  563. data/lib/User_Lib/screen/stb/odn/odn_guide.rb +177 -0
  564. data/lib/User_Lib/screen/stb/odn/odn_live_tv.rb +115 -0
  565. data/lib/User_Lib/screen/stb/odn/odn_login.rb +8 -0
  566. data/lib/User_Lib/screen/stb/odn/odn_main_menu.rb +175 -0
  567. data/lib/User_Lib/screen/stb/odn/odn_on_demand.rb +1170 -0
  568. data/lib/User_Lib/screen/stb/odn/odn_on_demand_kids.rb +23 -0
  569. data/lib/User_Lib/screen/stb/odn/odn_on_demand_left_menu.rb +180 -0
  570. data/lib/User_Lib/screen/stb/odn/odn_parental_controls.rb +9 -0
  571. data/lib/User_Lib/screen/stb/odn/odn_product_page.rb +8 -0
  572. data/lib/User_Lib/screen/stb/odn/odn_screen.rb +111 -0
  573. data/lib/User_Lib/screen/stb/odn/odn_search.rb +167 -0
  574. data/lib/User_Lib/screen/stb/odn/odn_settings.rb +142 -0
  575. data/lib/User_Lib/screen/stb/spectrum/spectrum_diagnostics.rb +27 -0
  576. data/lib/User_Lib/screen/stb/spectrum/spectrum_docsis/screen_spectrum_docsis.rb +12 -0
  577. data/lib/User_Lib/screen/stb/spectrum/spectrum_docsis/spectrum_1080_docsis_guide.rb +10 -0
  578. data/lib/User_Lib/screen/stb/spectrum/spectrum_docsis/spectrum_1080_docsis_main_menu.rb +10 -0
  579. data/lib/User_Lib/screen/stb/spectrum/spectrum_docsis/spectrum_1080_docsis_settings.rb +10 -0
  580. data/lib/User_Lib/screen/stb/spectrum/spectrum_dvr.rb +1781 -0
  581. data/lib/User_Lib/screen/stb/spectrum/spectrum_guide.rb +841 -0
  582. data/lib/User_Lib/screen/stb/spectrum/spectrum_library.rb +384 -0
  583. data/lib/User_Lib/screen/stb/spectrum/spectrum_live_tv.rb +259 -0
  584. data/lib/User_Lib/screen/stb/spectrum/spectrum_main_menu.rb +223 -0
  585. data/lib/User_Lib/screen/stb/spectrum/spectrum_mini_guide.rb +404 -0
  586. data/lib/User_Lib/screen/stb/spectrum/spectrum_movies.rb +420 -0
  587. data/lib/User_Lib/screen/stb/spectrum/spectrum_netflix.rb +37 -0
  588. data/lib/User_Lib/screen/stb/spectrum/spectrum_on_demand.rb +2137 -0
  589. data/lib/User_Lib/screen/stb/spectrum/spectrum_parental_controls.rb +528 -0
  590. data/lib/User_Lib/screen/stb/spectrum/spectrum_pay_per_view.rb +26 -0
  591. data/lib/User_Lib/screen/stb/spectrum/spectrum_product_page.rb +58 -0
  592. data/lib/User_Lib/screen/stb/spectrum/spectrum_screen.rb +48 -0
  593. data/lib/User_Lib/screen/stb/spectrum/spectrum_search.rb +92 -0
  594. data/lib/User_Lib/screen/stb/spectrum/spectrum_settings.rb +1657 -0
  595. data/lib/User_Lib/screen/stb/spectrum/spectrum_tv_shows.rb +1532 -0
  596. data/lib/User_Lib/screen/stb/spectrum/spectrum_video_store.rb +1598 -0
  597. data/lib/User_Lib/screen/stb/stb_screen.rb +7 -0
  598. data/lib/User_Lib/screen/tivo/tivo_dvr.rb +25 -0
  599. data/lib/User_Lib/screen/tivo/tivo_guide.rb +25 -0
  600. data/lib/User_Lib/screen/tivo/tivo_library.rb +25 -0
  601. data/lib/User_Lib/screen/tivo/tivo_live_tv.rb +17 -0
  602. data/lib/User_Lib/screen/tivo/tivo_login.rb +25 -0
  603. data/lib/User_Lib/screen/tivo/tivo_main_menu.rb +25 -0
  604. data/lib/User_Lib/screen/tivo/tivo_mini_guide.rb +25 -0
  605. data/lib/User_Lib/screen/tivo/tivo_movies.rb +25 -0
  606. data/lib/User_Lib/screen/tivo/tivo_on_demand.rb +25 -0
  607. data/lib/User_Lib/screen/tivo/tivo_parental_controls.rb +25 -0
  608. data/lib/User_Lib/screen/tivo/tivo_product_page.rb +25 -0
  609. data/lib/User_Lib/screen/tivo/tivo_screen.rb +20 -0
  610. data/lib/User_Lib/screen/tivo/tivo_search.rb +31 -0
  611. data/lib/User_Lib/screen/tivo/tivo_settings.rb +25 -0
  612. data/lib/User_Lib/screen/tivo/tivo_tv_shows.rb +25 -0
  613. data/lib/User_Lib/screen/tivo/tivo_video_store.rb +25 -0
  614. data/lib/config/ConfigParams.xml +96 -0
  615. data/lib/config/ImageROI.xml +45 -0
  616. data/lib/config/ROI.xml +150 -0
  617. data/lib/config/Userlog4j.xml +62 -0
  618. data/lib/config/schema-docs/mode.xsd +12 -0
  619. data/lib/config/schema-docs/processTestJobs.xsd +63 -0
  620. data/lib/config/schema-docs/rackip.xsd +24 -0
  621. data/lib/copy_ref_images.rb +199 -0
  622. data/lib/copy_repo.rb +136 -0
  623. data/lib/diagnostics/conductor/conductor_checkup.tmc +24 -0
  624. data/lib/diagnostics/db/mad_db_check.tmc +56 -0
  625. data/lib/diagnostics/db/mas_db_checkup.tmc +24 -0
  626. data/lib/diagnostics/db/mas_db_checkup_gem.tmc +20 -0
  627. data/lib/diagnostics/db/mas_db_checkup_jar.tmc +50 -0
  628. data/lib/diagnostics/iguide/iguide_nvram_reset.tmc +23 -0
  629. data/lib/diagnostics/iguide/iguide_prepare_stb.tmc +33 -0
  630. data/lib/diagnostics/iguide/iguide_prepare_stb_and_health_check.tmc +63 -0
  631. data/lib/diagnostics/iguide/iguide_stb_health_check.tmc +54 -0
  632. data/lib/diagnostics/prepare_stb.tmc +30 -0
  633. data/lib/diagnostics/prepare_stb_and_health_check.tmc +56 -0
  634. data/lib/diagnostics/script_options/options_checkup.tmc +145 -0
  635. data/lib/diagnostics/server_components_check.tmc +62 -0
  636. data/lib/diagnostics/ssh/dncs_checkup.tmc +24 -0
  637. data/lib/diagnostics/ssh/mas_checkup.tmc +24 -0
  638. data/lib/diagnostics/stb_health_check.tmc +46 -0
  639. data/lib/diagnostics/stb_ip_check.tmc +120 -0
  640. data/lib/diagnostics/webservices/mas_rest_services_checkup.tmc +24 -0
  641. data/lib/diagnostics/webservices/mas_soap_services_checkup.tmc +24 -0
  642. data/lib/dsllib/common/dncs/dncs_utils.rb +449 -0
  643. data/lib/dsllib/common/mas_db/mas_conductor.rb +1328 -0
  644. data/lib/dsllib/common/mas_db/mas_db.rb +154 -0
  645. data/lib/dsllib/common/mas_db/mas_publish.rb +2349 -0
  646. data/lib/dsllib/common/mas_db/mas_rest_services.rb +75 -0
  647. data/lib/dsllib/common/mas_db/mas_soap_services.rb +540 -0
  648. data/lib/dsllib/common/mas_db/mas_utils.rb +422 -0
  649. data/lib/dsllib/common/remote_diagnostics/mdn_remote_diagnostics.rb +1335 -0
  650. data/lib/dsllib/common/remote_diagnostics/odn_web_server.rb +269 -0
  651. data/lib/dsllib/common/utils/excel_export.rb +273 -0
  652. data/lib/dsllib/common/utils/excel_module.rb +890 -0
  653. data/lib/dsllib/common/utils/server_components_utils.rb +130 -0
  654. data/lib/dsllib/common/utils/stb_health_check_utils.rb +92 -0
  655. data/lib/dsllib/common/utils/sword_utils.rb +393 -0
  656. data/lib/dsllib/common/utils/tmc_utils.rb +2944 -0
  657. data/lib/dsllib/common/utils/virtual_keyboard_navigator.rb +208 -0
  658. data/lib/dsllib/common/utils/virtual_keyboard_vp_navigator.rb +195 -0
  659. data/lib/dsllib/performance/DTA/roi.rb +214 -0
  660. data/lib/dsllib/performance/DTA/utils.rb +96 -0
  661. data/lib/dsllib/performance/iguide_concurrent_test/ROI.rb +236 -0
  662. data/lib/dsllib/performance/iguide_concurrent_test/utils.rb +533 -0
  663. data/lib/dsllib/performance/measure_tune.rb +438 -0
  664. data/lib/dsllib/performance/perf_lib.rb +660 -0
  665. data/lib/end_iteration.rb +4 -0
  666. data/lib/lib/data_services/channel.rb +39 -0
  667. data/lib/lib/data_services/data_services.rb +14 -0
  668. data/lib/lib/data_services/guide.rb +104 -0
  669. data/lib/lib/data_services/lineup.rb +114 -0
  670. data/lib/lib/data_services/program.rb +48 -0
  671. data/lib/lib/data_services/schedule.rb +18 -0
  672. data/lib/lib/data_services/splunk_connector.rb +135 -0
  673. data/lib/lib/data_services/splunk_data_reader.rb +77 -0
  674. data/lib/lib/element/element.rb +79 -0
  675. data/lib/lib/extensions/array_extensions.rb +32 -0
  676. data/lib/lib/extensions/datetime_extensions.rb +8 -0
  677. data/lib/lib/extensions/extensions.rb +51 -0
  678. data/lib/lib/extensions/file_extensions.rb +32 -0
  679. data/lib/lib/extensions/float_extensions.rb +32 -0
  680. data/lib/lib/extensions/integer_extensions.rb +39 -0
  681. data/lib/lib/extensions/nethttp_extensions.rb +11 -0
  682. data/lib/lib/extensions/object_extensions.rb +7 -0
  683. data/lib/lib/extensions/string_extensions.rb +35 -0
  684. data/lib/lib/helpers/tmc_helpers/csv_helper/csv_helper.rb +85 -0
  685. data/lib/lib/helpers/tmc_helpers/email_helper/email_helper.rb +71 -0
  686. data/lib/lib/helpers/tmc_helpers/http_helper/http_helper.rb +133 -0
  687. data/lib/lib/helpers/tmc_helpers/roi_helper/roi_helper.rb +17 -0
  688. data/lib/lib/helpers/tmc_helpers/snmp_helper/snmp_helper.rb +71 -0
  689. data/lib/lib/helpers/tmc_helpers/ssh_helper/ssh_helper.rb +337 -0
  690. data/lib/lib/helpers/tmc_helpers/tmc_helpers.rb +1260 -0
  691. data/lib/lib/keyboard/apple_tv/apple_tv_password_keyboard.rb +102 -0
  692. data/lib/lib/keyboard/apple_tv/apple_tv_search_keyboard.rb +103 -0
  693. data/lib/lib/keyboard/apple_tv/apple_tv_username_keyboard.rb +105 -0
  694. data/lib/lib/keyboard/keyboard.rb +504 -0
  695. data/lib/lib/keyboard/keyboard_layout.rb +51 -0
  696. data/lib/lib/keyboard/roku/roku_reset_pin_keyboard.rb +12 -0
  697. data/lib/lib/keyboard/roku/roku_rsg_search_keyboard.rb +67 -0
  698. data/lib/lib/keyboard/roku/roku_rsg_signin_keyboard.rb +106 -0
  699. data/lib/lib/keyboard/roku/roku_search_keyboard.rb +10 -0
  700. data/lib/lib/keyboard/roku/roku_signin_keyboard.rb +42 -0
  701. data/lib/lib/keyboard/samsung_tv/samsung_tv_search_keyboard.rb +50 -0
  702. data/lib/lib/keyboard/samsung_tv/samsung_tv_signin_keyboard.rb +52 -0
  703. data/lib/lib/keyboard/stb/odn/odn_on_demand_search_keyboard.rb +10 -0
  704. data/lib/lib/keyboard/stb/odn/odn_search_keyboard.rb +10 -0
  705. data/lib/lib/keyboard/stb/spectrum/spectrum_netflix_email_keyboard.rb +50 -0
  706. data/lib/lib/keyboard/stb/spectrum/spectrum_netflix_keyboard.rb +43 -0
  707. data/lib/lib/keyboard/stb/spectrum/spectrum_netflix_name_keyboard.rb +16 -0
  708. data/lib/lib/keyboard/stb/spectrum/spectrum_search_keyboard.rb +32 -0
  709. data/lib/lib/keyboard/tivo/tivo_password_keyboard.rb +0 -0
  710. data/lib/lib/keyboard/tivo/tivo_search_keyboard.rb +0 -0
  711. data/lib/lib/keyboard/tivo/tivo_username_keyboard.rb +0 -0
  712. data/lib/lib/keys/apple_tv/apple_tv_keys.rb +26 -0
  713. data/lib/lib/keys/base_keys.rb +14 -0
  714. data/lib/lib/keys/dta/dta_keys.rb +60 -0
  715. data/lib/lib/keys/mdn/mdn_keys.rb +60 -0
  716. data/lib/lib/keys/passport/passport_keys.rb +59 -0
  717. data/lib/lib/keys/roku/roku_keys.rb +31 -0
  718. data/lib/lib/keys/roku_tv/roku_tv_keys.rb +32 -0
  719. data/lib/lib/keys/samsung_tv/samsung_tv_keys.rb +58 -0
  720. data/lib/lib/keys/sara/sara_keys.rb +60 -0
  721. data/lib/lib/keys/stb/iguide/iguide_keys.rb +56 -0
  722. data/lib/lib/keys/stb/odn/odn_keys.rb +63 -0
  723. data/lib/lib/keys/stb/spectrum/spectrum_keys.rb +59 -0
  724. data/lib/lib/keys/stb/stb_keys.rb +13 -0
  725. data/lib/lib/keys/tivo/tivo_keys.rb +26 -0
  726. data/lib/lib/logger/multi_io.rb +14 -0
  727. data/lib/lib/logger/tmc_dut_logger.rb +251 -0
  728. data/lib/lib/logger/tmc_logger.rb +30 -0
  729. data/lib/lib/mixins/assignable.rb +19 -0
  730. data/lib/lib/mixins/can_have_special_methods.rb +50 -0
  731. data/lib/lib/mixins/enumish.rb +16 -0
  732. data/lib/lib/new_platform.rb +302 -0
  733. data/lib/lib/new_sub_platform.rb +90 -0
  734. data/lib/lib/platform/apple_tv/apple_tv.rb +33 -0
  735. data/lib/lib/platform/apple_tv/apple_tv_1080/apple_tv_1080.rb +54 -0
  736. data/lib/lib/platform/apple_tv/apple_tv_720/apple_tv_720.rb +14 -0
  737. data/lib/lib/platform/dta/dta.rb +35 -0
  738. data/lib/lib/platform/dta/dta_1080/dta_1080.rb +15 -0
  739. data/lib/lib/platform/dta/dta_720/dta_720.rb +15 -0
  740. data/lib/lib/platform/mdn/mdn.rb +35 -0
  741. data/lib/lib/platform/mdn/mdn_1080/mdn_1080.rb +15 -0
  742. data/lib/lib/platform/mdn/mdn_720/mdn_720.rb +15 -0
  743. data/lib/lib/platform/mobile/android/android.rb +23 -0
  744. data/lib/lib/platform/mobile/android/android_phone/android_phone.rb +23 -0
  745. data/lib/lib/platform/mobile/android/android_tablet/android_tablet.rb +23 -0
  746. data/lib/lib/platform/mobile/ios/ios.rb +23 -0
  747. data/lib/lib/platform/mobile/ios/ios_phone/ios_phone.rb +23 -0
  748. data/lib/lib/platform/mobile/ios/ios_tablet/ios_tablet.rb +23 -0
  749. data/lib/lib/platform/mobile/mobile.rb +102 -0
  750. data/lib/lib/platform/passport/passport.rb +41 -0
  751. data/lib/lib/platform/passport/passport1080/passport_1080.rb +15 -0
  752. data/lib/lib/platform/passport/passport_720/passport_720.rb +14 -0
  753. data/lib/lib/platform/platform.rb +884 -0
  754. data/lib/lib/platform/roku/roku.rb +96 -0
  755. data/lib/lib/platform/roku/roku_720/roku_720.rb +16 -0
  756. data/lib/lib/platform/roku_tv/roku_tv.rb +33 -0
  757. data/lib/lib/platform/roku_tv/roku_tv_1080/roku_tv_1080.rb +14 -0
  758. data/lib/lib/platform/roku_tv/roku_tv_720/roku_tv_720.rb +14 -0
  759. data/lib/lib/platform/samsung_tv/samsung_tv.rb +31 -0
  760. data/lib/lib/platform/samsung_tv/samsung_tv_1080/samsung_tv_1080.rb +14 -0
  761. data/lib/lib/platform/samsung_tv/samsung_tv_720/samsung_tv_720.rb +14 -0
  762. data/lib/lib/platform/sara/sara.rb +42 -0
  763. data/lib/lib/platform/sara/sara_1080/sara_1080.rb +15 -0
  764. data/lib/lib/platform/sara/sara_720/sara_720.rb +15 -0
  765. data/lib/lib/platform/stb/iguide/iguide.rb +18 -0
  766. data/lib/lib/platform/stb/iguide/iguide_1080/iguide_1080.rb +14 -0
  767. data/lib/lib/platform/stb/iguide/iguide_720/iguide_720.rb +14 -0
  768. data/lib/lib/platform/stb/odn/odn.rb +480 -0
  769. data/lib/lib/platform/stb/odn/odn_1080/odn_1080.rb +14 -0
  770. data/lib/lib/platform/stb/odn/odn_720/odn_720.rb +14 -0
  771. data/lib/lib/platform/stb/odn/odn_720/odn_720_moto/odn_720_moto.rb +14 -0
  772. data/lib/lib/platform/stb/odn/odn_720/odn_720_sa/odn_720_sa.rb +14 -0
  773. data/lib/lib/platform/stb/odn/odn_720/odn_720_samsung/odn_720_samsung.rb +14 -0
  774. data/lib/lib/platform/stb/spectrum/spectrum.rb +48 -0
  775. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080.rb +14 -0
  776. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis.rb +16 -0
  777. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris.rb +15 -0
  778. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax.rb +15 -0
  779. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch.rb +15 -0
  780. data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace.rb +14 -0
  781. data/lib/lib/platform/stb/spectrum/spectrum_720/spectrum_720.rb +14 -0
  782. data/lib/lib/platform/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris.rb +15 -0
  783. data/lib/lib/platform/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax.rb +15 -0
  784. data/lib/lib/platform/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch.rb +15 -0
  785. data/lib/lib/platform/stb/stb.rb +93 -0
  786. data/lib/lib/platform/template.txt +16 -0
  787. data/lib/lib/platform/tivo/tivo.rb +28 -0
  788. data/lib/lib/platform/tivo/tivo_1080/tivo_1080.rb +15 -0
  789. data/lib/lib/platform/tivo/tivo_720/tivo_720.rb +14 -0
  790. data/lib/lib/platform/web/web.rb +51 -0
  791. data/lib/lib/platform_libs/roku/roku_controller.rb +254 -0
  792. data/lib/lib/prereqs/prereqs.rb +17 -0
  793. data/lib/lib/prereqs/prereqs_for_dut.rb +14 -0
  794. data/lib/lib/prereqs/prereqs_for_test.rb +14 -0
  795. data/lib/lib/remotes/remotes.rb +8 -0
  796. data/lib/lib/remotes/stb/spectrum/spectrum_remotes.rb +22 -0
  797. data/lib/lib/roi/black/black_roi.rb +125 -0
  798. data/lib/lib/roi/color/color_roi.rb +138 -0
  799. data/lib/lib/roi/image/image_roi.rb +187 -0
  800. data/lib/lib/roi/roi.rb +1064 -0
  801. data/lib/lib/roi/template_roi.txt +9 -0
  802. data/lib/lib/roi/text/text_roi.rb +187 -0
  803. data/lib/lib/roi/video/video_roi.rb +98 -0
  804. data/lib/lib/screen/screen.rb +183 -0
  805. data/lib/lib/screen/template.txt +7 -0
  806. data/lib/lib/screen/template_screen.txt +10 -0
  807. data/lib/lib/screens/apple_tv/apple_tv_screens.rb +44 -0
  808. data/lib/lib/screens/dta/dta_screens.rb +49 -0
  809. data/lib/lib/screens/mdn/mdn_screens.rb +49 -0
  810. data/lib/lib/screens/mobile/android/android_phone/android_phone_screens.rb +28 -0
  811. data/lib/lib/screens/mobile/android/android_screens.rb +40 -0
  812. data/lib/lib/screens/mobile/android/android_tablet/android_tablet_screens.rb +29 -0
  813. data/lib/lib/screens/mobile/ios/ios_phone/ios_phone_screens.rb +22 -0
  814. data/lib/lib/screens/mobile/ios/ios_screens.rb +39 -0
  815. data/lib/lib/screens/mobile/ios/ios_tablet/ios_tablet_screens.rb +20 -0
  816. data/lib/lib/screens/mobile/mobile_screens.rb +18 -0
  817. data/lib/lib/screens/passport/passport_screens.rb +42 -0
  818. data/lib/lib/screens/roku/roku_screens.rb +72 -0
  819. data/lib/lib/screens/roku_tv/roku_tv_screens.rb +43 -0
  820. data/lib/lib/screens/samsung_tv/samsung_tv_screens.rb +44 -0
  821. data/lib/lib/screens/sara/sara_screens.rb +49 -0
  822. data/lib/lib/screens/screens.rb +23 -0
  823. data/lib/lib/screens/stb/iguide/iguide_1080/iguide_1080_screens.rb +56 -0
  824. data/lib/lib/screens/stb/iguide/iguide_720/iguide_720_screens.rb +56 -0
  825. data/lib/lib/screens/stb/iguide/iguide_screens.rb +54 -0
  826. data/lib/lib/screens/stb/odn/odn_screens.rb +40 -0
  827. data/lib/lib/screens/stb/spectrum/spectrum_docsis/spectrum_1080_docsis_screens.rb +18 -0
  828. data/lib/lib/screens/stb/spectrum/spectrum_screens.rb +48 -0
  829. data/lib/lib/screens/stb/stb_screens.rb +13 -0
  830. data/lib/lib/screens/template.txt +52 -0
  831. data/lib/lib/screens/tivo/tivo_screens.rb +44 -0
  832. data/lib/lib/selenium/appium/appium.rb +388 -0
  833. data/lib/lib/selenium/selenium.rb +466 -0
  834. data/lib/lib/selenium/webdriver/webdriver.rb +254 -0
  835. data/lib/lib/test_case/boilerplate/functional.rb +7 -0
  836. data/lib/lib/test_case/boilerplate/performance.rb +7 -0
  837. data/lib/lib/test_case/ci_test.rb +47 -0
  838. data/lib/lib/test_case/functional_test_case.rb +27 -0
  839. data/lib/lib/test_case/make_boilerplate.rb +32 -0
  840. data/lib/lib/test_case/monitoring/apple_monitor.rb +104 -0
  841. data/lib/lib/test_case/monitoring/base_monitor.rb +140 -0
  842. data/lib/lib/test_case/monitoring/dta_monitor.rb +53 -0
  843. data/lib/lib/test_case/monitoring/iguide_monitor.rb +72 -0
  844. data/lib/lib/test_case/monitoring/mdn_monitor.rb +28 -0
  845. data/lib/lib/test_case/monitoring/monitoring_test.rb +111 -0
  846. data/lib/lib/test_case/monitoring/odn_monitor.rb +137 -0
  847. data/lib/lib/test_case/monitoring/passport_monitor.rb +50 -0
  848. data/lib/lib/test_case/monitoring/report_monitor.rb +178 -0
  849. data/lib/lib/test_case/monitoring/roku_monitor.rb +102 -0
  850. data/lib/lib/test_case/monitoring/sara_monitor.rb +33 -0
  851. data/lib/lib/test_case/monitoring/spec_monitor.rb +154 -0
  852. data/lib/lib/test_case/performance_test_case.rb +29 -0
  853. data/lib/lib/test_case/test_case.rb +1055 -0
  854. data/lib/lib/test_case/test_error.rb +29 -0
  855. data/lib/lib/test_case/test_exception.rb +9 -0
  856. data/lib/lib/test_case/test_status.rb +39 -0
  857. data/lib/lib/test_case/test_step.rb +156 -0
  858. data/lib/lib/test_case/test_trace.rb +80 -0
  859. data/lib/lib/test_data.rb +222 -0
  860. data/lib/lib/test_wrapper.rb +146 -0
  861. data/lib/misc/get_latest_android.sh +14 -0
  862. data/lib/misc/get_latest_ios.sh +14 -0
  863. data/lib/package-lock.json +3 -0
  864. data/lib/run_test.rb +4 -0
  865. data/lib/script_validator.rb +48 -0
  866. data/lib/syntax_eval.rb +151 -0
  867. data/lib/tools/convert_old_scripts.rb +100 -0
  868. data/lib/tools/find_duplicate_rois.rb +27 -0
  869. data/lib/tools/roku/inspector.rb +130 -0
  870. data/lib/tools/syntax_checker.rb +83 -0
  871. data/lib/upload_ref_images.rb +255 -0
  872. metadata +912 -0
@@ -0,0 +1,1260 @@
1
+ require 'time'
2
+ require 'fileutils'
3
+ require 'pathname'
4
+ require './lib/helpers/tmc_helpers/ssh_helper/ssh_helper'
5
+ require './lib/helpers/tmc_helpers/snmp_helper/snmp_helper'
6
+ require './lib/helpers/tmc_helpers/email_helper/email_helper'
7
+ require './lib/helpers/tmc_helpers/csv_helper/csv_helper'
8
+ require './lib/helpers/tmc_helpers/http_helper/http_helper'
9
+
10
+ # AWS defaults
11
+ ENV['AWS_ACCESS_KEY_ID'] = 'AKIAJR4GME4RASTKVXXQ'
12
+ ENV['AWS_SECRET_ACCESS_KEY'] = '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'
13
+ ENV['AWS_REGION'] = 'us-west-2'
14
+ ENV['AWS_DEFAULT_BUCKET'] = 'charter-testworkbench-com'
15
+
16
+ # The Helpers module contains methods that can be used in test cases, methods, and prerequisites
17
+
18
+ module TmcHelpers
19
+ include SnmpHelper
20
+ include EmailHelper
21
+ include SshHelper
22
+ include CsvHelper
23
+ include HttpHelper
24
+
25
+ # Public: Configures AWS.
26
+ #
27
+ # region - String region (default: nil).
28
+ # access_key_id - String S3 access key ID (default: nil).
29
+ # secret_access_key - String S3 secret access key (default: nil).
30
+ #
31
+ # Returns nothing.
32
+ def aws_config(region: nil, access_key_id: nil, secret_access_key: nil)
33
+ with_aws do
34
+ if access_key_id.nil? || secret_access_key.nil?
35
+ logger.warn("AWS not configured: Missing `access_key_id' or `secret_access_key'")
36
+ return
37
+ end
38
+ Aws.config.update(credentials: Aws::Credentials.new(access_key_id, secret_access_key))
39
+ Aws.config.update(region: region) unless region.nil?
40
+ end
41
+ end
42
+
43
+ # Public: Creates an AWS S3 bucket. TODO: VERIFY FUNCTIONALITY
44
+ #
45
+ # bucket - String name of bucket.
46
+ # options - Hash of options to pass to create (default: {}).
47
+ #
48
+ # Returns nothing.
49
+ def aws_create_s3_bucket(bucket, options={})
50
+ logger.info("Creating S3 bucket: #{bucket}")
51
+ aws do |s3|
52
+ b = s3.bucket(bucket)
53
+ if b.exists?
54
+ raise 'Bucket already exists!'
55
+ end
56
+ b.create(options)
57
+ end
58
+ nil
59
+ end
60
+
61
+ # Public: Deletes an AWS S3 bucket. TODO: VERIFY FUNCTIONALITY
62
+ #
63
+ # bucket - String name of bucket.
64
+ #
65
+ # Returns nothing.
66
+ def aws_delete_s3_bucket(bucket)
67
+ logger.info("Deleting S3 bucket: #{bucket}")
68
+ aws do |s3|
69
+ b = s3.bucket(bucket)
70
+ unless b.exists?
71
+ raise 'Bucket does not exist!'
72
+ end
73
+ b.delete!
74
+ end
75
+ nil
76
+ end
77
+
78
+ # Public: Uploads an object to an AWS S3 bucket.
79
+ #
80
+ # bucket - String name of bucket. The bucket will be created if it does not exist.
81
+ # name - String name of object to write. The object will be overwritten if it already exists.
82
+ # path - String path to object.
83
+ # options - Hash of options to pass to upload (default: {}).
84
+ #
85
+ # Returns the public URI::HTTP for the object.
86
+ def aws_upload_s3(bucket, name, path, options={})
87
+ logger.info("Uploading file to S3 bucket '#{bucket}': #{path} (#{get_readable_size(File.size(path))})")
88
+ aws do |s3|
89
+ o = get_or_create_s3_bucket(s3, bucket).object(name)
90
+ o.upload_file(Pathname.new(path), {acl: 'public-read'}.merge(options))
91
+ url = o.public_url
92
+ logger.info("New file URL: #{url}")
93
+ url
94
+ # do the upload this way to protect the file after N seconds (1 week in this case)
95
+ #o.upload_file(Pathname.new(path), options)
96
+ #o.presigned_url(:get, expires_in: 604800)
97
+ end
98
+ end
99
+
100
+ # Public: Writes an object to an AWS S3 bucket.
101
+ #
102
+ # bucket - String name of bucket. The bucket will be created if it does not exist.
103
+ # name - String name of object to write. The object will be overwritten if it already exists.
104
+ # data - String data to write to object.
105
+ # options - Hash of options to pass to put (default: {}).
106
+ #
107
+ # Returns the public URI::HTTP for the object.
108
+ def aws_write_s3(bucket, name, data, options={})
109
+ logger.info("Writing object to S3 bucket '#{bucket}': #{name} (#{get_readable_size(data.size)})")
110
+ aws do |s3|
111
+ o = get_or_create_s3_bucket(s3, bucket).object(name)
112
+ o.put({body: data, acl: 'public-read'}.merge(options))
113
+ url = o.public_url
114
+ logger.info("New object URL: #{url}")
115
+ url
116
+ # do the PUT this way to protect the file after N seconds (1 week in this case)
117
+ #o.put(options.merge(body: data))
118
+ #o.presigned_url(:get, expires_in: 604800)
119
+ end
120
+ end
121
+
122
+ # Public: Reads an object from an AWS S3 bucket.
123
+ #
124
+ # bucket - String name of bucket.
125
+ # name - String name of object to read.
126
+ # options - Hash of options to pass to read (default: {}).
127
+ #
128
+ # Returns the String object value.
129
+ def aws_read_s3(bucket, name, options={})
130
+ logger.info("Reading object from S3 bucket '#{bucket}': #{name}")
131
+ aws do |s3|
132
+ b = s3.bucket(bucket)
133
+ unless b.exists?
134
+ raise 'Bucket does not exist!'
135
+ end
136
+ o = b.object(name)
137
+ unless o.exists?
138
+ raise 'Object does not exist!'
139
+ end
140
+ o.get(options).body.string
141
+ end
142
+ end
143
+
144
+ # Public: Deletes an object from an AWS S3 bucket.
145
+ #
146
+ # bucket - String name of bucket.
147
+ # name - String name of object to delete.
148
+ # options - Hash of options to pass to delete (default: {}).
149
+ #
150
+ # Returns nothing.
151
+ def aws_delete_s3(bucket, name, options={})
152
+ logger.info("Deleting object from S3 bucket '#{bucket}': #{name}")
153
+ aws do |s3|
154
+ b = s3.bucket(bucket)
155
+ unless b.exists?
156
+ raise 'Bucket does not exist!'
157
+ end
158
+ o = b.object(name)
159
+ unless o.exists?
160
+ raise 'Object does not exist!'
161
+ end
162
+ o.delete(options)
163
+ end
164
+ end
165
+
166
+ # Public: Yields the given block until the result is not empty.
167
+ #
168
+ # timeout - Integer total milliseconds to try meeting the criteria before timing out (default: 30.sec).
169
+ # message - String custom message to log (default: 'executing provided block').
170
+ # block - Block to yield.
171
+ #
172
+ # Returns the final result of yielding the block.
173
+ def until_not_empty(args={}, &block)
174
+ until_condition(:not_empty, args, &block)
175
+ end
176
+
177
+ # Public: Yields the given block until the result is not nil.
178
+ #
179
+ # timeout - Integer total milliseconds to try meeting the criteria before timing out (default: 30.sec).
180
+ # message - String custom message to log (default: 'executing provided block').
181
+ # block - Block to yield.
182
+ #
183
+ # Returns the final result of yielding the block.
184
+ def until_not_nil(args={}, &block)
185
+ until_condition(:not_nil, args, &block)
186
+ end
187
+
188
+ # Public: Yields the given block until the result is the same twice in a row.
189
+ #
190
+ # timeout - Integer total milliseconds to try meeting the criteria before timing out (default: 30.sec).
191
+ # message - String custom message to log (default: 'executing provided block').
192
+ # allow_empty - Boolean indicating whether to consider empty objects (String, Array, etc.) matching (default: false).
193
+ # block - Block to yield.
194
+ #
195
+ # Returns the final result of yielding the block.
196
+ def until_same(args={}, &block)
197
+ until_condition(:same, args, &block)
198
+ end
199
+
200
+ # Public: Yields the given block until the result equals the specified value.
201
+ #
202
+ # value - Object value that must equal the result of the block.
203
+ # timeout - Integer total milliseconds to try meeting the criteria before timing out (default: 30.sec).
204
+ # message - String custom message to log (default: 'executing provided block').
205
+ # block - Block to yield.
206
+ #
207
+ # Returns the final result of yielding the block.
208
+ def until_equals(value, args={}, &block)
209
+ args[:value] = value
210
+ until_condition(:equals, args, &block)
211
+ end
212
+
213
+ # Public: Yields the given block until the result does not equal the specified value.
214
+ #
215
+ # value - Object value that must equal the result of the block.
216
+ # timeout - Integer total milliseconds to try meeting the criteria before timing out (default: 30.sec).
217
+ # message - String custom message to log (default: 'executing provided block').
218
+ # block - Block to yield.
219
+ #
220
+ # Returns the final result of yielding the block.
221
+ def until_not_equals(value, args={}, &block)
222
+ args[:value] = value
223
+ until_condition(:not_equals, args, &block)
224
+ end
225
+
226
+ # Public: Yields the given block until the result includes the specified value.
227
+ #
228
+ # value - Object value that must be included in the result of the block.
229
+ # timeout - Integer total milliseconds to try meeting the criteria before timing out (default: 30.sec).
230
+ # message - String custom message to log (default: 'executing provided block').
231
+ # block - Block to yield.
232
+ #
233
+ # Returns the final result of yielding the block.
234
+ def until_includes(value, args={}, &block)
235
+ args[:value] = value
236
+ until_condition(:includes, args, &block)
237
+ end
238
+
239
+ # Public: Yields the given block until the result does not include the specified value.
240
+ #
241
+ # value - Object value that must not be included in the result of the block.
242
+ # timeout - Integer total milliseconds to try meeting the criteria before timing out (default: 30.sec).
243
+ # message - String custom message to log (default: 'executing provided block').
244
+ # block - Block to yield.
245
+ #
246
+ # Returns the final result of yielding the block.
247
+ def until_not_includes(value, args={}, &block)
248
+ args[:value] = value
249
+ until_condition(:not_includes, args, &block)
250
+ end
251
+
252
+ # Public: Yields the given block until the specified criteria are met or times out.
253
+ #
254
+ # condition - Symbol condition to test. May be one of the following:
255
+ # :not_empty - Returns when the result of the block is not empty.
256
+ # :not_nil - Returns when the result of the block is not nil.
257
+ # :same - Returns when the result of the block is the same twice in a row.
258
+ # :equals - Returns when the given value equals the result of the block.
259
+ # :not_equals - Returns when the given value does not equal the result of the block.
260
+ # :includes - Returns when the given value is included in the result of the block.
261
+ # :not_includes - Returns when the given value is not included in the result of the block.
262
+ # value - Object value (default: nil). Required if needed to test condition.
263
+ # timeout - Integer total milliseconds to try meeting the criteria before timing out (default: 30.sec).
264
+ # message - String custom message to log (default: 'executing provided block').
265
+ # allow_empty - Boolean indicating whether to consider empty objects (String, Array, etc.)
266
+ # matching when the criteria is :same (default: false).
267
+ # block - Block to yield.
268
+ #
269
+ # Returns the final result of yielding the block.
270
+ def until_condition(condition, args={}, &block)
271
+ message = args.fetch(:message, 'executing provided block')
272
+ timeout = args.fetch(:timeout, 30.sec)
273
+ value_str = args[:value].nil? ? '' : " #{args[:value].inspect}"
274
+ logger.info("#{message.capitalize} until #{condition}#{value_str} or timeout (#{timeout} ms)")
275
+ ret = nil
276
+ last_ret = -1
277
+ start_time = Time.now
278
+ while (Time.now - start_time) <= (timeout / 1.sec)
279
+ ret = block.call
280
+ case condition
281
+ when :not_empty
282
+ break unless ret.nil? || ret.empty?
283
+ when :not_nil
284
+ break unless ret.nil?
285
+ when :same
286
+ break if ret == last_ret && (args[:allow_empty] || !ret.empty?)
287
+ last_ret = ret
288
+ when :equals
289
+ if args[:value].is_a?(Regexp)
290
+ break if !ret.nil? && ret =~ args[:value]
291
+ else
292
+ break if ret == args[:value]
293
+ end
294
+ when :not_equals
295
+ if args[:value].is_a?(Regexp)
296
+ break unless ret.nil? || ret =~ args[:value]
297
+ else
298
+ break unless ret == args[:value]
299
+ end
300
+ when :includes
301
+ unless ret.nil?
302
+ if args[:value].is_a?(Regexp)
303
+ break unless ret.select { |val| val =~ args[:value] }.empty?
304
+ else
305
+ break if ret.include?(args[:value])
306
+ end
307
+ end
308
+ when :not_includes
309
+ unless ret.nil?
310
+ if args[:value].is_a?(Regexp)
311
+ break if ret.select { |val| val =~ args[:value] }.empty?
312
+ else
313
+ break unless ret.include?(args[:value])
314
+ end
315
+ end
316
+ else
317
+ raise "Invalid condition: #{condition}"
318
+ end
319
+ sleep(100)
320
+ end
321
+ ret
322
+ end
323
+
324
+ # Public: Picks a random item from the given array.
325
+ #
326
+ # items - Splat Array of items from which to pick.
327
+ #
328
+ # Returns the randomly-chosen item Object.
329
+ def pick_random(*items)
330
+ if items.first.is_a?(Array)
331
+ items = items.first
332
+ end
333
+ logger.info("Picking random item from: #{items.inspect}")
334
+ item = items[items.count > 1 ? rand(items.count) : 0]
335
+ logger.info("Picked #{item.inspect}")
336
+ item
337
+ end
338
+
339
+ # Public: Checks if the given number looks like a modern year (1900 - 2999).
340
+ #
341
+ # yyyy - Integer number to validate.
342
+ #
343
+ # Returns a Boolean true if the number looks like a year, otherwise false.
344
+ def is_year?(yyyy)
345
+ min = 1900
346
+ max = 2999
347
+ logger.info("Checking if #{yyyy.inspect} is a valid year (#{min} - #{max})")
348
+ yyyy.to_i >= min && yyyy.to_i < max
349
+ end
350
+
351
+ # Public: Checks if the given value is a valid movie/series rating.
352
+ #
353
+ # rating - String rating to validate.
354
+ #
355
+ # Returns a Boolean true if the rating is valid, otherwise false.
356
+ def is_rating?(rating)
357
+ valid_ratings = %w(TV-G TV-PG TV-14 TV-MA G PG PG-13 R NC-17 NR)
358
+ logger.info("Checking if #{rating.inspect} is a valid rating (#{valid_ratings.join(', ')})")
359
+ valid_ratings.include?(rating)
360
+ end
361
+
362
+ # Public: Checks to see if a Suite Instance ID exists for the current twb_suite_name.
363
+ #
364
+ # Returns a Boolean true if a Suite Instance ID exists for the current suite. Else, returns a Boolean false.
365
+ def twb_suite_exists?
366
+ test_data.refresh
367
+ if test_data[:report_per_slot]
368
+ return true if test_data.fetch("twb_suite_id_slot#{dut.slot}_iter#{iteration}".to_sym, false)
369
+ return false
370
+ end
371
+ return true if test_data.fetch(:twb_suite_id, false)
372
+ return false
373
+ end
374
+
375
+ # Public: Checks to see if a Case Instance ID exists for the current Slot and Test Case in the Job.
376
+ #
377
+ # Returns a Boolean true if a Case Instance ID exists for the current suite. Else, returns a Boolean false.
378
+ def twb_case_exists?
379
+ test_data.refresh
380
+ return true if test_data.fetch("twb_case_id#{id}_slot#{dut.slot}_iter#{iteration}".to_sym, false)
381
+ return false
382
+ end
383
+
384
+ # Public: Gets a Suite Instance ID for the current twb_suite_name. If one exists already it is used, otherwise a POST to TWB retrieves a new one.
385
+ #
386
+ # twb_suite_name - String name of the test suite (default: test_data[:twb_suite_name]).
387
+ # program_application_name - String name of the program application (default: test_data[:program_application_name]).
388
+ #
389
+ # Returns the String suite_instance_id for the suite or current Job if successful. Else, returns nil.
390
+ def twb_get_suite_instance_id(args={})
391
+ test_suite_name = args.fetch(:twb_suite_name, test_data[:twb_suite_name])
392
+ # Check to see if the Suite Instance Id has already been written to disk
393
+ test_data.refresh
394
+ if twb_suite_exists?
395
+ return test_data.fetch("twb_suite_id_slot#{dut.slot}_iter#{iteration}".to_sym, nil) if test_data[:report_per_slot]
396
+ return test_data.fetch(:twb_suite_id, false)
397
+ else
398
+ program_application_name = args.fetch(:program_application_name, test_data[:program_application_name])
399
+ return twb_post_suite(:twb_suite_name => test_suite_name, :program_application_name => program_application_name)
400
+ end
401
+ end
402
+
403
+ # Public: Gets a Case Instance ID for the current twb_suite_name. If one exists already it is used, otherwise a POST to TWB retrieves a new one.
404
+ #
405
+ # twb_suite_name - String name of the test suite (default: test_data[:twb_suite_name]).
406
+ #
407
+ # Returns the String case_instance_id for the current test case if successful. Else, returns nil.
408
+ def twb_get_case_instance_id(args={})
409
+ test_suite_name = args.fetch(:twb_suite_name, test_data[:twb_suite_name])
410
+ # Check if the Suite & Case Instance Id has already been written to disk
411
+ if twb_case_exists?
412
+ test_data.refresh
413
+ return test_data.fetch("twb_case_id#{id}_slot#{dut.slot}_iter#{iteration}".to_sym, false)
414
+ else
415
+ suite_instance_id = twb_get_suite_instance_id
416
+ return twb_post_testcase(:twb_suite_name => test_suite_name, :suite_instance_id => suite_instance_id)
417
+ end
418
+ end
419
+
420
+ # Public: Takes a screenshot on current STB and POSTS to TWB. The user has the ability to set the Suite & Case instance ID or if a Suite &/or Case ID already exists for the twb_suite_name or current Job Name, those will be used. In the case where neither a Suite & Case instance ID are provided and they don't already exist for the twb_suite_name or Job Name, new ones will be retrieved from TWB.
421
+ #
422
+ # twb_suite_name - String name of the Test Suite Name to report to (default: test_data[:twb_suite_name])
423
+ # program_application_name - String name of the Program Application to report to (default: test_data[:program_application_name]).
424
+ # ss_filename - String filename of image to POST. If none is provided a screenshot on active stb will be captured (default: nil)
425
+ # timeout - Integer total milliseconds to wait for a response (default: 5.min).
426
+ # verify_mode - Integer desired HTTP verify mode (default: nil).
427
+ # uri - String full URI for the resource to request(default: "http://charter.testworkbench.com/ords/test/postScreenshots/#{case_instance_id}").
428
+ # case_instance_id - result of twb_get_case_instance_id
429
+ # suite_instance_id - result of twb_get_suite_instance_id
430
+ # size - number from 0 to 100 for percentage size of the image
431
+ # quality - number from 0 to 100 for image quality
432
+ #
433
+ # Returns the path to the screenshot file, ss_filename
434
+ def twb_post_screenshot(args={})
435
+ test_suite_name = (args.key?(:twb_suite_name)) ? args[:twb_suite_name] : test_data[:twb_suite_name]
436
+ program_application_name = (args.key?(:program_application_name)) ? args[:program_application_name] : test_data[:program_application_name]
437
+ suite_instance_id = (args.key?(:suite_instance_id)) ? args[:suite_instance_id] : twb_get_suite_instance_id(:twb_suite_name => test_suite_name, :program_application_name => program_application_name)
438
+
439
+ image_size = args.fetch(:size, 100).to_i
440
+ image_size = (image_size > 100) ? 100 : image_size
441
+ image_size = (image_size < 0) ? 0 : image_size
442
+
443
+ image_quality = args.fetch(:quality, 100).to_i
444
+ image_quality = (image_quality > 100) ? 100 : image_quality
445
+ image_quality = (image_quality < 0) ? 0 : image_quality
446
+
447
+
448
+ case_instance_id = (args.key?(:case_instance_id)) ? args[:case_instance_id] : twb_get_case_instance_id(:twb_suite_name => test_suite_name)
449
+ ss_filename = args.fetch(:ss_filename, nil)
450
+ timeout = args.fetch(:timeout, 5.min)
451
+ verify_mode = args.fetch(:verify_mode, 0)
452
+ headers = {'Content-Type' => 'image/jpeg'}
453
+ uri = args.fetch(
454
+ :uri,
455
+ "http://charter.testworkbench.com/ords/test/postScreenshots/#{case_instance_id}"
456
+ )
457
+ tmc_current_screenshots = Hash[test_data.fetch(:tmc_current_screenshots, [])]
458
+ if tmc_current_screenshots[id].nil?
459
+ test_data[:tmc_current_screenshots] = tmc_current_screenshots.update(id => 1).to_a # can't use hash because of integer keys
460
+ else
461
+ tmc_current_screenshots[id] += 1
462
+ test_data[:tmc_current_screenshots] = tmc_current_screenshots.to_a # can't use hash because of integer keys
463
+ end
464
+ if ss_filename.nil?
465
+ ss_filename = "twb_suite_#{suite_instance_id}_case_#{case_instance_id}_screenshot_#{tmc_current_screenshots[id]}.jpg"
466
+ data = dut.capture_screen(:filename => ss_filename, :format => :raw, :size => image_size, :quality => image_quality)
467
+ else
468
+ data = ss_filename
469
+ end
470
+ web_post(uri, :headers => headers,
471
+ :verify_mode => verify_mode, :timeout => timeout, :body => data
472
+ ).json
473
+ return ss_filename
474
+ end
475
+
476
+ # Public: Writes a screenshot to an AWS S3 bucket in preparation for reporting to TWB.
477
+ #
478
+ # access_key_id - String S3 access key ID (default: TWB access key).
479
+ # secret_access_key - String S3 secret access key (default: TWB secret access key).
480
+ # region - Symbol S3 region (default: us-west-2).
481
+ # :us-east-1 - N. Virginia
482
+ # :us-east-2 - Ohio
483
+ # :us-west-1 - N. California
484
+ # :us-west-2 - Oregon
485
+ # bucket_name - String S3 bucket name (default: 'charter-testworkbench-com').
486
+ # aws_folder - String folder name where image will POST (default: TMC_Screenshots).
487
+ # ss_filename - String filename of image to POST. If none is provided a screenshot on active stb will be captured (default: nil)
488
+ # size - number from 0 to 100 for percentage size of the image
489
+ # quality - number from 0 to 100 for image quality
490
+ #
491
+ # Returns the public URI::HTTP for the object.
492
+ def twb_prep_s3_screenshot(args={})
493
+ suite_instance_id = (args.key?(:suite_instance_id)) ? args[:suite_instance_id] : twb_get_suite_instance_id
494
+ case_instance_id = (args.key?(:case_instance_id)) ? args[:case_instance_id] : twb_get_case_instance_id
495
+
496
+ image_size = args.fetch(:size, 100).to_i
497
+ image_size = (image_size > 100) ? 100 : image_size
498
+ image_size = (image_size < 1) ? 1 : image_size
499
+
500
+ image_quality = args.fetch(:quality, 100).to_i
501
+ image_quality = (image_quality > 100) ? 100 : image_quality
502
+ image_quality = (image_quality < 0) ? 0 : image_quality
503
+
504
+ access_key_id = args.fetch(:access_key_id, 'AKIAJR4GME4RASTKVXXQ')
505
+ secret_access_key = args.fetch(:secret_access_key, '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')
506
+ region = args.fetch(:region, 'us-east-2')
507
+ bucket_name = args.fetch(:bucket_name, 'charter-testworkbench-com')
508
+ aws_folder = args.fetch(:aws_folder, 'TMC_Screenshots')
509
+ ss_filename = args.fetch(:ss_filename, nil)
510
+ tmc_current_screenshots = Hash[test_data.fetch(:tmc_current_screenshots, [])]
511
+ if tmc_current_screenshots[id].nil?
512
+ test_data[:tmc_current_screenshots] = tmc_current_screenshots.update(id => 1).to_a # can't use hash because of integer keys
513
+ else
514
+ tmc_current_screenshots[id] += 1
515
+ test_data[:tmc_current_screenshots] = tmc_current_screenshots.to_a # can't use hash because of integer keys
516
+ end
517
+ filename = "twb_suite_#{suite_instance_id}_case_#{case_instance_id}_screenshot_#{tmc_current_screenshots[id]}.jpg"
518
+ # Prep the screenshot
519
+ if ss_filename.nil?
520
+ data = dut.capture_screen(:filename => filename, :format => :raw, :size => image_size, :quality => image_quality)
521
+ else
522
+ data = ss_filename
523
+ end
524
+ aws_write_s3(bucket_name, "#{aws_folder}/#{filename}", data)
525
+ return "#{aws_folder}/#{filename}"
526
+ end
527
+
528
+ # Public: POSTs the Suite level results to TWB and retrieves the Suite Instance ID. If there is already a Suite Instance ID associated with the current test_suite_name it will be used instead.
529
+ #
530
+ # tester_name - String name of tester (default: current_user['name']).
531
+ # report_to_scorecard - String value of 'Y' or 'N' indicating scorecard is/isn't used (default: 'N').
532
+ # footprints - String comma separated list of values (default '').
533
+ #
534
+ # Returns the String suite_instance_id for the suite if successful. Else, returns nil.
535
+ def twb_post_suite(args={})
536
+ # Check to see if the Suite Instance Id has already been written to Test Data
537
+ return twb_get_suite_instance_id if twb_suite_exists?
538
+
539
+ test_suite_name = args.fetch(:twb_suite_name, test_data[:twb_suite_name])
540
+ tester_name = args.fetch(:tester_name, current_user['name'])
541
+ program_application_name = args.fetch(:program_application_name, test_data[:program_application_name])
542
+ report_to_score_card = args.fetch(:report_to_score_card, test_data[:report_to_score_card])
543
+ report_to_score_card = 'N' if report_to_score_card.to_s.empty?
544
+ footprints = args.fetch(:footprints, test_data[:footprints])
545
+ footprints = '' if footprints.to_s.empty?
546
+ environment = args.fetch(:spectrum_environment, current_workspace)
547
+ device = args.fetch(:device, 'undefined') # dvr or non-dvr
548
+ device = 'dvr' if dut.model.include?('210')
549
+ device = 'non-dvr' if dut.model.include?('110')
550
+ slot = args.fetch(:slot, dut.slot)
551
+ mac_address = args.fetch(:mac_address, dut.mac_address)
552
+ mac_address = 'undefined' if mac_address.to_s.empty?
553
+ machine_name = args.fetch(:machine_name, server_name)
554
+ uri = args.fetch(:uri, 'http://charter.testworkbench.com/ords/test/suite/')
555
+ # Build hash for required params
556
+ rb_hash = {
557
+ :test_suite_name => test_suite_name,
558
+ :tester_name => tester_name,
559
+ :program_application_name => program_application_name,
560
+ :report_to_score_card => report_to_score_card,
561
+ :footprints => footprints,
562
+ :environment => environment,
563
+ :device => device,
564
+ :tmc_slot => slot,
565
+ :box_mac_address => mac_address,
566
+ :machine_name => machine_name
567
+ }
568
+ # Add optional params to hash (these aren't published in TomDocs)
569
+ project_release = args.fetch(:project_release, nil)
570
+ rb_hash[:project_release] = project_release unless project_release.nil?
571
+ device_version = args.fetch(:device_version, nil)
572
+ rb_hash[:device_version] = device_version unless device_version.nil?
573
+ browser = args.fetch(:browser, nil)
574
+ rb_hash[:browser] = browser unless browser.nil?
575
+ browser_version = args.fetch(:browser_version, nil)
576
+ rb_hash[:browser_version] = browser_version unless browser_version.nil?
577
+ operating_system = args.fetch(:operating_system, nil)
578
+ rb_hash[:operating_system] = operating_system unless operating_system.nil?
579
+ operating_system_version = args.fetch(:operating_system_version, nil)
580
+ rb_hash[:operating_system_version] = operating_system_version unless operating_system_version.nil?
581
+ target_test_plan_name = args.fetch(:target_test_plan_name, nil)
582
+ rb_hash[:target_test_plan_name] = target_test_plan_name unless target_test_plan_name.nil?
583
+ custom_1 = args.fetch(:custom_1, nil)
584
+ rb_hash[:custom_1] = custom_1 unless custom_1.nil?
585
+ custom_2 = args.fetch(:custom_2, nil)
586
+ rb_hash[:custom_2] = custom_2 unless custom_2.nil?
587
+ custom_3 = args.fetch(:custom_3, nil)
588
+ rb_hash[:custom_3] = custom_3 unless custom_3.nil?
589
+ eligible_to_report = args.fetch(:eligible_to_report, nil)
590
+ rb_hash[:eligible_to_report] = eligible_to_report unless eligible_to_report.nil?
591
+ device_type = args.fetch(:device_type, nil)
592
+ rb_hash[:device_type] = device_type unless device_type.nil?
593
+ # POST /suite/
594
+ logger.debug('POST /suite/')
595
+ resp = web_post(uri, :verify_mode => 0, :json => rb_hash).json
596
+ logger.warn("Failed to connect to Test Work Bench") if resp.nil?
597
+ suite_instance_id = resp['suite_instance_id']
598
+ if suite_instance_id.nil?
599
+ logger.warn('Failed to retrieve Suite Instance ID from TWB!')
600
+ logger.warn("Error Message: #{resp['error_message']}")
601
+ logger.warn("Program List: #{resp['program_list']}") if resp['program_list']
602
+ return nil
603
+ else
604
+ logger.debug("Suite Instance ID Retrieved: #{suite_instance_id}")
605
+ test_data.refresh
606
+ if test_data[:report_per_slot] # if users want to report to individual suites for individual slots
607
+ test_data["twb_suite_id_slot#{dut.slot}_iter#{iteration}".to_sym] = suite_instance_id
608
+ else
609
+ test_data[:twb_suite_id] = suite_instance_id
610
+ end
611
+ return suite_instance_id
612
+ end
613
+ end
614
+
615
+ # Public: POSTs the Case level results to TWB and retrieves the Case Instance ID.
616
+ #
617
+ # uri - String full URI for the resource to request (default: "https://twb.dev-charter.net/ords/preprod/testcase/").
618
+ # test_case_name - String name of the test case (default: test_data[:test_case_name]).
619
+ # suite_instance_id - result of twb_get_suite_instance_id
620
+ #
621
+ # Returns the String Case Instance ID if successful. Else, returns nil.
622
+ def twb_post_testcase(args={})
623
+ # Check to see if the Case Instance Id has already been written to disk
624
+ return twb_get_case_instance_id if twb_case_exists?
625
+
626
+ test_case_name = args.fetch(:test_case_name, self.name)
627
+ test_suite_name = (args.key?(:twb_suite_name)) ? args[:twb_suite_name] : test_data[:twb_suite_name]
628
+ program_application_name = (args.key?(:program_application_name)) ? args[:program_application_name] : test_data[:program_application_name]
629
+
630
+ suite_instance_id = (args.key?(:suite_instance_id)) ? args[:suite_instance_id] : twb_get_suite_instance_id(:twb_suite_name => test_suite_name,:program_application_name => program_application_name)
631
+
632
+ uri = args.fetch(
633
+ :uri,
634
+ 'http://charter.testworkbench.com/ords/test/testcase/'
635
+ )
636
+ # Build hash for required params
637
+ rb_hash = {
638
+ :test_case_name => test_case_name,
639
+ :suite_instance_id => suite_instance_id
640
+ }
641
+ # Add optional params to hash (these aren't published in TomDocs)
642
+ head_end = args.fetch(:head_end, nil)
643
+ rb_hash[:head_end] = head_end unless head_end.nil?
644
+ stb_id = args.fetch(:stb_id, nil)
645
+ rb_hash[:stb_id] = stb_id unless stb_id.nil?
646
+ box_serial_no = args.fetch(:box_serial_no, nil)
647
+ rb_hash[:box_serial_no] = box_serial_no unless box_serial_no.nil?
648
+ box_mac_address = args.fetch(:box_mac_address, nil)
649
+ rb_hash[:box_mac_address] = box_mac_address unless box_mac_address.nil?
650
+ box_model_number = args.fetch(:box_model_number, nil)
651
+ rb_hash[:box_model_number] = box_model_number unless box_model_number.nil?
652
+ ams_number = args.fetch(:ams_number, nil)
653
+ rb_hash[:ams_number] = ams_number unless ams_number.nil?
654
+ sgui_id = args.fetch(:sgui_id, nil)
655
+ rb_hash[:sgui_id] = sgui_id unless sgui_id.nil?
656
+ zodiac_version = args.fetch(:zodiac_version, nil)
657
+ rb_hash[:zodiac_version] = zodiac_version unless zodiac_version.nil?
658
+ custom_1 = args.fetch(:custom_1, nil)
659
+ rb_hash[:custom_1] = custom_1 unless custom_1.nil?
660
+ custom_2 = args.fetch(:custom_2, nil)
661
+ rb_hash[:custom_2] = custom_2 unless custom_2.nil?
662
+ custom_3 = args.fetch(:custom_3, nil)
663
+ rb_hash[:custom_3] = custom_3 unless custom_3.nil?
664
+ # POST /testcase/
665
+ logger.debug('POST /testcase/')
666
+ resp = web_post(uri, :verify_mode => 0, :json => rb_hash).json
667
+ case_instance_id = resp['case_instance_id']
668
+ if case_instance_id.nil?
669
+ logger.warn("Failed to POST Testcase and retrieve Case Instance ID for Suite Instance ID #{suite_instance_id}")
670
+ logger.warn("Error Message: #{resp['error_message']}")
671
+ return nil
672
+ else
673
+ logger.debug("Case Instance ID Retrieved: #{case_instance_id}")
674
+ # Write Case ID to Test Data
675
+ test_data.refresh
676
+ test_data["twb_case_id#{id}_slot#{dut.slot}_iter#{iteration}".to_sym] = case_instance_id
677
+ return case_instance_id
678
+ end
679
+ end
680
+
681
+ # Public: POSTs the Step level results to TWB.
682
+ #
683
+ # s3_screenshot - Boolean true/false indicating if a screenshot should be saved to S3 bucket (default: false).
684
+ # description - String description of results (default: 'Step Passed.').
685
+ # twb_suite_name - String name of the test suite (default: test_data[:twb_suite_name]).
686
+ # program_application_name - String name of the program application (default: test_data[:program_application_name]).
687
+ # screenshot - Boolean true/false indicating a screenshot is/isn't sent (default: false).
688
+ # ss_filename - String filename of image to POST. If none is provided a screenshot on active stb will be captured (default: nil)
689
+ # access_key_id - String S3 access key ID (default: TWB access key).
690
+ # secret_access_key - String S3 secret access key (default: TWB secret access key).
691
+ # bucket_name - String S3 bucket name (default: 'charter-testworkbench-com').
692
+ # aws_folder - String folder name where image will POST (default: TMC_Screenshots).
693
+ # case_instance_id - result of twb_get_case_instance_id
694
+ # suite_instance_id - result of twb_get_suite_instance_id
695
+ #
696
+ # Returns String return message if successful. Else, returns nil.
697
+ def twb_post_teststep(args={})
698
+ tcr_auto_detail_text = args.fetch(:description, 'Step Passed.')
699
+ post_screenshot = args.fetch(:screenshot, false)
700
+ post_s3_screenshot = args.fetch(:s3_screenshot, false)
701
+ ss_filename = args.fetch(:ss_filename, nil)
702
+ test_suite_name = (args.key?(:twb_suite_name)) ? args[:twb_suite_name] : test_data[:twb_suite_name]
703
+ program_application_name = (args.key?(:program_application_name)) ? args[:program_application_name] : test_data[:program_application_name]
704
+
705
+ suite_instance_id = (args.key?(:suite_instance_id)) ? args[:suite_instance_id] : twb_get_suite_instance_id(:twb_suite_name => test_suite_name,:program_application_name => program_application_name)
706
+
707
+ case_instance_id = (args.key?(:case_instance_id)) ? args[:case_instance_id] : twb_get_case_instance_id(:twb_suite_name => test_suite_name)
708
+
709
+ # POST /teststep/
710
+ logger.debug('POST /teststep/')
711
+ uri = args.fetch(
712
+ :uri,
713
+ 'http://charter.testworkbench.com/ords/test/teststep/'
714
+ )
715
+ result = args.fetch(:result_value, 'Passed')
716
+ result = 'Passed' if result == :PASS
717
+ result = 'Failed' if result == :FAIL
718
+ if post_s3_screenshot
719
+ access_key_id = args.fetch(:access_key_id, 'AKIAJR4GME4RASTKVXXQ')
720
+ secret_access_key = args.fetch(:secret_access_key, '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')
721
+ bucket_name = args.fetch(:bucket_name, 'charter-testworkbench-com')
722
+ aws_folder = args.fetch(:aws_folder, 'TMC_Screenshots')
723
+ image_path = twb_prep_s3_screenshot(:access_key_id => access_key_id,
724
+ :secret_access_key => secret_access_key,
725
+ :bucket_name => bucket_name,
726
+ :suite_instance_id => suite_instance_id,
727
+ :case_instance_id => case_instance_id,
728
+ :aws_folder => aws_folder,
729
+ :ss_filename => ss_filename)
730
+ resp = web_post(uri, :verify_mode => 0, :json => {
731
+ :suite_instance_id => suite_instance_id,
732
+ :case_instance_id => case_instance_id,
733
+ :step_status => result,
734
+ :actual_description => tcr_auto_detail_text,
735
+ #:component => 'at mail',
736
+ :image_path => image_path
737
+ }).json
738
+ else
739
+ resp = web_post(uri, :verify_mode => 0, :json => {
740
+ :suite_instance_id => suite_instance_id,
741
+ :case_instance_id => case_instance_id,
742
+ :step_status => result,
743
+ :actual_description => tcr_auto_detail_text,
744
+ #:component => 'at mail',
745
+ #:image_path => 'S3 server location'
746
+ }).json
747
+ end
748
+ if post_screenshot
749
+ twb_post_screenshot(
750
+ :twb_suite_name => test_suite_name,
751
+ :program_application_name => program_application_name,
752
+ :suite_instance_id => suite_instance_id,
753
+ :case_instance_id => case_instance_id,
754
+ :ss_filename => ss_filename
755
+ )
756
+ end
757
+ return_msg = resp['return_msg']
758
+ if return_msg.nil?
759
+ logger.warn('Failed to POST Teststep to TWB!')
760
+ return nil
761
+ else
762
+ logger.debug("Return Msg: #{return_msg}")
763
+ return return_msg
764
+ end
765
+ end
766
+
767
+
768
+ # Public: Takes a screenshot on current STB and POSTS to TWB. The user has the ability to set the Suite & Case instance ID or if a Suite &/or Case ID already exists for the twb_suite_name or current Job Name, those will be used. In the case where neither a Suite & Case instance ID are provided and they don't already exist for the twb_suite_name or Job Name, new ones will be retrieved from TWB and added to the args.
769
+ #
770
+ # twb_suite_name - String name of the Test Suite Name to report to (default: test_data[:twb_suite_name])
771
+ # program_application_name - String name of the Program Application to report to (default: test_data[:program_application_name]).
772
+ # ss_filename - String filename of image to POST. If none is provided a screenshot on active stb will be captured (default: nil)
773
+ # timeout - Integer total milliseconds to wait for a response (default: 5.min).
774
+ # verify_mode - Integer desired HTTP verify mode (default: nil).
775
+ # uri - String full URI for the resource to request(default: "http://charter.testworkbench.com/ords/test/postScreenshots/#{case_instance_id}").
776
+ # case_instance_id - result of twb_get_case_instance_id
777
+ # suite_instance_id - result of twb_get_suite_instance_id
778
+ # size - number from 0 to 100 for percentage size of the image
779
+ # quality - number from 0 to 100 for image quality
780
+ #
781
+ # Returns the path to the screenshot file, ss_filename
782
+ def twb_post_screenshot!(args={})
783
+ args[:twb_suite_name] = test_data[:twb_suite_name] unless args.key?(:twb_suite_name)
784
+ test_suite_name = args[:twb_suite_name]
785
+ args[:program_application_name] = test_data[:program_application_name] unless args.key?(:program_application_name)
786
+ program_application_name = args[:program_application_name]
787
+ description = args[:description]
788
+ description = 'Starting Test...' if description.nil?
789
+ unless args.key?(:suite_instance_id)
790
+ args[:suite_instance_id] = twb_get_suite_instance_id(
791
+ :twb_suite_name => test_suite_name,
792
+ :program_application_name => program_application_name,
793
+ :description => description
794
+ )
795
+ end
796
+ args[:case_instance_id] = twb_get_case_instance_id(:twb_suite_name => test_suite_name) unless args.key?(:case_instance_id)
797
+ twb_post_screenshot(args)
798
+ end
799
+
800
+ # Public: POSTs the Step level results to TWB. Edits the args to add missing data
801
+ #
802
+ # s3_screenshot - Boolean true/false indicating if a screenshot should be saved to S3 bucket (default: false).
803
+ # description - String description of results (default: 'Step Passed.').
804
+ # twb_suite_name - String name of the test suite (default: test_data[:twb_suite_name]).
805
+ # program_application_name - String name of the program application (default: test_data[:program_application_name]).
806
+ # screenshot - Boolean true/false indicating a screenshot is/isn't sent (default: false).
807
+ # ss_filename - String filename of image to POST. If none is provided a screenshot on active stb will be captured (default: nil)
808
+ # access_key_id - String S3 access key ID (default: TWB access key).
809
+ # secret_access_key - String S3 secret access key (default: TWB secret access key).
810
+ # bucket_name - String S3 bucket name (default: 'charter-testworkbench-com').
811
+ # aws_folder - String folder name where image will POST (default: TMC_Screenshots).
812
+ # case_instance_id - result of twb_get_case_instance_id
813
+ # suite_instance_id - result of twb_get_suite_instance_id
814
+ #
815
+ # Returns String return message if successful. Else, returns nil.
816
+ def twb_post_teststep!(args={})
817
+ args[:twb_suite_name] = test_data[:twb_suite_name] unless args.key?(:twb_suite_name)
818
+ test_suite_name = args[:twb_suite_name]
819
+ args[:program_application_name] = test_data[:program_application_name] unless args.key?(:program_application_name)
820
+ program_application_name = args[:program_application_name]
821
+ description = args[:description]
822
+ description = 'Starting Test...' if description.nil?
823
+ unless args.key?(:suite_instance_id)
824
+ args[:suite_instance_id] = twb_get_suite_instance_id(
825
+ :twb_suite_name => test_suite_name,
826
+ :program_application_name => program_application_name,
827
+ :description => description
828
+ )
829
+ end
830
+ args[:case_instance_id] = twb_get_case_instance_id(:twb_suite_name => test_suite_name) unless args.key?(:case_instance_id)
831
+ twb_post_teststep(args)
832
+ end
833
+
834
+ # Public: Performs a GET request for the given URI.
835
+ #
836
+ # uri - String full URI for the resource to GET.
837
+ # body - String data to populate the request body (default: nil).
838
+ # headers - Hash of headers to add to the request (default: {}).
839
+ # basic_auth - Hash of basic authentication :username and :password to use (default: nil).
840
+ # timeout - Integer total milliseconds to wait for a response (default: 5.min).
841
+ #
842
+ # Returns the Hash JSON response, or nil if there was an error.
843
+ def web_get(uri, args={})
844
+ web_request(:get, uri, args)
845
+ end
846
+
847
+ # Public: Performs a POST request for the given URI.
848
+ #
849
+ # uri - String full URI for the resource to POST.
850
+ # body - String data to populate the request body (default: nil).
851
+ # json - Hash JSON object to send in the request body (default: nil). By default no JSON will be included.
852
+ # form_data - Hash form data to send in the request (default: nil). By default no form data will be included.
853
+ # basic_auth - Hash of basic authentication :username and :password to use (default: nil).
854
+ # headers - Hash of headers to add to the request (default: {}).
855
+ # timeout - Integer total milliseconds to wait for a response (default: 5.min).
856
+ #
857
+ # Returns the Hash JSON response, or nil if there was an error.
858
+ def web_post(uri, args={})
859
+ web_request(:post, uri, args)
860
+ end
861
+
862
+ # Public: Performs a PUT request for the given URI.
863
+ #
864
+ # uri - String full URI for the resource to PUT.
865
+ # body - String data to populate the request body (default: nil).
866
+ # json - Hash JSON object to send in the request body (default: nil). By default no JSON will be included.
867
+ # form_data - Hash form data to send in the request (default: nil). By default no form data will be included.
868
+ # basic_auth - Hash of basic authentication :username and :password to use (default: nil).
869
+ # headers - Hash of headers to add to the request (default: {}).
870
+ # timeout - Integer total milliseconds to wait for a response (default: 5.min).
871
+ #
872
+ # Returns the Hash JSON response, or nil if there was an error.
873
+ def web_put(uri, args={})
874
+ web_request(:put, uri, args)
875
+ end
876
+
877
+ # Public: Performs a DELETE request for the given URI.
878
+ #
879
+ # uri - String full URI for the resource to DELETE.
880
+ # body - String data to populate the request body (default: nil).
881
+ # json - Hash JSON object to send in the request body (default: nil). By default no JSON will be included.
882
+ # form_data - Hash form data to send in the request (default: nil). By default no form data will be included.
883
+ # basic_auth - Hash of basic authentication :username and :password to use (default: nil).
884
+ # headers - Hash of headers to add to the request (default: {}).
885
+ # timeout - Integer total milliseconds to wait for a response (default: 5.min).
886
+ #
887
+ # Returns the Hash JSON response, or nil if there was an error.
888
+ def web_delete(uri, args={})
889
+ web_request(:delete, uri, args)
890
+ end
891
+
892
+ # Public: Computes the similarity of two strings by searching the read string for
893
+ # the expected string within
894
+ # expected - the string expected by the test
895
+ # read - the string read from screen
896
+ # options - options for cleaning common OCR text errors. see get_clean_ocr_text
897
+ def get_substring_similarity(expected, read, options = {})
898
+ expected = get_clean_ocr_text(expected, options)
899
+ read = get_clean_ocr_text(read, options)
900
+
901
+ max_similarity = 0
902
+
903
+ # if the expected string is longer than the read string
904
+ # padding will need to be added
905
+ if expected.length > read.length
906
+ read = read.ljust(expected.length, ' ')
907
+ end
908
+
909
+ i = 0
910
+ until i > read.length - expected.length do
911
+ substring = read[i, expected.length]
912
+ similarity = get_string_similarity(expected, substring)
913
+ max_similarity = [similarity, max_similarity].max
914
+ i += 1
915
+ end
916
+
917
+ return max_similarity
918
+ end
919
+
920
+ # Public: Computes the similarity of two strings and returns a value of 1.0 for
921
+ # identical strings. This is based on the Levenshtein distance algorithm
922
+ # s1 - string to compare
923
+ # s2 - string to compare
924
+ # options - options to process strings (see: get_clean_ocr_text)
925
+ def get_string_similarity(s1, s2, options = {})
926
+ s1 = get_clean_ocr_text(s1, options)
927
+ s2 = get_clean_ocr_text(s2, options)
928
+
929
+ if s1 == s2
930
+ return 1.0
931
+ end
932
+
933
+ n = s1.length
934
+ m = s2.length
935
+ d = Array.new(n + 1) { Array.new(m +1) }
936
+
937
+ (0..n).each {|i| d[i][0] = i}
938
+ (0..m).each {|j| d[0][j] = j}
939
+
940
+ for i in 1..n
941
+ for j in 1..m
942
+ cost = s2[j - 1] == s1[i - 1] ? 0 : 1
943
+ d[i][j] = [d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + cost].min
944
+ end
945
+ end
946
+
947
+ denom = [n, m].max
948
+ return 1.0 - (d[n][m] / denom.to_f)
949
+ end
950
+
951
+ # Public: Returns a modified string with common OCR replacements
952
+ # inputString - string to be cleaned
953
+ # options - operations to be applied to the input string
954
+ def get_clean_ocr_text(inputString, options = {:removeSpaces => false,
955
+ :toUppercase => false,
956
+ :removeSpecials => false,
957
+ :replaceB3 => false,
958
+ :replaceB8 => false,
959
+ :replaceG6 => false,
960
+ :replaceO0 => false,
961
+ :replaceTL => false,
962
+ :replaceS5 => false})
963
+ modifiedString = inputString
964
+ if options[:removeSpaces]
965
+ modifiedString = modifiedString.gsub(/\s+/, '')
966
+ end
967
+ if options[:toUppercase]
968
+ modifiedString = modifiedString.upcase
969
+ end
970
+ if options[:removeSpecials]
971
+ modifiedString = modifiedString.gsub(/[^A-Za-z0-9]/, '')
972
+ end
973
+ if options[:replaceB3]
974
+ modifiedString = modifiedString.gsub(/[3B]/, 'B')
975
+ end
976
+ if options[:replaceB8]
977
+ modifiedString = modifiedString.gsub(/[8B]/, 'B')
978
+ end
979
+ if options[:replaceG6]
980
+ modifiedString = modifiedString.gsub(/[G6]/, 'G')
981
+ end
982
+ if options[:replaceO0]
983
+ modifiedString = modifiedString.gsub(/[0O]/, 'O')
984
+ end
985
+ if options[:replaceTL]
986
+ modifiedString = modifiedString.gsub(/[LlT]/, 'L')
987
+ end
988
+ if options[:replaceS5]
989
+ modifiedString = modifiedString.gsub(/[S5]/, 'S')
990
+ end
991
+
992
+ return modifiedString
993
+ end
994
+
995
+ # Public: Converts a Ruby object to standard JSON format, i.e. :is_on_screen becomes :isOnScreen, etc.
996
+ #
997
+ # obj - Object to convert.
998
+ #
999
+ # Returns the converted Object.
1000
+ def jsonify(obj, camel_case: true)
1001
+ if obj.is_a?(Hash)
1002
+ Hash[obj.map {|k,v| [jsonify(k.to_sym, camel_case: camel_case), jsonify(v, camel_case: camel_case)]}]
1003
+ elsif obj.is_a?(Array)
1004
+ obj.map {|v| jsonify(v, camel_case: camel_case)}
1005
+ elsif obj.is_a?(Symbol)
1006
+ camel_case ? to_camel_case(obj) : obj
1007
+ else
1008
+ obj
1009
+ end
1010
+ end
1011
+
1012
+ # Public: Converts a JSON object to standard Ruby format, i.e. 'isOnScreen' becomes :is_on_screen, etc.
1013
+ #
1014
+ # obj - Object to convert.
1015
+ #
1016
+ # Returns the converted Object.
1017
+ def rubify(json, snake_case: true)
1018
+ if json.is_a?(Hash)
1019
+ Hash[json.map {|k,v| [rubify(k.to_sym, snake_case: snake_case), rubify(v, snake_case: snake_case)]}]
1020
+ elsif json.is_a?(Array)
1021
+ json.map {|v| self.rubify(v, snake_case: snake_case)}
1022
+ elsif json.is_a?(Symbol)
1023
+ snake_case ? to_snake_case(json) : json
1024
+ else
1025
+ json
1026
+ end
1027
+ end
1028
+
1029
+ # Public: Converts a value into snake_case
1030
+ #
1031
+ # value - String or Symbol to convert
1032
+ #
1033
+ # Returns the String or Symbol converted to snake_case.
1034
+ def to_snake_case(value)
1035
+ snake_case = value.to_s.gsub(/(?<!^)([A-Z])/, '_\1').downcase
1036
+ value.is_a?(Symbol) ? snake_case.to_sym : snake_case
1037
+ end
1038
+
1039
+ # Public: Converts a value into PascalCase
1040
+ #
1041
+ # value - String or Symbol value to convert
1042
+ #
1043
+ # Returns the String or Symbol converted to PascalCase.
1044
+ def to_pascal_case(value)
1045
+ pascal_case = value.to_s.split('_').map { |part| part.slice(0, 1).upcase + part.slice(1..-1) }.join
1046
+ value.is_a?(Symbol) ? pascal_case.to_sym : pascal_case
1047
+ end
1048
+
1049
+ # Public: Converts a value into camelCase
1050
+ #
1051
+ # value - String or Symbol value to convert
1052
+ #
1053
+ # Returns the String or Symbol converted to camelCase.
1054
+ def to_camel_case(value)
1055
+ parts = value.to_s.split('_').reject {|part| part.empty?}
1056
+ camel_case = parts[0].slice(0, 1).downcase + parts[0].slice(1..-1) +
1057
+ parts[1..-1].map { |part| part.slice(0, 1).upcase + part.slice(1..-1) }.join
1058
+ value.is_a?(Symbol) ? camel_case.to_sym : camel_case
1059
+ end
1060
+
1061
+ # Public: Gets a readable string for the given size in bytes.
1062
+ #
1063
+ # size_bytes - Integer size in bytes.
1064
+ #
1065
+ # Returns a String readable size in bytes.
1066
+ def get_readable_size(size_bytes)
1067
+ units = %w(B KB MB GB TB)
1068
+ Array(0..units.length - 1).reverse.each do |i|
1069
+ mult = 1000.0 ** i
1070
+ if size_bytes >= (mult == 1 ? 0 : mult)
1071
+ return "#{(size_bytes / mult).round(1)} #{units[i]}"
1072
+ end
1073
+ end
1074
+ end
1075
+
1076
+ # Public: Gets a readable string for the given time in seconds.
1077
+ #
1078
+ # time_sec - Numeric seconds.
1079
+ #
1080
+ # Returns a String readable time.
1081
+ def get_readable_time(time_sec)
1082
+ parts = []
1083
+ h = (time_sec / 3600.0).to_i
1084
+ parts << "#{h}h" if h > 0
1085
+ time_sec -= (h * 3600)
1086
+ m = (time_sec / 60.0).to_i
1087
+ parts << "#{m}m" if m > 0
1088
+ time_sec -= (m * 60)
1089
+ s = time_sec.to_i
1090
+ parts << "#{s}s" if s > 0
1091
+ ms = ((time_sec - s) * 1000.0).round
1092
+ parts << "#{ms}ms" if ms > 0 || parts.empty?
1093
+ parts.join(', ')
1094
+ end
1095
+
1096
+ # Public: Can send an alert to a WebEx room. Must have token to pass into first param.
1097
+ #
1098
+ # token - Obtain token by creating bot @ https://developer.webex.com/docs/bots
1099
+ # room_id - Create room in webex, add bot to room. Then, can get roomId here: https://developer.webex.com/docs/api/v1/rooms/list-rooms
1100
+ # text - text to send into message body (default: nil)
1101
+ # markdown - useful if you would like to create markdown text instead of plain. (default: nil)
1102
+
1103
+ def send_webex_alert(token, room_id, text: nil, markdown: nil)
1104
+ web_post("https://api.ciscospark.com/v1/messages", { json: {
1105
+ text: text.to_s, # to_s incase user doesn't sanitize.
1106
+ roomId: room_id.to_s,
1107
+ markdown: markdown.to_s
1108
+ },
1109
+ # pass token into header
1110
+ headers: {
1111
+ "Authorization": "Bearer #{token}"
1112
+ }
1113
+ })
1114
+ end
1115
+
1116
+ private
1117
+
1118
+ # Internal: Gets the specified bucket from the given S3 instance, or creates the bucket if it does not exist.
1119
+ def get_or_create_s3_bucket(s3, bucket)
1120
+ b = s3.bucket(bucket)
1121
+ unless b.exists?
1122
+ b.create
1123
+ logger.debug('Created bucket')
1124
+ end
1125
+ b
1126
+ end
1127
+
1128
+ # Internal: Requires the AWS gem and executes the given block.
1129
+ def with_aws(&block)
1130
+ require 'aws-sdk-s3' # require here as it takes some time, to avoid impacting syntax eval
1131
+ block.call
1132
+ end
1133
+
1134
+ # Internal: Passes an AWS S3 instance to the given block.
1135
+ def aws(&block)
1136
+ with_aws { block.call(Aws::S3::Resource.new) }
1137
+ end
1138
+
1139
+ # Internal: Gets the current user.
1140
+ def current_user
1141
+ if @current_user.nil?
1142
+ @current_user = tmc_get('/api/login') || {}
1143
+ end
1144
+ @current_user
1145
+ end
1146
+
1147
+ # Internal: Gets the results path.
1148
+ def results_path
1149
+ if @results_path.nil?
1150
+ # Bad idea to build absolute paths in the Ruby framework. Maybe get them from TMC (new endpoint).
1151
+ user = current_user['shortName']
1152
+ @results_path = "C:\\Program Files\\Time Warner Cable\\users\\#{user}\\results"
1153
+ end
1154
+ @results_path
1155
+ end
1156
+
1157
+ # Internal: Gets the image samples path.
1158
+ def image_samples_path
1159
+ if @image_samples_path.nil?
1160
+ # Bad idea to build absolute paths in the Ruby framework. Maybe get them from TMC (new endpoint).
1161
+ user = current_user['shortName']
1162
+ @image_samples_path = "C:\\Program Files\\Time Warner Cable\\users\\#{user}\\images"
1163
+ end
1164
+ @image_samples_path
1165
+ end
1166
+
1167
+ # Internal: Gets the current workspace.
1168
+ def current_workspace
1169
+ if @current_workspace.nil?
1170
+ @current_workspace = tmc_get('/api/workspaces/current')['name'] rescue nil
1171
+ end
1172
+ @current_workspace
1173
+ end
1174
+
1175
+ # Internal: Gets the server info.
1176
+ def server_info
1177
+ if @tmc_server_info.nil?
1178
+ @tmc_server_info = tmc_get('/api/info')
1179
+ end
1180
+ @tmc_server_info
1181
+ end
1182
+
1183
+ # Internal: Gets the TMC software version.
1184
+ def tmc_software_version
1185
+ if @tmc_server_version.nil?
1186
+ @tmc_server_version = server_info['version']
1187
+ end
1188
+ @tmc_server_version
1189
+ end
1190
+
1191
+ # Internal: Performs a GET request for the given TMC resource.
1192
+ #
1193
+ # resource - String URI of resource to GET. Exclude the protocol, host, and port.
1194
+ # port - Integer alternate port to use (default: 80).
1195
+ # timeout - Integer total milliseconds to wait for a response (default: 5.min).
1196
+ # attr - Symbol name of response attribute to get (default: :json).
1197
+ #
1198
+ # Returns the Hash JSON response, or nil if there was an error.
1199
+ def tmc_get(resource, args={})
1200
+ tmc_request(:get, resource, args)
1201
+ end
1202
+
1203
+ # Internal: Performs a POST request for the given TMC resource.
1204
+ #
1205
+ # resource - String URI of resource to POST. Exclude the protocol, host, and port.
1206
+ # port - Integer alternate port to use (default: 80).
1207
+ # json - Hash JSON object to send in the request body (default: nil). By default no JSON will be included.
1208
+ # timeout - Integer total milliseconds to wait for a response (default: 5.min).
1209
+ #
1210
+ # Returns the Hash JSON response, or nil if there was an error.
1211
+ def tmc_post(resource, args={})
1212
+ tmc_request(:post, resource, args)
1213
+ end
1214
+
1215
+ # Internal: Performs a PUT request for the given TMC resource.
1216
+ #
1217
+ # resource - String URI of resource to PUT. Exclude the protocol, host, and port.
1218
+ # port - Integer alternate port to use (default: 80).
1219
+ # json - Hash JSON object to send in the request body (default: nil). By default no JSON will be included.
1220
+ # timeout - Integer total milliseconds to wait for a response (default: 5.min).
1221
+ #
1222
+ # Returns the Hash JSON response, or nil if there was an error.
1223
+ def tmc_put(resource, args={})
1224
+ tmc_request(:put, resource, args)
1225
+ end
1226
+
1227
+ # Internal: Performs a DELETE request for the given TMC resource.
1228
+ #
1229
+ # resource - String URI of resource to DELETE. Exclude the protocol, host, and port.
1230
+ # port - Integer alternate port to use (default: 80).
1231
+ # json - Hash JSON object to send in the request body (default: nil). By default no JSON will be included.
1232
+ # timeout - Integer total milliseconds to wait for a response (default: 5.min).
1233
+ #
1234
+ # Returns the Hash JSON response, or nil if there was an error.
1235
+ def tmc_delete(resource, args={})
1236
+ tmc_request(:delete, resource, args)
1237
+ end
1238
+
1239
+ # Internal: Performs a web request for the given TMC resource.
1240
+ #
1241
+ # http_method - Symbol HTTP method to use from :get, :post, :put, :delete.
1242
+ # resource - String URI of resource to request. Exclude the protocol, host, and port.
1243
+ # port - Integer alternate port to use (default: 443).
1244
+ # json - Hash JSON object to send in the request body (default: nil). By default no JSON will be included.
1245
+ # attr - Symbol attribute to return (default: :json).
1246
+ # timeout - Integer total milliseconds to wait for a response (default: 5.min).
1247
+ #
1248
+ # Returns the Hash JSON response, or nil if there was an error.
1249
+ def tmc_request(http_method, resource, args={})
1250
+ uri = "https://#{host}:#{args.fetch(:port, 443)}#{resource}"
1251
+ args[:headers] = {'TMC-Identity-GUID': identity}
1252
+ return_attr = args.delete(:attr) || :json
1253
+ resp = web_request(http_method, uri, args)
1254
+ if !resp.json.nil? && resp.json['status'] == -1
1255
+ raise "#{resp.json['statusMessage'] || ''}\n#{resp.json['statusDetail'] || ''}".strip
1256
+ end
1257
+ resp.send(return_attr)
1258
+ end
1259
+
1260
+ end