lacci 0.2.1

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 (559) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +85 -0
  3. data/.ruby-version +1 -0
  4. data/.vscode/extensions.json +5 -0
  5. data/.yardopts +12 -0
  6. data/CHANGELOG.md +19 -0
  7. data/CODE_OF_CONDUCT.md +84 -0
  8. data/CONTRIBUTING.md +20 -0
  9. data/Gemfile +24 -0
  10. data/LICENSE.txt +21 -0
  11. data/README.md +178 -0
  12. data/Rakefile +15 -0
  13. data/bin/console +15 -0
  14. data/bin/setup +8 -0
  15. data/dev.yml +7 -0
  16. data/docs/static/PKGBUILD +47 -0
  17. data/docs/static/Shoes.icns +0 -0
  18. data/docs/static/avatar.png +0 -0
  19. data/docs/static/code_highlighter.js +188 -0
  20. data/docs/static/code_highlighter_ruby.js +26 -0
  21. data/docs/static/icon-debug.png +0 -0
  22. data/docs/static/icon-error.png +0 -0
  23. data/docs/static/icon-info.png +0 -0
  24. data/docs/static/icon-warn.png +0 -0
  25. data/docs/static/listbox_button1.png +0 -0
  26. data/docs/static/listbox_button2.png +0 -0
  27. data/docs/static/man-app.png +0 -0
  28. data/docs/static/man-builds.png +0 -0
  29. data/docs/static/man-builds1.png +0 -0
  30. data/docs/static/man-editor-notepad.png +0 -0
  31. data/docs/static/man-editor-osx.png +0 -0
  32. data/docs/static/man-ele-background.png +0 -0
  33. data/docs/static/man-ele-border.png +0 -0
  34. data/docs/static/man-ele-button.png +0 -0
  35. data/docs/static/man-ele-check.png +0 -0
  36. data/docs/static/man-ele-editbox.png +0 -0
  37. data/docs/static/man-ele-editline.png +0 -0
  38. data/docs/static/man-ele-image.png +0 -0
  39. data/docs/static/man-ele-listbox.png +0 -0
  40. data/docs/static/man-ele-progress.png +0 -0
  41. data/docs/static/man-ele-radio.png +0 -0
  42. data/docs/static/man-ele-shape.png +0 -0
  43. data/docs/static/man-ele-textblock.png +0 -0
  44. data/docs/static/man-ele-video.png +0 -0
  45. data/docs/static/man-intro-dmg.png +0 -0
  46. data/docs/static/man-intro-exe.png +0 -0
  47. data/docs/static/man-look-tiger.png +0 -0
  48. data/docs/static/man-look-ubuntu.png +0 -0
  49. data/docs/static/man-look-vista.png +0 -0
  50. data/docs/static/man-run-osx.png +0 -0
  51. data/docs/static/man-run-vista.png +0 -0
  52. data/docs/static/man-run-xp.png +0 -0
  53. data/docs/static/man-shot1.png +0 -0
  54. data/docs/static/manual-en.txt +3529 -0
  55. data/docs/static/manual-ja.txt +2829 -0
  56. data/docs/static/manual.css +171 -0
  57. data/docs/static/manual.md +3528 -0
  58. data/docs/static/menu-corner1.png +0 -0
  59. data/docs/static/menu-corner2.png +0 -0
  60. data/docs/static/menu-gray.png +0 -0
  61. data/docs/static/menu-left.png +0 -0
  62. data/docs/static/menu-right.png +0 -0
  63. data/docs/static/menu-top.png +0 -0
  64. data/docs/static/shoes-dmg.jpg +0 -0
  65. data/docs/static/shoes-icon-blue.png +0 -0
  66. data/docs/static/shoes-icon.png +0 -0
  67. data/docs/static/shoes-manual-apps.gif +0 -0
  68. data/docs/static/shoes_main_window.png +0 -0
  69. data/docs/static/stripe.png +0 -0
  70. data/docs/static/stubs/blank.exe +0 -0
  71. data/docs/static/stubs/blank.hfz +0 -0
  72. data/docs/static/stubs/blank.run +375 -0
  73. data/docs/static/stubs/cocoa-install +0 -0
  74. data/docs/static/stubs/sh-install +49 -0
  75. data/docs/static/stubs/shoes-stub-inject.exe +0 -0
  76. data/docs/static/stubs/shoes-stub.exe +0 -0
  77. data/docs/static/tutor-back.png +0 -0
  78. data/docs/yard/catscradle.md +44 -0
  79. data/docs/yard/template/default/fulldoc/html/setup.rb +13 -0
  80. data/docs/yard/template/default/layout/html/setup.rb +9 -0
  81. data/examples/backdround_with_image.rb +16 -0
  82. data/examples/bloopsaphone/working/1901_by_Aanand_Prasad.rb +478 -0
  83. data/examples/bloopsaphone/working/b1.rb +64 -0
  84. data/examples/bloopsaphone/working/b2.rb +36 -0
  85. data/examples/bloopsaphone/working/bloops_test.rb +41 -0
  86. data/examples/bloopsaphone/working/bloopsaphone_theme_song_by_why.rb +31 -0
  87. data/examples/bloopsaphone/working/feepogram.rb +67 -0
  88. data/examples/bloopsaphone/working/simpsons_theme_song_by_why.rb +14 -0
  89. data/examples/bloopsaphone/working/tune_cheeky_drat.rb +210 -0
  90. data/examples/button.rb +10 -0
  91. data/examples/button_alert.rb +6 -0
  92. data/examples/button_go_away.rb +6 -0
  93. data/examples/button_with_position_and_size.rb +7 -0
  94. data/examples/coffee.rb +14 -0
  95. data/examples/download.rb +5 -0
  96. data/examples/download_and_show_image.rb +28 -0
  97. data/examples/edit_box.rb +8 -0
  98. data/examples/edit_line.rb +8 -0
  99. data/examples/fill.rb +25 -0
  100. data/examples/flow.rb +11 -0
  101. data/examples/fonts.rb +6 -0
  102. data/examples/gen.rb +140 -0
  103. data/examples/get_headers.rb +10 -0
  104. data/examples/hello_world.rb +3 -0
  105. data/examples/highlander.rb +87 -0
  106. data/examples/image/clickable_image.rb +5 -0
  107. data/examples/image/image.rb +3 -0
  108. data/examples/image/image_size.rb +7 -0
  109. data/examples/image/image_with_position_and_size.rb +3 -0
  110. data/examples/info.rb +9 -0
  111. data/examples/legacy/not_checked/expert/colours.rb +105 -0
  112. data/examples/legacy/not_checked/expert/curve-animation.rb +31 -0
  113. data/examples/legacy/not_checked/expert/curve-control-point.rb +51 -0
  114. data/examples/legacy/not_checked/expert/custom-list-box.rb +53 -0
  115. data/examples/legacy/not_checked/expert/definr.rb +23 -0
  116. data/examples/legacy/not_checked/expert/funnies.rb +56 -0
  117. data/examples/legacy/not_checked/expert/minesweeper.rb +267 -0
  118. data/examples/legacy/not_checked/expert/othello.rb +318 -0
  119. data/examples/legacy/not_checked/expert/pong.rb +62 -0
  120. data/examples/legacy/not_checked/expert/tankspank.rb +385 -0
  121. data/examples/legacy/not_checked/expert/tooltips.rb +45 -0
  122. data/examples/legacy/not_checked/expert/url.rb +37 -0
  123. data/examples/legacy/not_checked/expert/video-player.rb +256 -0
  124. data/examples/legacy/not_checked/good/_why-stories.rb +44 -0
  125. data/examples/legacy/not_checked/good/_why-stories.yaml +387 -0
  126. data/examples/legacy/not_checked/good/arc.rb +37 -0
  127. data/examples/legacy/not_checked/good/cardflip.rb +141 -0
  128. data/examples/legacy/not_checked/good/clock.rb +51 -0
  129. data/examples/legacy/not_checked/good/console.rb +21 -0
  130. data/examples/legacy/not_checked/good/follow.rb +26 -0
  131. data/examples/legacy/not_checked/good/image-rotate.rb +14 -0
  132. data/examples/legacy/not_checked/good/paris.svg +7236 -0
  133. data/examples/legacy/not_checked/good/path-animation.rb +46 -0
  134. data/examples/legacy/not_checked/good/plots.rb +100 -0
  135. data/examples/legacy/not_checked/good/reminder.rb +174 -0
  136. data/examples/legacy/not_checked/good/svgview.rb +113 -0
  137. data/examples/legacy/not_checked/good/vjot.rb +56 -0
  138. data/examples/legacy/not_checked/shoes-contrib/.gitignore +2 -0
  139. data/examples/legacy/not_checked/shoes-contrib/README.md +34 -0
  140. data/examples/legacy/not_checked/shoes-contrib/animation/animate-ovals.rb +21 -0
  141. data/examples/legacy/not_checked/shoes-contrib/animation/flowers.rb +59 -0
  142. data/examples/legacy/not_checked/shoes-contrib/animation/happy-trails.rb +31 -0
  143. data/examples/legacy/not_checked/shoes-contrib/animation/mice-satellites.rb +27 -0
  144. data/examples/legacy/not_checked/shoes-contrib/animation/oval-motion.rb +12 -0
  145. data/examples/legacy/not_checked/shoes-contrib/animation/pink-bubbles.rb +34 -0
  146. data/examples/legacy/not_checked/shoes-contrib/animation/pulsate.rb +18 -0
  147. data/examples/legacy/not_checked/shoes-contrib/animation/rotating-star.rb +18 -0
  148. data/examples/legacy/not_checked/shoes-contrib/app/download-and-save.rb +11 -0
  149. data/examples/legacy/not_checked/shoes-contrib/app/download.rb +10 -0
  150. data/examples/legacy/not_checked/shoes-contrib/app/get-google.rb +11 -0
  151. data/examples/legacy/not_checked/shoes-contrib/app/mouse-detection.rb +7 -0
  152. data/examples/legacy/not_checked/shoes-contrib/app/resizeable-false.rb +6 -0
  153. data/examples/legacy/not_checked/shoes-contrib/art/bubble-bullseye.rb +23 -0
  154. data/examples/legacy/not_checked/shoes-contrib/art/faded.rb +17 -0
  155. data/examples/legacy/not_checked/shoes-contrib/art/fill-oval.rb +5 -0
  156. data/examples/legacy/not_checked/shoes-contrib/art/mask.rb +15 -0
  157. data/examples/legacy/not_checked/shoes-contrib/art/oval-gradient.rb +6 -0
  158. data/examples/legacy/not_checked/shoes-contrib/art/star-gradient.rb +4 -0
  159. data/examples/legacy/not_checked/shoes-contrib/basic/basic-edit-box.rb +8 -0
  160. data/examples/legacy/not_checked/shoes-contrib/basic/basic-new-window.rb +8 -0
  161. data/examples/legacy/not_checked/shoes-contrib/basic/basic-oval-image.rb +8 -0
  162. data/examples/legacy/not_checked/shoes-contrib/basic/basic-oval-shape.rb +8 -0
  163. data/examples/legacy/not_checked/shoes-contrib/basic/basic-oval.rb +6 -0
  164. data/examples/legacy/not_checked/shoes-contrib/basic/class-book.rb +43 -0
  165. data/examples/legacy/not_checked/shoes-contrib/basic/class-book.yaml +387 -0
  166. data/examples/legacy/not_checked/shoes-contrib/basic/clock.rb +6 -0
  167. data/examples/legacy/not_checked/shoes-contrib/basic/edit-stack +14 -0
  168. data/examples/legacy/not_checked/shoes-contrib/basic/gradient-shoes.rb +7 -0
  169. data/examples/legacy/not_checked/shoes-contrib/basic/list_box-shape-report.rb +19 -0
  170. data/examples/legacy/not_checked/shoes-contrib/basic/rect-arrow.rb +7 -0
  171. data/examples/legacy/not_checked/shoes-contrib/basic/scribble.rb +8 -0
  172. data/examples/legacy/not_checked/shoes-contrib/basic/search.rb +32 -0
  173. data/examples/legacy/not_checked/shoes-contrib/basic/shoes-notes.rb +16 -0
  174. data/examples/legacy/not_checked/shoes-contrib/basic/url-shoes-subclassing.rb +24 -0
  175. data/examples/legacy/not_checked/shoes-contrib/browser.rb +21 -0
  176. data/examples/legacy/not_checked/shoes-contrib/elements/background-column.rb +3 -0
  177. data/examples/legacy/not_checked/shoes-contrib/elements/background.rb +4 -0
  178. data/examples/legacy/not_checked/shoes-contrib/elements/basic-fps.rb +6 -0
  179. data/examples/legacy/not_checked/shoes-contrib/elements/border-cat.rb +6 -0
  180. data/examples/legacy/not_checked/shoes-contrib/elements/button-block.rb +8 -0
  181. data/examples/legacy/not_checked/shoes-contrib/elements/check-mate.rb +15 -0
  182. data/examples/legacy/not_checked/shoes-contrib/elements/common-styles.rb +13 -0
  183. data/examples/legacy/not_checked/shoes-contrib/elements/displace-animation.rb +13 -0
  184. data/examples/legacy/not_checked/shoes-contrib/elements/edit_box-character-count.rb +7 -0
  185. data/examples/legacy/not_checked/shoes-contrib/elements/edit_line-character-count.rb +7 -0
  186. data/examples/legacy/not_checked/shoes-contrib/elements/image-icon.rb +3 -0
  187. data/examples/legacy/not_checked/shoes-contrib/elements/list_box-select-class.rb +13 -0
  188. data/examples/legacy/not_checked/shoes-contrib/elements/list_box.rb +6 -0
  189. data/examples/legacy/not_checked/shoes-contrib/elements/move-flow-animate.rb +13 -0
  190. data/examples/legacy/not_checked/shoes-contrib/elements/phat-button.rb +7 -0
  191. data/examples/legacy/not_checked/shoes-contrib/elements/popup.rb +7 -0
  192. data/examples/legacy/not_checked/shoes-contrib/elements/progress-bar.rb +10 -0
  193. data/examples/legacy/not_checked/shoes-contrib/elements/radio-dreamcast-favs.rb +17 -0
  194. data/examples/legacy/not_checked/shoes-contrib/elements/timer.rb +6 -0
  195. data/examples/legacy/not_checked/shoes-contrib/elements/width-introspec.rb +8 -0
  196. data/examples/legacy/not_checked/shoes-contrib/events/background-hover.rb +11 -0
  197. data/examples/legacy/not_checked/shoes-contrib/events/motion-detect.rb +9 -0
  198. data/examples/legacy/not_checked/shoes-contrib/events/pressed-key.rb +6 -0
  199. data/examples/legacy/not_checked/shoes-contrib/expert/expert-funnies.rb +51 -0
  200. data/examples/legacy/not_checked/shoes-contrib/expert/expert-irb.rb +112 -0
  201. data/examples/legacy/not_checked/shoes-contrib/expert/expert-othello.rb +319 -0
  202. data/examples/legacy/not_checked/shoes-contrib/good/good-arc.rb +37 -0
  203. data/examples/legacy/not_checked/shoes-contrib/good/good-clock.rb +51 -0
  204. data/examples/legacy/not_checked/shoes-contrib/good/good-follow.rb +26 -0
  205. data/examples/legacy/not_checked/shoes-contrib/good/good-reminder.rb +174 -0
  206. data/examples/legacy/not_checked/shoes-contrib/good/good-vjot.rb +56 -0
  207. data/examples/legacy/not_checked/shoes-contrib/kernel/ask.rb +4 -0
  208. data/examples/legacy/not_checked/shoes-contrib/kernel/ask_color.rb +4 -0
  209. data/examples/legacy/not_checked/shoes-contrib/kernel/ask_open_file.rb +4 -0
  210. data/examples/legacy/not_checked/shoes-contrib/kernel/ask_save_file.rb +7 -0
  211. data/examples/legacy/not_checked/shoes-contrib/kernel/confirm.rb +3 -0
  212. data/examples/legacy/not_checked/shoes-contrib/kernel/debug.rb +4 -0
  213. data/examples/legacy/not_checked/shoes-contrib/kernel/exit.rb +5 -0
  214. data/examples/legacy/not_checked/shoes-contrib/kernel/font.rb +5 -0
  215. data/examples/legacy/not_checked/shoes-contrib/kernel/fonts.rb +3 -0
  216. data/examples/legacy/not_checked/shoes-contrib/manipulation/append-slot.rb +9 -0
  217. data/examples/legacy/not_checked/shoes-contrib/manipulation/clear-slot.rb +6 -0
  218. data/examples/legacy/not_checked/shoes-contrib/manipulation/prepend-slot.rb +6 -0
  219. data/examples/legacy/not_checked/shoes-contrib/manipulation/roll.rb +17 -0
  220. data/examples/legacy/not_checked/shoes-contrib/position/gutter-margin.rb +5 -0
  221. data/examples/legacy/not_checked/shoes-contrib/position/stack-width.rb +3 -0
  222. data/examples/legacy/not_checked/shoes-contrib/simple/simple-accordion.rb +75 -0
  223. data/examples/legacy/not_checked/shoes-contrib/simple/simple-anim-shapes.rb +17 -0
  224. data/examples/legacy/not_checked/shoes-contrib/simple/simple-anim-text.rb +13 -0
  225. data/examples/legacy/not_checked/shoes-contrib/simple/simple-arc.rb +23 -0
  226. data/examples/legacy/not_checked/shoes-contrib/simple/simple-bounce.rb +24 -0
  227. data/examples/legacy/not_checked/shoes-contrib/simple/simple-calc.rb +70 -0
  228. data/examples/legacy/not_checked/shoes-contrib/simple/simple-chipmunk.rb +26 -0
  229. data/examples/legacy/not_checked/shoes-contrib/simple/simple-control-sizes.rb +24 -0
  230. data/examples/legacy/not_checked/shoes-contrib/simple/simple-curve.rb +26 -0
  231. data/examples/legacy/not_checked/shoes-contrib/simple/simple-dialogs.rb +29 -0
  232. data/examples/legacy/not_checked/shoes-contrib/simple/simple-downloader.rb +27 -0
  233. data/examples/legacy/not_checked/shoes-contrib/simple/simple-draw.rb +13 -0
  234. data/examples/legacy/not_checked/shoes-contrib/simple/simple-editor.rb +28 -0
  235. data/examples/legacy/not_checked/shoes-contrib/simple/simple-form.rb +28 -0
  236. data/examples/legacy/not_checked/shoes-contrib/simple/simple-form.shy +0 -0
  237. data/examples/legacy/not_checked/shoes-contrib/simple/simple-mask.rb +21 -0
  238. data/examples/legacy/not_checked/shoes-contrib/simple/simple-menu.rb +31 -0
  239. data/examples/legacy/not_checked/shoes-contrib/simple/simple-menu1.rb +35 -0
  240. data/examples/legacy/not_checked/shoes-contrib/simple/simple-rubygems.rb +29 -0
  241. data/examples/legacy/not_checked/shoes-contrib/simple/simple-slide.rb +45 -0
  242. data/examples/legacy/not_checked/shoes-contrib/simple/simple-sphere.rb +28 -0
  243. data/examples/legacy/not_checked/shoes-contrib/simple/simple-sqlite3.rb +13 -0
  244. data/examples/legacy/not_checked/shoes-contrib/simple/simple-timer.rb +13 -0
  245. data/examples/legacy/not_checked/shoes-contrib/simple/simple-video.rb +13 -0
  246. data/examples/legacy/not_checked/shoes-contrib/styles/alignment.rb +4 -0
  247. data/examples/legacy/not_checked/shoes-contrib/styles/attachment.rb +5 -0
  248. data/examples/legacy/not_checked/shoes-contrib/styles/emphasis.rb +3 -0
  249. data/examples/legacy/not_checked/shoes-contrib/styles/gradient-angle.rb +3 -0
  250. data/examples/legacy/not_checked/shoes-contrib/styles/para-methods.rb +5 -0
  251. data/examples/legacy/not_checked/shoes-contrib/styles/para-red-underlined.rb +3 -0
  252. data/examples/legacy/not_checked/shoes-contrib/styles/para-style-method.rb +4 -0
  253. data/examples/legacy/not_checked/shoes-dep-samples/expert-game-of-life.rb +243 -0
  254. data/examples/legacy/not_checked/shoes-dep-samples/expert-othello.rb +319 -0
  255. data/examples/legacy/not_checked/shoes-dep-samples/good-clock.rb +51 -0
  256. data/examples/legacy/not_checked/shoes-dep-samples/good-follow.rb +26 -0
  257. data/examples/legacy/not_checked/shoes-dep-samples/good-reminder.rb +174 -0
  258. data/examples/legacy/not_checked/shoes-dep-samples/good-vjot.rb +56 -0
  259. data/examples/legacy/not_checked/shoes-dep-samples/simple-accordion.rb +75 -0
  260. data/examples/legacy/not_checked/shoes-dep-samples/simple-anim-shapes.rb +17 -0
  261. data/examples/legacy/not_checked/shoes-dep-samples/simple-anim-text.rb +13 -0
  262. data/examples/legacy/not_checked/shoes-dep-samples/simple-arc.rb +23 -0
  263. data/examples/legacy/not_checked/shoes-dep-samples/simple-bounce.rb +24 -0
  264. data/examples/legacy/not_checked/shoes-dep-samples/simple-calc.rb +70 -0
  265. data/examples/legacy/not_checked/shoes-dep-samples/simple-chipmunk.rb +26 -0
  266. data/examples/legacy/not_checked/shoes-dep-samples/simple-control-sizes.rb +24 -0
  267. data/examples/legacy/not_checked/shoes-dep-samples/simple-curve.rb +26 -0
  268. data/examples/legacy/not_checked/shoes-dep-samples/simple-dialogs.rb +29 -0
  269. data/examples/legacy/not_checked/shoes-dep-samples/simple-draw.rb +13 -0
  270. data/examples/legacy/not_checked/shoes-dep-samples/simple-editor.rb +28 -0
  271. data/examples/legacy/not_checked/shoes-dep-samples/simple-form.rb +28 -0
  272. data/examples/legacy/not_checked/shoes-dep-samples/simple-form.shy +0 -0
  273. data/examples/legacy/not_checked/shoes-dep-samples/simple-mask.rb +21 -0
  274. data/examples/legacy/not_checked/shoes-dep-samples/simple-menu.rb +31 -0
  275. data/examples/legacy/not_checked/shoes-dep-samples/simple-menu1.rb +35 -0
  276. data/examples/legacy/not_checked/shoes-dep-samples/simple-rubygems.rb +29 -0
  277. data/examples/legacy/not_checked/shoes-dep-samples/simple-slide.rb +45 -0
  278. data/examples/legacy/not_checked/shoes-dep-samples/simple-sphere.rb +28 -0
  279. data/examples/legacy/not_checked/shoes-dep-samples/simple-sqlite3.rb +13 -0
  280. data/examples/legacy/not_checked/shoes-dep-samples/simple-timer.rb +13 -0
  281. data/examples/legacy/not_checked/shoes-dep-samples/simple-video.rb +13 -0
  282. data/examples/legacy/not_checked/shoes3-tests/AnemicCinema1926marcelDuchampCut.mp4 +0 -0
  283. data/examples/legacy/not_checked/shoes3-tests/button/button.rb +53 -0
  284. data/examples/legacy/not_checked/shoes3-tests/cache/cache.rb +41 -0
  285. data/examples/legacy/not_checked/shoes3-tests/combo/combo.rb +24 -0
  286. data/examples/legacy/not_checked/shoes3-tests/curl/bare.rb +34 -0
  287. data/examples/legacy/not_checked/shoes3-tests/curl/downloader.rb +40 -0
  288. data/examples/legacy/not_checked/shoes3-tests/curl/m1.rb +11 -0
  289. data/examples/legacy/not_checked/shoes3-tests/curl/m2.rb +12 -0
  290. data/examples/legacy/not_checked/shoes3-tests/curl/m3.rb +11 -0
  291. data/examples/legacy/not_checked/shoes3-tests/curl/m4.rb +5 -0
  292. data/examples/legacy/not_checked/shoes3-tests/curl/typ.rb +30 -0
  293. data/examples/legacy/not_checked/shoes3-tests/cursor/c1.rb +21 -0
  294. data/examples/legacy/not_checked/shoes3-tests/decoration.rb +14 -0
  295. data/examples/legacy/not_checked/shoes3-tests/dialogs/ask.rb +6 -0
  296. data/examples/legacy/not_checked/shoes3-tests/dialogs/confirm.rb +6 -0
  297. data/examples/legacy/not_checked/shoes3-tests/editbox/editbox.rb +36 -0
  298. data/examples/legacy/not_checked/shoes3-tests/editline/editline.rb +27 -0
  299. data/examples/legacy/not_checked/shoes3-tests/events/button.rb +32 -0
  300. data/examples/legacy/not_checked/shoes3-tests/events/button.yaml +40 -0
  301. data/examples/legacy/not_checked/shoes3-tests/events/capture.rb +57 -0
  302. data/examples/legacy/not_checked/shoes3-tests/events/chipmunk.yaml +47 -0
  303. data/examples/legacy/not_checked/shoes3-tests/events/event0.rb +8 -0
  304. data/examples/legacy/not_checked/shoes3-tests/events/event1.rb +51 -0
  305. data/examples/legacy/not_checked/shoes3-tests/events/event1.yaml +26 -0
  306. data/examples/legacy/not_checked/shoes3-tests/events/event2.rb +46 -0
  307. data/examples/legacy/not_checked/shoes3-tests/events/event3.rb +44 -0
  308. data/examples/legacy/not_checked/shoes3-tests/events/event4.rb +65 -0
  309. data/examples/legacy/not_checked/shoes3-tests/events/event5.rb +17 -0
  310. data/examples/legacy/not_checked/shoes3-tests/events/event6.rb +51 -0
  311. data/examples/legacy/not_checked/shoes3-tests/events/replay.rb +60 -0
  312. data/examples/legacy/not_checked/shoes3-tests/gapp/fullscreen.rb +38 -0
  313. data/examples/legacy/not_checked/shoes3-tests/gapp/icon.rb +56 -0
  314. data/examples/legacy/not_checked/shoes3-tests/gapp/mon1.rb +46 -0
  315. data/examples/legacy/not_checked/shoes3-tests/gapp/settings1.rb +22 -0
  316. data/examples/legacy/not_checked/shoes3-tests/gapp/title1.rb +34 -0
  317. data/examples/legacy/not_checked/shoes3-tests/indian.m4a +0 -0
  318. data/examples/legacy/not_checked/shoes3-tests/menus/event.rb +33 -0
  319. data/examples/legacy/not_checked/shoes3-tests/menus/menu1.rb +8 -0
  320. data/examples/legacy/not_checked/shoes3-tests/menus/menu2.rb +25 -0
  321. data/examples/legacy/not_checked/shoes3-tests/menus/menu3.rb +103 -0
  322. data/examples/legacy/not_checked/shoes3-tests/menus/menu4.rb +41 -0
  323. data/examples/legacy/not_checked/shoes3-tests/menus/tests.txt +42 -0
  324. data/examples/legacy/not_checked/shoes3-tests/opacity.rb +13 -0
  325. data/examples/legacy/not_checked/shoes3-tests/plot/^IRX.R +5219 -0
  326. data/examples/legacy/not_checked/shoes3-tests/plot/^SPX +5219 -0
  327. data/examples/legacy/not_checked/shoes3-tests/plot/cstest.rb +51 -0
  328. data/examples/legacy/not_checked/shoes3-tests/plot/gr1.rb +73 -0
  329. data/examples/legacy/not_checked/shoes3-tests/plot/gr2.rb +40 -0
  330. data/examples/legacy/not_checked/shoes3-tests/plot/gr3.rb +47 -0
  331. data/examples/legacy/not_checked/shoes3-tests/plot/gr4.rb +35 -0
  332. data/examples/legacy/not_checked/shoes3-tests/plot/gr5.rb +31 -0
  333. data/examples/legacy/not_checked/shoes3-tests/plot/gr6.rb +35 -0
  334. data/examples/legacy/not_checked/shoes3-tests/plot/gr7.rb +37 -0
  335. data/examples/legacy/not_checked/shoes3-tests/plot/grcsv.rb +219 -0
  336. data/examples/legacy/not_checked/shoes3-tests/plot/manual.rb +40 -0
  337. data/examples/legacy/not_checked/shoes3-tests/progress/progress.rb +29 -0
  338. data/examples/legacy/not_checked/shoes3-tests/radio/clear.rb +20 -0
  339. data/examples/legacy/not_checked/shoes3-tests/radio/group.rb +18 -0
  340. data/examples/legacy/not_checked/shoes3-tests/radio/multiple.rb +32 -0
  341. data/examples/legacy/not_checked/shoes3-tests/radio/nogroup.rb +9 -0
  342. data/examples/legacy/not_checked/shoes3-tests/simpletest.svg +14 -0
  343. data/examples/legacy/not_checked/shoes3-tests/spinner.rb +15 -0
  344. data/examples/legacy/not_checked/shoes3-tests/svg.rb +208 -0
  345. data/examples/legacy/not_checked/shoes3-tests/switch/switch.rb +28 -0
  346. data/examples/legacy/not_checked/shoes3-tests/systray/back.rb +20 -0
  347. data/examples/legacy/not_checked/shoes3-tests/systray/note.rb +17 -0
  348. data/examples/legacy/not_checked/shoes3-tests/terminal/cursor.rb +27 -0
  349. data/examples/legacy/not_checked/shoes3-tests/terminal/ed.rb +65 -0
  350. data/examples/legacy/not_checked/shoes3-tests/terminal/el.rb +50 -0
  351. data/examples/legacy/not_checked/shoes3-tests/terminal/logattr.rb +31 -0
  352. data/examples/legacy/not_checked/shoes3-tests/tests_color.rb +138 -0
  353. data/examples/legacy/not_checked/shoes3-tests/tests_svg.rb +228 -0
  354. data/examples/legacy/not_checked/shoes3-tests/tests_video_vlc.rb +186 -0
  355. data/examples/legacy/not_checked/shoes3-tests/tooltips.rb +20 -0
  356. data/examples/legacy/not_checked/shoes3-tests/video_vlc.rb +242 -0
  357. data/examples/legacy/not_checked/shoes3-tests/wheel/wheel1.rb +21 -0
  358. data/examples/legacy/not_checked/simple/accordion.rb +81 -0
  359. data/examples/legacy/not_checked/simple/anim-shapes.rb +17 -0
  360. data/examples/legacy/not_checked/simple/anim-text.rb +13 -0
  361. data/examples/legacy/not_checked/simple/arc.rb +23 -0
  362. data/examples/legacy/not_checked/simple/bounce.rb +24 -0
  363. data/examples/legacy/not_checked/simple/chipmunk.rb +26 -0
  364. data/examples/legacy/not_checked/simple/control-sizes.rb +24 -0
  365. data/examples/legacy/not_checked/simple/curve-control-points.rb +24 -0
  366. data/examples/legacy/not_checked/simple/curve.rb +26 -0
  367. data/examples/legacy/not_checked/simple/dialogs.rb +29 -0
  368. data/examples/legacy/not_checked/simple/downloader.rb +40 -0
  369. data/examples/legacy/not_checked/simple/downloader1.rb +31 -0
  370. data/examples/legacy/not_checked/simple/draw.rb +13 -0
  371. data/examples/legacy/not_checked/simple/editor.rb +28 -0
  372. data/examples/legacy/not_checked/simple/form.rb +30 -0
  373. data/examples/legacy/not_checked/simple/image.rb +21 -0
  374. data/examples/legacy/not_checked/simple/info.rb +78 -0
  375. data/examples/legacy/not_checked/simple/mask.rb +21 -0
  376. data/examples/legacy/not_checked/simple/mask2.rb +27 -0
  377. data/examples/legacy/not_checked/simple/menu.rb +31 -0
  378. data/examples/legacy/not_checked/simple/menu1.rb +35 -0
  379. data/examples/legacy/not_checked/simple/slide.rb +45 -0
  380. data/examples/legacy/not_checked/simple/sphere.rb +28 -0
  381. data/examples/legacy/not_checked/superleg.rb +244 -0
  382. data/examples/legacy/working/shoes-contrib/basic/a-poem.rb +24 -0
  383. data/examples/legacy/working/shoes-contrib/basic/basic-blocks-instances.rb +7 -0
  384. data/examples/legacy/working/shoes-contrib/basic/basic-blocks.rb +7 -0
  385. data/examples/legacy/working/shoes-contrib/basic/basic-slot.rb +8 -0
  386. data/examples/legacy/working/shoes-contrib/basic/intro.rb +20 -0
  387. data/examples/legacy/working/shoes-contrib/basic/two-column.rb +12 -0
  388. data/examples/legacy/working/shoes-contrib/elements/edit_box.rb +6 -0
  389. data/examples/legacy/working/shoes-contrib/kernel/alert.rb +3 -0
  390. data/examples/legacy/working/simple/calc.rb +71 -0
  391. data/examples/legacy/working/simple/sqlite3.rb +27 -0
  392. data/examples/legacy/working/simple/timer.rb +13 -0
  393. data/examples/line.rb +5 -0
  394. data/examples/link.rb +20 -0
  395. data/examples/list_box.rb +8 -0
  396. data/examples/local_fonts.rb +4 -0
  397. data/examples/local_images.rb +4 -0
  398. data/examples/motion_events.rb +20 -0
  399. data/examples/para/collection_of_arguments.rb +9 -0
  400. data/examples/para/hello_world.rb +5 -0
  401. data/examples/para/hide_and_show.rb +9 -0
  402. data/examples/para/rainbow.rb +11 -0
  403. data/examples/para/rainbow_2.rb +11 -0
  404. data/examples/para/sizes.rb +11 -0
  405. data/examples/para/sizes_2.rb +12 -0
  406. data/examples/para/strong.rb +3 -0
  407. data/examples/para_text_widgets.rb +4 -0
  408. data/examples/parse_xl_funnies.rb +58 -0
  409. data/examples/pirate.png +0 -0
  410. data/examples/raw_flow.rb +11 -0
  411. data/examples/ruby_racer.rb +50 -0
  412. data/examples/selfitude.rb +18 -0
  413. data/examples/shapes/arc.rb +8 -0
  414. data/examples/shapes/shapes.rb +8 -0
  415. data/examples/shapes/shapes_fill.rb +10 -0
  416. data/examples/shapes/star.rb +5 -0
  417. data/examples/shoes_school.rb +66 -0
  418. data/examples/shoes_splorer.rb +150 -0
  419. data/examples/simple_slides.rb +73 -0
  420. data/examples/skip_ci/parrot.rb +22 -0
  421. data/examples/skip_ci/say.rb +20 -0
  422. data/examples/sleepless.rb +26 -0
  423. data/examples/slots.rb +10 -0
  424. data/examples/spacing.rb +18 -0
  425. data/examples/span.rb +6 -0
  426. data/examples/stack/background.rb +35 -0
  427. data/examples/stack/border.rb +11 -0
  428. data/examples/stack/gradients.rb +6 -0
  429. data/examples/stack/raw_stack.rb +8 -0
  430. data/examples/stack/stack.rb +27 -0
  431. data/examples/text_change.rb +4 -0
  432. data/examples/text_sizes.rb +10 -0
  433. data/examples/timmy.rb +109 -0
  434. data/examples/title_and_resize.rb +3 -0
  435. data/examples/video.rb +10 -0
  436. data/exe/scarpe +107 -0
  437. data/fonts/Pacifico.ttf +0 -0
  438. data/lib/scarpe/alert.rb +19 -0
  439. data/lib/scarpe/arc.rb +49 -0
  440. data/lib/scarpe/background.rb +14 -0
  441. data/lib/scarpe/base64.rb +27 -0
  442. data/lib/scarpe/border.rb +16 -0
  443. data/lib/scarpe/button.rb +35 -0
  444. data/lib/scarpe/cats_cradle.rb +255 -0
  445. data/lib/scarpe/colors.rb +215 -0
  446. data/lib/scarpe/display_service.rb +185 -0
  447. data/lib/scarpe/document_root.rb +20 -0
  448. data/lib/scarpe/download.rb +123 -0
  449. data/lib/scarpe/edit_box.rb +29 -0
  450. data/lib/scarpe/edit_line.rb +25 -0
  451. data/lib/scarpe/fill.rb +23 -0
  452. data/lib/scarpe/flow.rb +18 -0
  453. data/lib/scarpe/font.rb +14 -0
  454. data/lib/scarpe/glibui/README.md +34 -0
  455. data/lib/scarpe/glibui/alert.rb +65 -0
  456. data/lib/scarpe/glibui/app.rb +27 -0
  457. data/lib/scarpe/glibui/background.rb +18 -0
  458. data/lib/scarpe/glibui/border.rb +22 -0
  459. data/lib/scarpe/glibui/button.rb +38 -0
  460. data/lib/scarpe/glibui/dimensions.rb +22 -0
  461. data/lib/scarpe/glibui/document_root.rb +33 -0
  462. data/lib/scarpe/glibui/edit_box.rb +44 -0
  463. data/lib/scarpe/glibui/edit_line.rb +43 -0
  464. data/lib/scarpe/glibui/flow.rb +33 -0
  465. data/lib/scarpe/glibui/html.rb +77 -0
  466. data/lib/scarpe/glibui/image.rb +36 -0
  467. data/lib/scarpe/glibui/link.rb +29 -0
  468. data/lib/scarpe/glibui/local_display.rb +62 -0
  469. data/lib/scarpe/glibui/para.rb +84 -0
  470. data/lib/scarpe/glibui/spacing.rb +41 -0
  471. data/lib/scarpe/glibui/stack.rb +33 -0
  472. data/lib/scarpe/glibui/text_widget.rb +30 -0
  473. data/lib/scarpe/glibui/widget.rb +81 -0
  474. data/lib/scarpe/glibui.rb +29 -0
  475. data/lib/scarpe/image.rb +35 -0
  476. data/lib/scarpe/libui/alert.rb +9 -0
  477. data/lib/scarpe/libui/button.rb +18 -0
  478. data/lib/scarpe/libui/colors.rb +157 -0
  479. data/lib/scarpe/libui/core.rb +66 -0
  480. data/lib/scarpe/libui/flow.rb +16 -0
  481. data/lib/scarpe/libui/libui.rb +45 -0
  482. data/lib/scarpe/libui/notepad.md +26 -0
  483. data/lib/scarpe/libui/para.rb +154 -0
  484. data/lib/scarpe/libui/stack.rb +34 -0
  485. data/lib/scarpe/line.rb +25 -0
  486. data/lib/scarpe/link.rb +25 -0
  487. data/lib/scarpe/list_box.rb +25 -0
  488. data/lib/scarpe/logger.rb +159 -0
  489. data/lib/scarpe/para.rb +92 -0
  490. data/lib/scarpe/promises.rb +405 -0
  491. data/lib/scarpe/shape.rb +20 -0
  492. data/lib/scarpe/slot.rb +7 -0
  493. data/lib/scarpe/spacing.rb +9 -0
  494. data/lib/scarpe/span.rb +26 -0
  495. data/lib/scarpe/stack.rb +20 -0
  496. data/lib/scarpe/star.rb +47 -0
  497. data/lib/scarpe/subscription_item.rb +60 -0
  498. data/lib/scarpe/unit_test_helpers.rb +236 -0
  499. data/lib/scarpe/version.rb +5 -0
  500. data/lib/scarpe/video.rb +15 -0
  501. data/lib/scarpe/widgets.rb +35 -0
  502. data/lib/scarpe/wv/alert.rb +65 -0
  503. data/lib/scarpe/wv/app.rb +104 -0
  504. data/lib/scarpe/wv/arc.rb +57 -0
  505. data/lib/scarpe/wv/background.rb +27 -0
  506. data/lib/scarpe/wv/border.rb +24 -0
  507. data/lib/scarpe/wv/button.rb +50 -0
  508. data/lib/scarpe/wv/control_interface.rb +147 -0
  509. data/lib/scarpe/wv/control_interface_test.rb +234 -0
  510. data/lib/scarpe/wv/dimensions.rb +22 -0
  511. data/lib/scarpe/wv/document_root.rb +8 -0
  512. data/lib/scarpe/wv/edit_box.rb +44 -0
  513. data/lib/scarpe/wv/edit_line.rb +43 -0
  514. data/lib/scarpe/wv/fill.rb +30 -0
  515. data/lib/scarpe/wv/flow.rb +24 -0
  516. data/lib/scarpe/wv/font.rb +36 -0
  517. data/lib/scarpe/wv/html.rb +108 -0
  518. data/lib/scarpe/wv/image.rb +41 -0
  519. data/lib/scarpe/wv/line.rb +38 -0
  520. data/lib/scarpe/wv/link.rb +29 -0
  521. data/lib/scarpe/wv/list_box.rb +50 -0
  522. data/lib/scarpe/wv/para.rb +90 -0
  523. data/lib/scarpe/wv/shape.rb +35 -0
  524. data/lib/scarpe/wv/shape_helper.rb +44 -0
  525. data/lib/scarpe/wv/slot.rb +81 -0
  526. data/lib/scarpe/wv/spacing.rb +41 -0
  527. data/lib/scarpe/wv/span.rb +66 -0
  528. data/lib/scarpe/wv/stack.rb +24 -0
  529. data/lib/scarpe/wv/star.rb +64 -0
  530. data/lib/scarpe/wv/subscription_item.rb +50 -0
  531. data/lib/scarpe/wv/text_widget.rb +30 -0
  532. data/lib/scarpe/wv/video.rb +42 -0
  533. data/lib/scarpe/wv/web_wrangler.rb +683 -0
  534. data/lib/scarpe/wv/webview_local_display.rb +73 -0
  535. data/lib/scarpe/wv/webview_relay_display.rb +185 -0
  536. data/lib/scarpe/wv/widget.rb +185 -0
  537. data/lib/scarpe/wv/wv_display_worker.rb +65 -0
  538. data/lib/scarpe/wv.rb +43 -0
  539. data/lib/scarpe/wv_local.rb +6 -0
  540. data/lib/scarpe/wv_relay.rb +6 -0
  541. data/lib/scarpe.rb +29 -0
  542. data/lib/shoes/app.rb +187 -0
  543. data/lib/shoes/constants.rb +26 -0
  544. data/lib/shoes/text_widget.rb +52 -0
  545. data/lib/shoes/widget.rb +209 -0
  546. data/lib/shoes.rb +65 -0
  547. data/logger/debug_web_wrangler.json +4 -0
  548. data/logger/scarpe_wv_test.json +4 -0
  549. data/scarpe-0.2.0.gem +0 -0
  550. data/scarpe.gemspec +44 -0
  551. data/scarpegen.rb +193 -0
  552. data/sig/scarpe.rbs +4 -0
  553. data/templates/basic_class_template.erb +38 -0
  554. data/templates/class_template_with_event_bind.erb +27 -0
  555. data/templates/class_template_with_shapes.erb +43 -0
  556. data/templates/example_template.erb +3 -0
  557. data/templates/module_template.erb +12 -0
  558. data/templates/webview_template.erb +27 -0
  559. metadata +606 -0
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Scarpe
4
+ class Span < Shoes::Widget
5
+ display_properties :text, :stroke, :size, :font, :html_attributes
6
+
7
+ def initialize(text, stroke: nil, size: :span, font: nil, **html_attributes)
8
+ @text = text
9
+ @stroke = stroke
10
+ @size = size
11
+ @font = font
12
+ @html_attributes = html_attributes
13
+
14
+ super
15
+
16
+ create_display_widget
17
+ end
18
+
19
+ def replace(text)
20
+ @text = text
21
+
22
+ # This should signal the display widget to change
23
+ self.text = @text
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Scarpe
4
+ class Stack < Shoes::Slot
5
+ # TODO: sort out various margin and padding properties, including putting stuff into spacing
6
+ display_properties :width, :height, :scroll
7
+
8
+ def initialize(width: nil, height: nil, margin: nil, padding: nil, scroll: false, margin_top: nil, margin_bottom: nil, margin_left: nil,
9
+ margin_right: nil, **options, &block)
10
+
11
+ @options = options
12
+
13
+ super
14
+
15
+ create_display_widget
16
+ # Create the display-side widget *before* running the block, which will add child widgets with their display widgets
17
+ Shoes::App.instance.with_slot(self, &block) if block_given?
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "wv/shape_helper"
4
+ class Scarpe
5
+ class InvalidAttributeValueError < Scarpe::Error; end
6
+
7
+ class Star < Shoes::Widget
8
+ include ShapeHelper
9
+ display_properties :left, :top, :points, :outer, :inner, :color
10
+
11
+ def initialize(left, top, points = 10, outer = 100, inner = 50)
12
+ @points = convert_to_integer(points, "points", 10)
13
+ @outer = convert_to_float(outer, "outer", 100.0)
14
+ @inner = convert_to_float(inner, "inner", 50.0)
15
+ @color = color_for_fill
16
+
17
+ super()
18
+ create_display_widget
19
+ end
20
+
21
+ private
22
+
23
+ def convert_to_integer(value, attribute_name, default = 0)
24
+ begin
25
+ value = Integer(value)
26
+ raise InvalidAttributeValueError, "Negative num '#{value}' not allowed for attribute '#{attribute_name}'" if value < 0
27
+
28
+ value
29
+ rescue ArgumentError
30
+ error_message = "Invalid value '#{value}' provided for attribute '#{attribute_name}'. The value should be a number."
31
+ raise InvalidAttributeValueError, error_message
32
+ end
33
+ end
34
+
35
+ def convert_to_float(value, attribute_name, default = 0.0)
36
+ begin
37
+ value = Float(value)
38
+ raise InvalidAttributeValueError, "Negative num '#{value}' not allowed for attribute '#{attribute_name}'" if value < 0
39
+
40
+ value
41
+ rescue ArgumentError
42
+ error_message = "Invalid value '#{value}' provided for attribute '#{attribute_name}'. The value should be a number."
43
+ raise InvalidAttributeValueError, error_message
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Certain Shoes calls like motion and keydown are basically an
4
+ # event subscription, with no other visible presence. However,
5
+ # they have a place in the widget tree and can be deleted.
6
+ #
7
+ # Depending on the display library they may not have any
8
+ # direct visual (or similar) presence there either.
9
+ #
10
+ # Inheriting from Widget gives these a parent slot and a
11
+ # linkable_id automatically.
12
+ class SubscriptionItem < Shoes::Widget
13
+ display_property :shoes_api_name
14
+
15
+ def initialize(shoes_api_name:, &block)
16
+ super
17
+
18
+ @callback = block
19
+
20
+ case shoes_api_name
21
+ when "hover"
22
+ # Hover passes the Shoes widget as the block param
23
+ @unsub_id = bind_self_event("hover") do
24
+ @callback&.call(self)
25
+ end
26
+ when "motion"
27
+ # Shoes sends back x, y, mods as the args.
28
+ # Shoes3 uses the strings "control" "shift" and
29
+ # "control_shift" as the mods arg.
30
+ @unsub_id = bind_self_event("motion") do |x, y, ctrl_key, shift_key, **_kwargs|
31
+ mods = [ctrl_key ? "control" : nil, shift_key ? "shift" : nil].compact.join("_")
32
+ @callback&.call(x, y, mods)
33
+ end
34
+ when "click"
35
+ # Click has block params button, left, top
36
+ # button is the button number, left and top are coords
37
+ @unsub_id = bind_self_event("click") do |button, x, y, **_kwargs|
38
+ @callback&.call(button, x, y)
39
+ end
40
+ else
41
+ raise "Unknown Shoes API call #{shoes_api_name.inspect} passed to SubscriptionItem!"
42
+ end
43
+
44
+ @unsub_id = bind_self_event(shoes_api_name) do |*args|
45
+ @callback&.call(*args)
46
+ end
47
+
48
+ # This won't create a visible display widget, but will turn into
49
+ # an invisible widget and a stream of events.
50
+ create_display_widget
51
+ end
52
+
53
+ def destroy
54
+ # TODO: we need a better way to do this automatically. See https://github.com/scarpe-team/scarpe/issues/291
55
+ unsub_shoes_event(@unsub_id) if @unsub_id
56
+ @unsub_id = nil
57
+
58
+ super
59
+ end
60
+ end
@@ -0,0 +1,236 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tempfile"
4
+ require "json"
5
+ require "fileutils"
6
+
7
+ module Scarpe::Test; end
8
+
9
+ # We want test failures set up once *total*, not per Minitest::Test. So an instance var
10
+ # doesn't do it.
11
+ ALREADY_SET_UP_LOGGED_TEST_FAILURES = { setup: false }
12
+
13
+ # General helpers for general usage
14
+ # Helpers here should *not* use Webview-specific functionality.
15
+ # The intention is that these are helpers for various Scarpe display
16
+ # services that do *not* use Webview.
17
+ module Scarpe::Test::Helpers
18
+ def with_tempfile(prefix, contents, dir: Dir.tmpdir)
19
+ t = Tempfile.new(prefix, dir)
20
+ t.write(contents)
21
+ t.flush # Make sure the contents are written out
22
+
23
+ yield(t.path)
24
+ ensure
25
+ t.close
26
+ t.unlink
27
+ end
28
+
29
+ # Pass an array of arrays, where each array is of the form:
30
+ # [prefix, contents, (optional)dir]
31
+ #
32
+ # I don't love inlining with_tempfile's contents into here.
33
+ # But calling it iteratively or recursively was difficult
34
+ # when I tried it the obvious ways.
35
+ def with_tempfiles(tf_specs, &block)
36
+ tempfiles = []
37
+ tf_specs.each do |prefix, contents, dir|
38
+ dir ||= Dir.tmpdir
39
+ t = Tempfile.new(prefix, dir)
40
+ tempfiles << t
41
+ t.write(contents)
42
+ t.flush # Make sure the contents are written out
43
+ end
44
+
45
+ args = tempfiles.map(&:path)
46
+ yield(args)
47
+ ensure
48
+ tempfiles.each do |t|
49
+ t.close
50
+ t.unlink
51
+ end
52
+ end
53
+
54
+ # Temporarily set env vars for the block of code inside
55
+ def with_env_vars(envs)
56
+ old_env = {}
57
+ envs.each do |k, v|
58
+ old_env[k] = ENV[k]
59
+ ENV[k] = v
60
+ end
61
+ yield
62
+ ensure
63
+ old_env.each { |k, v| ENV[k] = v }
64
+ end
65
+
66
+ def assert_include(text, subtext, msg = nil)
67
+ msg ||= "Expected #{text.inspect} to include #{subtext.inspect}"
68
+ assert text.include?(subtext), msg
69
+ end
70
+
71
+ def assert_not_include(text, subtext, msg = nil)
72
+ msg ||= "Expected #{text.inspect} not to include #{subtext.inspect}"
73
+ assert !text.include?(subtext), msg
74
+ end
75
+
76
+ def assert_html(actual_html, expected_tag, **opts, &block)
77
+ expected_html = Scarpe::HTML.render do |h|
78
+ h.public_send(expected_tag, opts, &block)
79
+ end
80
+
81
+ assert_equal expected_html, actual_html
82
+ end
83
+
84
+ # This does a final return of results. If it gets called
85
+ # multiple times, the test fails because that's not okay.
86
+ def return_results(result_bool, msg, data = {})
87
+ result_file = ENV["SCARPE_TEST_RESULTS"] || "./scarpe_results.txt"
88
+
89
+ result_structs = [result_bool, msg, data.merge(test_metadata)]
90
+ if File.exist?(result_file)
91
+ results_returned = JSON.parse File.read(result_file)
92
+ end
93
+
94
+ # Multiple different sets of results is bad, even if both are passing.
95
+ if results_returned && results_returned[0..1] != result_structs[0..1]
96
+ # Just raising here doesn't reliably fail the test.
97
+ # See: https://github.com/scarpe-team/scarpe/issues/212
98
+ Scarpe::Logger.logger("Test Results").error("Writing multi-result failure file to #{result_file.inspect}!")
99
+
100
+ new_res_data = { first_result: results_returned, second_result: result_structs }.merge(test_metadata)
101
+ bad_result = [false, "Returned two sets of results!", new_res_data]
102
+ File.write(result_file, JSON.pretty_generate(bad_result))
103
+
104
+ return
105
+ elsif results_returned
106
+ Scarpe::Logger.logger("Test Results").warn "Returning identical results twice: #{results_returned.inspect}"
107
+ end
108
+
109
+ Scarpe::Logger.logger("Test Results").debug("Writing results file #{result_file.inspect} to disk!")
110
+ File.write(result_file, JSON.pretty_generate(result_structs))
111
+ end
112
+ end
113
+
114
+ # This test will save extensive logs in case of test failure.
115
+ # Note that it defines setup/teardown methods. If you want
116
+ # multiple setup/teardowns from multiple places to happen you
117
+ # may need to explictly call (e.g. with logged_test_setup/teardown)
118
+ # to ensure everything you want happens.
119
+ module Scarpe::Test::LoggedTest
120
+ LOGGER_DIR = File.expand_path("#{__dir__}/../../logger")
121
+
122
+ def file_id
123
+ "#{self.class.name}_#{self.name}"
124
+ end
125
+
126
+ def logged_test_setup
127
+ # Make sure test failures will be saved at the end of the run.
128
+ # Delete stale test failures and logging only the *first* time this is called.
129
+ set_up_test_failures
130
+
131
+ @normal_log_config = Scarpe::Logger.current_log_config
132
+ Scarpe::Logger.configure_logger(log_config_for_test)
133
+
134
+ Scarpe::Logger.logger("LoggedScarpeTest").info("Test: #{self.class.name}##{self.name}")
135
+ end
136
+
137
+ # If you include this module and don't override setup/teardown, everything will
138
+ # work fine. But if you need more setup/teardown steps, you can do that too.
139
+ def setup
140
+ logged_test_setup
141
+ end
142
+
143
+ def logged_test_teardown
144
+ # Restore previous log config
145
+ Scarpe::Logger.configure_logger(@normal_log_config)
146
+
147
+ if self.failure
148
+ save_failure_logs
149
+ else
150
+ remove_unsaved_logs
151
+ end
152
+ end
153
+
154
+ def teardown
155
+ logged_test_teardown
156
+ end
157
+
158
+ def log_config_for_test
159
+ {
160
+ "default" => ["debug", "logger/test_failure_#{file_id}.log"],
161
+
162
+ "WebviewAPI" => ["debug", "logger/test_failure_wv_api_#{file_id}.log"],
163
+
164
+ "CatsCradle" => ["debug", "logger/test_failure_catscradle_#{file_id}.log"],
165
+
166
+ "DisplayService" => ["debug", "logger/test_failure_events_#{file_id}.log"],
167
+ "WV::RelayDisplayService" => ["debug", "logger/test_failure_events_#{file_id}.log"],
168
+ "WV::WebviewDisplayService" => ["debug", "logger/test_failure_events_#{file_id}.log"],
169
+ "WV::ControlInterface" => ["debug", "logger/test_failure_events_#{file_id}.log"],
170
+ }
171
+ end
172
+
173
+ # This could be a lot simpler except I want to only update the file list in one place,
174
+ # log_config_for_test(). Having a single spot should (I hope) make it a lot friendlier to
175
+ # add more logfiles for different components, logged API objects, etc.
176
+ def saved_log_files
177
+ lc = log_config_for_test
178
+ log_outfiles = lc.values.map { |_level, loc| loc }
179
+ log_outfiles.select { |s| s.start_with?("logger/") }.map { |s| s.delete_prefix("logger/") }
180
+ end
181
+
182
+ def set_up_test_failures
183
+ return if ALREADY_SET_UP_LOGGED_TEST_FAILURES[:setup]
184
+
185
+ ALREADY_SET_UP_LOGGED_TEST_FAILURES[:setup] = true
186
+ # Delete stale test failures, if any, before starting the first failure-logged test
187
+ Dir["#{LOGGER_DIR}/test_failure*.log"].each { |fn| File.unlink(fn) }
188
+
189
+ Minitest.after_run do
190
+ # Print test failure notice to console
191
+ unless Dir["#{LOGGER_DIR}/test_failure*.out.log"].empty?
192
+ puts "Some tests have failed! See #{LOGGER_DIR}/test_failure*.out.log for test logs!"
193
+ end
194
+
195
+ # Remove un-saved test logs
196
+ Dir["#{LOGGER_DIR}/test_failure*.log"].each do |f|
197
+ next if f.include?(".out.log")
198
+
199
+ File.unlink(f) if File.exist?(f)
200
+ end
201
+ end
202
+ end
203
+
204
+ def logfail_out_loc(filepath)
205
+ # Add a .out prefix before final .log
206
+ out_loc = filepath.gsub(%r{.log\Z}, ".out.log")
207
+
208
+ if out_loc == filepath
209
+ raise "Something is wrong! Could not figure out failure-log output path for #{filepath.inspect}!"
210
+ end
211
+
212
+ if File.exist?(out_loc)
213
+ raise "Duplicate test file #{out_loc.inspect}? This file should *not* already exist!"
214
+ end
215
+
216
+ out_loc
217
+ end
218
+
219
+ def save_failure_logs
220
+ saved_log_files.each do |log_file|
221
+ full_loc = File.expand_path("#{LOGGER_DIR}/#{log_file}")
222
+ # TODO: we'd like to skip 0-length logfiles. But also Logging doesn't flush. For now, ignore.
223
+ next unless File.exist?(full_loc)
224
+
225
+ FileUtils.mv full_loc, logfail_out_loc(full_loc)
226
+ end
227
+ end
228
+
229
+ def remove_unsaved_logs
230
+ Dir["#{LOGGER_DIR}/test_failure*.log"].each do |f|
231
+ next if f.include?(".out.log") # Don't delete saved logs
232
+
233
+ File.unlink(f)
234
+ end
235
+ end
236
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Scarpe
4
+ VERSION = "0.2.1"
5
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Scarpe
4
+ class Video < Shoes::Widget
5
+ display_properties :url
6
+
7
+ def initialize(url)
8
+ @url = url
9
+ super
10
+ create_display_widget
11
+ end
12
+
13
+ # other methods
14
+ end
15
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "colors"
4
+ require "shoes/widget"
5
+ require "shoes/app"
6
+
7
+ require_relative "spacing"
8
+ require_relative "background"
9
+ require_relative "border"
10
+ require_relative "star"
11
+
12
+ require_relative "fill"
13
+ require_relative "font"
14
+
15
+ require_relative "slot"
16
+ require_relative "para"
17
+ require_relative "stack"
18
+ require_relative "flow"
19
+ require_relative "document_root"
20
+ require_relative "download"
21
+ require_relative "subscription_item"
22
+ require_relative "button"
23
+ require_relative "image"
24
+ require_relative "edit_box"
25
+ require_relative "edit_line"
26
+ require_relative "list_box"
27
+ require_relative "alert"
28
+ require_relative "span"
29
+ require_relative "shape"
30
+ require_relative "arc"
31
+
32
+ require "shoes/text_widget"
33
+ require_relative "link"
34
+ require_relative "line"
35
+ require_relative "video"
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Scarpe
4
+ class WebviewAlert < WebviewWidget
5
+ def initialize(properties)
6
+ super
7
+
8
+ bind("click") do
9
+ send_self_event(event_name: "click")
10
+ end
11
+ end
12
+
13
+ def element
14
+ onclick = handler_js_code("click")
15
+
16
+ HTML.render do |h|
17
+ h.div(id: html_id, style: overlay_style) do
18
+ h.div(style: modal_style) do
19
+ h.div(style: text_style) { @text }
20
+ h.button(style: button_style, onclick: onclick) { "OK" }
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def overlay_style
29
+ {
30
+ position: "fixed",
31
+ top: "0",
32
+ left: "0",
33
+ width: "100%",
34
+ height: "100%",
35
+ overflow: "auto",
36
+ "z-index": "1",
37
+ background: "rgba(0,0,0,0.4)",
38
+ display: "flex",
39
+ "align-items": "center",
40
+ "justify-content": "center",
41
+ }
42
+ end
43
+
44
+ def modal_style
45
+ {
46
+ "min-width": "200px",
47
+ "min-height": "50px",
48
+ padding: "10px",
49
+ display: "flex",
50
+ background: "#fefefe",
51
+ "flex-direction": "column",
52
+ "justify-content": "space-between",
53
+ "border-radius": "9px",
54
+ }
55
+ end
56
+
57
+ def text_style
58
+ {}
59
+ end
60
+
61
+ def button_style
62
+ {}
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Scarpe
4
+ # Scarpe::WebviewApp must only be used from the main thread, due to GTK+ limitations.
5
+ class WebviewApp < WebviewWidget
6
+ attr_reader :debug
7
+ attr_reader :control_interface
8
+
9
+ attr_writer :shoes_linkable_id
10
+
11
+ def initialize(properties)
12
+ super
13
+
14
+ # It's possible to provide a Ruby script by setting
15
+ # SCARPE_TEST_CONTROL to its file path. This can
16
+ # allow pre-setting test options or otherwise
17
+ # performing additional actions not written into
18
+ # the Shoes app itself.
19
+ #
20
+ # The control interface is what lets these files see
21
+ # events, specify overrides and so on.
22
+ @control_interface = ControlInterface.new
23
+ if ENV["SCARPE_TEST_CONTROL"]
24
+ require "scarpe/unit_test_helpers"
25
+ @control_interface.instance_eval File.read(ENV["SCARPE_TEST_CONTROL"])
26
+ end
27
+
28
+ # TODO: rename @view
29
+ @view = Scarpe::WebWrangler.new title: @title,
30
+ width: @width,
31
+ height: @height,
32
+ resizable: @resizable,
33
+ debug: @debug
34
+
35
+ @callbacks = {}
36
+
37
+ # The control interface has to exist to get callbacks like "override Scarpe app opts".
38
+ # But the Scarpe App needs those options to be created. So we can't pass these to
39
+ # ControlInterface.new.
40
+ @control_interface.set_system_components app: self, doc_root: nil, wrangler: @view
41
+
42
+ bind_shoes_event(event_name: "init") { init }
43
+ bind_shoes_event(event_name: "run") { run }
44
+ bind_shoes_event(event_name: "destroy") { destroy }
45
+ end
46
+
47
+ attr_writer :document_root
48
+
49
+ def init
50
+ scarpe_app = self
51
+
52
+ @view.init_code("scarpeInit") do
53
+ request_redraw!
54
+ end
55
+
56
+ @view.bind("scarpeHandler") do |*args|
57
+ handle_callback(*args)
58
+ end
59
+
60
+ @view.bind("scarpeExit") do
61
+ scarpe_app.destroy
62
+ end
63
+ end
64
+
65
+ def run
66
+ @control_interface.dispatch_event(:init)
67
+
68
+ # This takes control of the main thread and never returns. And it *must* be run from
69
+ # the main thread. And it stops any Ruby background threads.
70
+ # That's totally cool and normal, right?
71
+ @view.run
72
+ end
73
+
74
+ def destroy
75
+ if @document_root || @view
76
+ @control_interface.dispatch_event :shutdown
77
+ end
78
+ @document_root = nil
79
+ if @view
80
+ @view.destroy
81
+ @view = nil
82
+ end
83
+ end
84
+
85
+ # All JS callbacks to Scarpe widgets are dispatched
86
+ # via this handler
87
+ def handle_callback(name, *args)
88
+ @callbacks[name].call(*args)
89
+ end
90
+
91
+ # Bind a Scarpe callback name; see handle_callback above.
92
+ # See Scarpe::Widget for how the naming is set up
93
+ def bind(name, &block)
94
+ @callbacks[name] = block
95
+ end
96
+
97
+ def request_redraw!
98
+ wrangler = WebviewDisplayService.instance.wrangler
99
+ if wrangler.is_running
100
+ wrangler.replace(@document_root.to_html)
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "shape_helper"
4
+
5
+ class Scarpe
6
+ class WebviewArc < Scarpe::WebviewWidget
7
+ include ShapeHelper
8
+ def initialize(properties)
9
+ super(properties)
10
+ end
11
+
12
+ def element(&block)
13
+ HTML.render do |h|
14
+ h.div(id: html_id, style: style) do
15
+ h.svg(width: @width, height: @height) do
16
+ h.path(d: arc_path)
17
+ end
18
+ block.call(h) if block_given?
19
+ end
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def style
26
+ {
27
+ left: "#{@left}px",
28
+ top: "#{@top}px",
29
+ width: "#{@width}px",
30
+ height: "#{@height}px",
31
+ }
32
+ end
33
+
34
+ def arc_path
35
+ center_x = @width / 2
36
+ center_y = @height / 2
37
+ radius_x = @width / 2
38
+ radius_y = @height / 2
39
+ start_angle_degrees = radians_to_degrees(@angle1) % 360
40
+ end_angle_degrees = radians_to_degrees(@angle2) % 360
41
+ large_arc_flag = (end_angle_degrees - start_angle_degrees) % 360 > 180 ? 1 : 0
42
+
43
+ "M#{center_x} #{center_y} L#{@width} #{center_y} " \
44
+ "A#{radius_x} #{radius_y} 0 #{large_arc_flag} 0 " \
45
+ "#{center_x + radius_x * Math.cos(degrees_to_radians(end_angle_degrees))} " \
46
+ "#{center_y + radius_y * Math.sin(degrees_to_radians(end_angle_degrees))} Z"
47
+ end
48
+
49
+ def degrees_to_radians(degrees)
50
+ degrees * Math::PI / 180
51
+ end
52
+
53
+ def radians_to_degrees(radians)
54
+ radians * (180.0 / Math::PI)
55
+ end
56
+ end
57
+ end