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,255 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "scarpe/unit_test_helpers"
4
+
5
+ require "fiber"
6
+
7
+ # "Cat's Cradle" is a children's game where they interlace string between
8
+ # their fingers to make beautiful complicated shapes. The interlacing
9
+ # of fibers made it a good name for a prototype.
10
+
11
+ # An attempt at an experimental Fiber-based testing system to deal with
12
+ # Shoes, Display and JS all at the same time.
13
+ #
14
+ # In general, we'll use Fiber.transfer to bounce control back and forth
15
+ # between the evented implementations (e.g. waiting for redraw) that
16
+ # need to return control to Webview, and the procedural test flows
17
+ # that look far better if we don't do that explicitly.
18
+ #
19
+ # Ruby Fiber basic docs: https://ruby-doc.org/core-3.0.0/Fiber.html
20
+ #
21
+ module Scarpe::Test
22
+ # We'd like something we can call Shoes widget methods on, such as para.replace.
23
+ # But we'd also like to be able to grab the corresponding display widget and
24
+ # call some of *those* methods.
25
+ class CCProxy
26
+ attr_reader :display
27
+
28
+ def initialize(obj)
29
+ @obj = obj
30
+ # TODO: how to do this with Webview relay? Proxy object to send a message, maybe?
31
+ @display = ::Shoes::DisplayService.display_service.query_display_widget_for(obj.linkable_id)
32
+ end
33
+
34
+ def method_missing(method, ...)
35
+ if @obj.respond_to?(method)
36
+ self.singleton_class.define_method(method) do |*args, **kwargs, &block|
37
+ @obj.send(method, *args, **kwargs, &block)
38
+ end
39
+ send(method, ...)
40
+ else
41
+ super # raise an exception
42
+ end
43
+ end
44
+
45
+ def respond_to_missing?(method_name, include_private = false)
46
+ @obj.respond_to_missing?(method_name, include_private)
47
+ end
48
+ end
49
+
50
+ # This class defines the CatsCradle DSL. It also holds a "bag of fibers"
51
+ # with promises for when they should next resume.
52
+ class CCInstance
53
+ include Scarpe::Log
54
+ include Scarpe::Test::Helpers
55
+
56
+ def self.instance
57
+ @instance ||= CCInstance.new
58
+ end
59
+
60
+ def initialize
61
+ log_init("CatsCradle")
62
+
63
+ @assertion_data = []
64
+ @assertions_passed = 0
65
+ @assertions_failed = []
66
+
67
+ @waiting_fibers = []
68
+ @event_promises = {}
69
+
70
+ @manager_fiber = Fiber.new do
71
+ loop do
72
+ # A fiber can run briefly and then exit. It can run and then block on an API call.
73
+ # These fibers return promises to indicate to CatsCradle when they can run again.
74
+ # A fiber that is no longer #alive? is assumed to be successfully finished.
75
+ @waiting_fibers.each do |fiber_data|
76
+ next unless fiber_data[:promise].fulfilled?
77
+
78
+ @log.debug("Resuming fiber with value #{fiber_data[:promise].returned_value.inspect}")
79
+ result = fiber_data[:fiber].transfer fiber_data[:promise].returned_value
80
+
81
+ # Dead fibers will be removed later, just leave it
82
+ next unless fiber_data[:fiber].alive?
83
+
84
+ case result
85
+ when ::Scarpe::Promise
86
+ fiber_data[:promise] = result
87
+ else
88
+ raise "Unexpected object returned from Fiber#transfer for still-living Fiber! #{result.inspect}"
89
+ end
90
+ end
91
+
92
+ # Throw out dead fibers or those that will never wake
93
+ @waiting_fibers.select! do |fiber_data|
94
+ fiber_data[:fiber].alive? && !fiber_data[:promise].rejected?
95
+ end
96
+
97
+ # Done with this iteration
98
+ Fiber.yield
99
+ end
100
+ end
101
+ end
102
+
103
+ # If we add "every" events, that's likely to complicate timing and event_promise handling.
104
+ EVENT_TYPES = [:next_heartbeat, :next_redraw]
105
+
106
+ # This needs to be called after the basic display service objects exist
107
+ # and we can find the control interface.
108
+ def event_init
109
+ return if @cc_init_done
110
+
111
+ @cc_init_done = true
112
+
113
+ @control_interface = ::Shoes::DisplayService.display_service.control_interface
114
+ @wrangler = @control_interface.wrangler
115
+
116
+ cc_instance = self # ControlInterface#on_event does an instance eval. We'll reset self with another.
117
+
118
+ @control_interface.on_event(:every_heartbeat) do
119
+ cc_instance.instance_eval do
120
+ p = @event_promises.delete(:next_heartbeat)
121
+ p&.fulfilled!
122
+
123
+ # Give every ready fiber a chance to run once.
124
+ @manager_fiber.resume
125
+ end
126
+ end
127
+
128
+ @control_interface.on_event(:every_redraw) do
129
+ cc_instance.instance_eval do
130
+ p = @event_promises.delete(:next_redraw)
131
+ p&.fulfilled!
132
+
133
+ # Give every ready fiber a chance to run once.
134
+ @manager_fiber.resume
135
+ end
136
+ end
137
+ end
138
+
139
+ def event_promise(event)
140
+ @event_promises[event] ||= ::Scarpe::Promise.new
141
+ end
142
+
143
+ def on_event(event, &block)
144
+ raise "Unknown event type: #{event.inspect}!" unless EVENT_TYPES.include?(event)
145
+
146
+ f = Fiber.new do
147
+ CCInstance.instance.instance_eval(&block)
148
+ end
149
+ @waiting_fibers << { promise: event_promise(event), fiber: f }
150
+ end
151
+
152
+ WIDGET_FINDERS = {
153
+ "alert" => ::Scarpe::Alert,
154
+ "button" => ::Scarpe::Button,
155
+ "edit_box" => ::Scarpe::EditBox,
156
+ "edit_line" => ::Scarpe::EditLine,
157
+ "flow" => ::Scarpe::Flow,
158
+ "image" => ::Scarpe::Image,
159
+ "list_box" => ::Scarpe::ListBox,
160
+ "para" => ::Scarpe::Para,
161
+ "shape" => ::Scarpe::Shape,
162
+ "stack" => ::Scarpe::Stack,
163
+ "star" => ::Scarpe::Star,
164
+ }
165
+ # What to do about TextWidgets? Link, code, em, strong?
166
+ # Also, wait, what's up with span? What *is* that?
167
+ Shoes::Widget.widget_classes.each do |widget_class|
168
+ finder_name = widget_class.dsl_name
169
+
170
+ define_method(finder_name) do |*args|
171
+ app = Shoes::App.instance
172
+
173
+ widgets = app.find_widgets_by(widget_class, *args)
174
+ raise "Found more than one #{finder_name} matching #{args.inspect}!" if widgets.size > 1
175
+ raise "Found no #{finder_name} matching #{args.inspect}!" if widgets.empty?
176
+
177
+ CCProxy.new(widgets[0])
178
+ end
179
+ end
180
+
181
+ def wait(promise)
182
+ raise("Must supply a promise to wait!") unless promise.is_a?(::Scarpe::Promise)
183
+
184
+ # Wait until this promise is complete before running again
185
+ @manager_fiber.transfer(promise)
186
+ end
187
+
188
+ # This returns a promise, which can be waited on using wait()
189
+ def fully_updated
190
+ @wrangler.promise_dom_fully_updated
191
+ end
192
+
193
+ def dom_html(timeout: 1.0)
194
+ query_js_value("document.getElementById('wrapper-wvroot').innerHTML", timeout:)
195
+ end
196
+
197
+ def query_js_value(js_code, timeout: 1.0)
198
+ js_promise = @wrangler.eval_js_async(js_code, timeout:)
199
+
200
+ # This promise will return the string, so we can just pass it to #transfer
201
+ @manager_fiber.transfer(js_promise)
202
+ end
203
+
204
+ def assert(value, msg = nil)
205
+ msg ||= "Assertion #{value ? "succeeded" : "failed"}"
206
+ @assertion_data << [value ? true : false, msg]
207
+ if value
208
+ @assertions_passed += 1
209
+ else
210
+ @assertions_failed << msg
211
+ end
212
+ end
213
+
214
+ def assert_equal(expected, actual, msg = nil)
215
+ msg ||= "Expected #{actual.inspect} to equal #{expected.inspect}!"
216
+ assert actual == expected, msg
217
+ end
218
+
219
+ def assertion_data_as_a_struct
220
+ {
221
+ still_pending: 0,
222
+ succeeded: @assertions_passed,
223
+ failed: @assertions_failed.size,
224
+ failures: @assertions_failed,
225
+ }
226
+ end
227
+
228
+ def test_metadata
229
+ {}
230
+ end
231
+
232
+ def test_finished
233
+ if !@assertions_failed.empty?
234
+ return_results(false, "Assertions failed", assertion_data_as_a_struct)
235
+ elsif @assertions_passed > 0
236
+ return_results(true, "All assertions passed", assertion_data_as_a_struct)
237
+ else
238
+ return_results(true, "Test finished successfully")
239
+ end
240
+ ::Shoes::DisplayService.dispatch_event("destroy", nil)
241
+ end
242
+ end
243
+
244
+ # This module is mixed into Shoes::App if we're running CC-based tests
245
+ module CatsCradle
246
+ def event_init
247
+ @cc_instance = CCInstance.instance
248
+ @cc_instance.event_init
249
+ end
250
+
251
+ def on_heartbeat(&block)
252
+ @cc_instance.on_event(:next_heartbeat, &block)
253
+ end
254
+ end
255
+ end
@@ -0,0 +1,215 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Scarpe
4
+ module Colors
5
+ COLORS = {
6
+ aliceblue: [240, 248, 255],
7
+ antiquewhite: [250, 235, 215],
8
+ aqua: [0, 255, 255],
9
+ aquamarine: [127, 255, 212],
10
+ azure: [240, 255, 255],
11
+ beige: [245, 245, 220],
12
+ bisque: [255, 228, 196],
13
+ black: [0, 0, 0],
14
+ blanchedalmond: [255, 235, 205],
15
+ blue: [0, 0, 255],
16
+ blueviolet: [138, 43, 226],
17
+ brown: [165, 42, 42],
18
+ burlywood: [222, 184, 135],
19
+ cadetblue: [95, 158, 160],
20
+ chartreuse: [127, 255, 0],
21
+ chocolate: [210, 105, 30],
22
+ coral: [255, 127, 80],
23
+ cornflowerblue: [100, 149, 237],
24
+ cornsilk: [255, 248, 220],
25
+ crimson: [220, 20, 60],
26
+ cyan: [0, 255, 255],
27
+ darkblue: [0, 0, 139],
28
+ darkcyan: [0, 139, 139],
29
+ darkgoldenrod: [184, 134, 11],
30
+ darkgray: [169, 169, 169],
31
+ darkgreen: [0, 100, 0],
32
+ darkkhaki: [189, 183, 107],
33
+ darkmagenta: [139, 0, 139],
34
+ darkolivegreen: [85, 107, 47],
35
+ darkorange: [255, 140, 0],
36
+ darkorchid: [153, 50, 204],
37
+ darkred: [139, 0, 0],
38
+ darksalmon: [233, 150, 122],
39
+ darkseagreen: [143, 188, 143],
40
+ darkslateblue: [72, 61, 139],
41
+ darkslategray: [47, 79, 79],
42
+ darkturquoise: [0, 206, 209],
43
+ darkviolet: [148, 0, 211],
44
+ deeppink: [255, 20, 147],
45
+ deepskyblue: [0, 191, 255],
46
+ dimgray: [105, 105, 105],
47
+ dodgerblue: [30, 144, 255],
48
+ firebrick: [178, 34, 34],
49
+ floralwhite: [255, 250, 240],
50
+ forestgreen: [34, 139, 34],
51
+ fuchsia: [255, 0, 255],
52
+ gainsboro: [220, 220, 220],
53
+ ghostwhite: [248, 248, 255],
54
+ gold: [255, 215, 0],
55
+ goldenrod: [218, 165, 32],
56
+ green: [0, 128, 0],
57
+ greenyellow: [173, 255, 47],
58
+ honeydew: [240, 255, 240],
59
+ hotpink: [255, 105, 180],
60
+ indianred: [205, 92, 92],
61
+ indigo: [75, 0, 130],
62
+ ivory: [255, 255, 240],
63
+ khaki: [240, 230, 140],
64
+ lavender: [230, 230, 250],
65
+ lavenderblush: [255, 240, 245],
66
+ lawngreen: [124, 252, 0],
67
+ lemonchiffon: [255, 250, 205],
68
+ lightblue: [173, 216, 230],
69
+ lightcoral: [240, 128, 128],
70
+ lightcyan: [224, 255, 255],
71
+ lightgoldenrodyellow: [250, 250, 210],
72
+ lightgreen: [144, 238, 144],
73
+ lightgrey: [211, 211, 211],
74
+ lightpink: [255, 182, 193],
75
+ lightsalmon: [255, 160, 122],
76
+ lightseagreen: [32, 178, 170],
77
+ lightskyblue: [135, 206, 250],
78
+ lightslategray: [119, 136, 153],
79
+ lightsteelblue: [176, 196, 222],
80
+ lightyellow: [255, 255, 224],
81
+ lime: [0, 255, 0],
82
+ limegreen: [50, 205, 50],
83
+ linen: [250, 240, 230],
84
+ magenta: [255, 0, 255],
85
+ maroon: [128, 0, 0],
86
+ mediumaquamarine: [102, 205, 170],
87
+ mediumblue: [0, 0, 205],
88
+ mediumorchid: [186, 85, 211],
89
+ mediumpurple: [147, 112, 219],
90
+ mediumseagreen: [60, 179, 113],
91
+ mediumslateblue: [123, 104, 238],
92
+ mediumspringgreen: [0, 250, 154],
93
+ mediumturquoise: [72, 209, 204],
94
+ mediumvioletred: [199, 21, 133],
95
+ midnightblue: [25, 25, 112],
96
+ mintcream: [245, 255, 250],
97
+ mistyrose: [255, 228, 225],
98
+ moccasin: [255, 228, 181],
99
+ navajowhite: [255, 222, 173],
100
+ navy: [0, 0, 128],
101
+ oldlace: [253, 245, 230],
102
+ olive: [128, 128, 0],
103
+ olivedrab: [107, 142, 35],
104
+ orange: [255, 165, 0],
105
+ orangered: [255, 69, 0],
106
+ orchid: [218, 112, 214],
107
+ palegoldenrod: [238, 232, 170],
108
+ palegreen: [152, 251, 152],
109
+ paleturquoise: [175, 238, 238],
110
+ palevioletred: [219, 112, 147],
111
+ papayawhip: [255, 239, 213],
112
+ peachpuff: [255, 218, 185],
113
+ peru: [205, 133, 63],
114
+ pink: [255, 192, 203],
115
+ plum: [221, 160, 221],
116
+ powderblue: [176, 224, 230],
117
+ purple: [128, 0, 128],
118
+ red: [255, 0, 0],
119
+ rosybrown: [188, 143, 143],
120
+ royalblue: [65, 105, 225],
121
+ saddlebrown: [139, 69, 19],
122
+ salmon: [250, 128, 114],
123
+ sandybrown: [244, 164, 96],
124
+ seagreen: [46, 139, 87],
125
+ seashell: [255, 245, 238],
126
+ sienna: [160, 82, 45],
127
+ silver: [192, 192, 192],
128
+ skyblue: [135, 206, 235],
129
+ slateblue: [106, 90, 205],
130
+ slategray: [112, 128, 144],
131
+ snow: [255, 250, 250],
132
+ springgreen: [0, 255, 127],
133
+ steelblue: [70, 130, 180],
134
+ tan: [210, 180, 140],
135
+ teal: [0, 128, 128],
136
+ thistle: [216, 191, 216],
137
+ tomato: [255, 99, 71],
138
+ turquoise: [64, 224, 208],
139
+ violet: [238, 130, 238],
140
+ wheat: [245, 222, 179],
141
+ white: [255, 255, 255],
142
+ whitesmoke: [245, 245, 245],
143
+ yellow: [255, 255, 0],
144
+ yellowgreen: [154, 205, 50],
145
+ }
146
+ private_constant :COLORS
147
+
148
+ class << self
149
+ def included(base)
150
+ COLORS.each do |color, rgb|
151
+ base.define_method(color) do |alpha = 255|
152
+ rgb + [alpha]
153
+ end
154
+ end
155
+ end
156
+ end
157
+
158
+ # https://github.com/shoes/shoes3/blob/b856f28795112ecb64bc8f891ac166675f059beb/static/manual-en.txt#L839-L847
159
+ def gray(darkness = 128, alpha = nil)
160
+ alpha ||= (darkness.is_a?(Integer) ? 255 : 1.0)
161
+ [darkness, darkness, darkness, alpha]
162
+ end
163
+
164
+ # Shoes allows RGB values to be Floats between 0 and 1 or Integers between 0 and 255
165
+ def rgb(r, g, b, a = nil)
166
+ if r.is_a?(Float)
167
+ [r, g, b, a || 1.0]
168
+ elsif r.is_a?(Integer)
169
+ [r, g, b, a || 255]
170
+ else
171
+ raise("RGB values should be Float or Integer!")
172
+ end
173
+ end
174
+
175
+ def to_rgb(color)
176
+ case color
177
+ when nil
178
+ nil
179
+ when Array
180
+ color # Already an RGB array
181
+ when Symbol
182
+ if COLORS[color]
183
+ rgb(*COLORS[color])
184
+ else
185
+ raise("Unrecognised color name: #{color}")
186
+ end
187
+ when String
188
+ if color[0] == "#"
189
+ if color.length == 4
190
+ r = color[1].to_i(16)
191
+ g = color[2].to_i(16)
192
+ b = color[3].to_i(16)
193
+ rgb(16 * r, 16 * g, 16 * b)
194
+ elsif color.length == 7
195
+ r = color[1..2].to_i(16)
196
+ g = color[3..4].to_i(16)
197
+ b = color[5..6].to_i(16)
198
+ rgb(r, g, b)
199
+ else
200
+ raise("Don't know how to convert #{color.inspect} to RGB! (wrong number of digits)")
201
+ end
202
+ else
203
+ rgb_value = COLORS[color.to_sym]
204
+ if rgb_value
205
+ rgb(*rgb_value)
206
+ else
207
+ raise("Unrecognised color name: #{color}")
208
+ end
209
+ end
210
+ else
211
+ raise("Don't know how to convert #{color.inspect} to RGB!")
212
+ end
213
+ end
214
+ end
215
+ end
@@ -0,0 +1,185 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Scarpe Shoes apps operate in multiple layers. A Shoes widget tree exists as fairly
4
+ # plain, simple Ruby objects. And then a display-service widget tree integrates with
5
+ # the display technology, initially Webview. This lets us use Ruby as our API while
6
+ # not tying it too closely to the limitations of Webview.
7
+ #
8
+ # ## Choosing Display Services
9
+ #
10
+ # Before running a Scarpe app, you can set SCARPE_DISPLAY_SERVICE. If you
11
+ # set it to "whatever_service", Scarpe will require "scarpe/whatever_service",
12
+ # which can be supplied by the Scarpe gem or another Scarpe-based gem.
13
+ # Currently leaving the environment variable empty is equivalent to requesting
14
+ # local Webview.
15
+ #
16
+ # ## Events
17
+ #
18
+ # Events are a lot of what tie the Shoes widgets and the display service together.
19
+ #
20
+ # Scarpe widgets *expect* to operate in a fairly "hands off" mode where they record
21
+ # to an event queue to send to the display service, and the display service records
22
+ # events to send back.
23
+ #
24
+ # When a Shoes handler takes an action (e.g. some_para.replace(),) the relevant
25
+ # call will be dispatched as a :display event, to be sent to the display service.
26
+ # And when a display-side event occurs (e.g. user pushes a button,) it will be
27
+ # dispatched as a :shoes event, to be sent to the Shoes tree of widgets.
28
+ #
29
+ module Shoes
30
+ class DisplayService
31
+ class << self
32
+ # This is in the eigenclass/metaclass, *not* instances of DisplayService
33
+ include Scarpe::Log
34
+
35
+ attr_accessor :json_debug_serialize
36
+
37
+ # An event_target may be nil, to indicate there is no target.
38
+ def dispatch_event(event_name, event_target, *args, **kwargs)
39
+ @@display_event_handlers ||= {}
40
+
41
+ unless @log
42
+ log_init("DisplayService")
43
+ end
44
+
45
+ raise "Cannot dispatch on event_name :any!" if event_name == :any
46
+
47
+ @log.debug("Dispatch event: #{event_name.inspect} T: #{event_target.inspect} A: #{args.inspect} KW: #{kwargs.inspect}")
48
+
49
+ if DisplayService.json_debug_serialize
50
+ args = JSON.parse JSON.dump(args)
51
+ new_kw = {}
52
+ kwargs.each do |k, v|
53
+ new_kw[k] = JSON.parse JSON.dump(v)
54
+ end
55
+ kwargs = new_kw
56
+ end
57
+
58
+ same_name_handlers = @@display_event_handlers[event_name] || {}
59
+ any_name_handlers = @@display_event_handlers[:any] || {}
60
+
61
+ # Do we have any keys, in same_name_handlers or any_name_handlers, matching the target or :any?
62
+ # Note that "nil" is a target like any other for these purposes -- subscribing to a nil target
63
+ # won't get you non-nil-target events and vice-versa.
64
+ handlers = [
65
+ same_name_handlers[:any], # Same name, any target
66
+ same_name_handlers[event_target], # Same name, same target
67
+ any_name_handlers[:any], # Any name, any target
68
+ any_name_handlers[event_target], # Any name, same target
69
+ ].compact.inject([], &:+)
70
+ kwargs[:event_name] = event_name
71
+ kwargs[:event_target] = event_target if event_target
72
+ handlers.each { |h| h[:handler].call(*args, **kwargs) }
73
+ end
74
+
75
+ # It's permitted to subscribe to event_name :any for all event names, and event_target :any for all targets.
76
+ # An event_target of nil means "no target", and only matches events dispatched with a nil target.
77
+ def subscribe_to_event(event_name, event_target, &handler)
78
+ @@display_event_handlers ||= {}
79
+ @@display_event_unsub_id ||= 0
80
+ unless handler
81
+ raise "Must pass a block as a handler to DisplayService.subscribe_to_event!"
82
+ end
83
+
84
+ unless @log
85
+ log_init("DisplayService")
86
+ end
87
+
88
+ @log.debug("Subscribe to event: #{event_name.inspect} T: #{event_target.inspect}")
89
+
90
+ id = @@display_event_unsub_id
91
+ @@display_event_unsub_id += 1
92
+
93
+ @@display_event_handlers[event_name] ||= {}
94
+ @@display_event_handlers[event_name][event_target] ||= []
95
+ @@display_event_handlers[event_name][event_target] << { handler:, unsub_id: id }
96
+
97
+ id
98
+ end
99
+
100
+ def unsub_from_events(unsub_id)
101
+ raise "Must provide an unsubscribe ID!" if unsub_id.nil?
102
+
103
+ @@display_event_handlers.each do |_e_name, target_hash|
104
+ target_hash.each do |_target, h_list|
105
+ h_list.delete_if { |item| item[:unsub_id] == unsub_id }
106
+ end
107
+ end
108
+ end
109
+
110
+ def full_reset!
111
+ @@display_event_handlers = {}
112
+ @json_debug_serialize = nil
113
+ end
114
+
115
+ def set_display_service_class(klass)
116
+ raise "Can only set a single display service class!" if @display_service_klass
117
+
118
+ @display_service_klass = klass
119
+ end
120
+
121
+ def display_service
122
+ return @service if @service
123
+
124
+ raise "No display service was set!" unless @display_service_klass
125
+
126
+ @service = @display_service_klass.new
127
+ end
128
+ end
129
+
130
+ # These methods are an interface to DisplayService objects.
131
+
132
+ def create_display_widget_for(widget_class_name, widget_id, properties)
133
+ raise "Override in DisplayService implementation!"
134
+ end
135
+
136
+ def set_widget_pairing(id, display_widget)
137
+ @display_widget_for ||= {}
138
+ @display_widget_for[id] = display_widget
139
+ end
140
+
141
+ def query_display_widget_for(id, nil_ok: false)
142
+ display_widget = @display_widget_for[id]
143
+ unless display_widget || nil_ok
144
+ raise "Could not find display widget for linkable ID #{id.inspect}!"
145
+ end
146
+
147
+ display_widget
148
+ end
149
+
150
+ def destroy
151
+ raise "Override in DisplayService implementation!"
152
+ end
153
+ end
154
+
155
+ # This is for objects that can be referred to via events, using their
156
+ # IDs. There are also convenience functions for binding and sending
157
+ # events.
158
+ #
159
+ # Linkable objects may be event targets. Technically anything, linkable
160
+ # or not, can be an event subscriber, but linkables get easy convenience
161
+ # functions for subscription.
162
+ class Linkable
163
+ attr_reader :linkable_id
164
+
165
+ def initialize(linkable_id: object_id)
166
+ @linkable_id = linkable_id
167
+ end
168
+
169
+ def send_self_event(*args, event_name:, **kwargs)
170
+ DisplayService.dispatch_event(event_name, self.linkable_id, *args, **kwargs)
171
+ end
172
+
173
+ def send_shoes_event(*args, event_name:, target: nil, **kwargs)
174
+ DisplayService.dispatch_event(event_name, target, *args, **kwargs)
175
+ end
176
+
177
+ def bind_shoes_event(event_name:, target: nil, &handler)
178
+ DisplayService.subscribe_to_event(event_name, target, &handler)
179
+ end
180
+
181
+ def unsub_shoes_event(unsub_id)
182
+ DisplayService.unsub_from_events(unsub_id)
183
+ end
184
+ end
185
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Scarpe
4
+ class DocumentRoot < Scarpe::Flow
5
+ def initialize
6
+ @height = "100%"
7
+ @width = @margin = @padding = nil
8
+ @options = {}
9
+
10
+ super
11
+
12
+ create_display_widget
13
+ end
14
+
15
+ # The default inspect string can be absolutely huge in console output, and it's frequently printed.
16
+ def inspect
17
+ "<Scarpe::DocumentRoot>"
18
+ end
19
+ end
20
+ end