scarpe 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (530) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +80 -9
  3. data/.ruby-version +1 -0
  4. data/.vscode/extensions.json +5 -0
  5. data/.yardopts +3 -0
  6. data/CHANGELOG.md +14 -0
  7. data/CONTRIBUTING.md +20 -0
  8. data/Gemfile +14 -2
  9. data/README.md +138 -18
  10. data/Rakefile +2 -3
  11. data/dev.yml +7 -0
  12. data/docs/static/PKGBUILD +47 -0
  13. data/docs/static/Shoes.icns +0 -0
  14. data/docs/static/avatar.png +0 -0
  15. data/docs/static/code_highlighter.js +188 -0
  16. data/docs/static/code_highlighter_ruby.js +26 -0
  17. data/docs/static/icon-debug.png +0 -0
  18. data/docs/static/icon-error.png +0 -0
  19. data/docs/static/icon-info.png +0 -0
  20. data/docs/static/icon-warn.png +0 -0
  21. data/docs/static/listbox_button1.png +0 -0
  22. data/docs/static/listbox_button2.png +0 -0
  23. data/docs/static/man-app.png +0 -0
  24. data/docs/static/man-builds.png +0 -0
  25. data/docs/static/man-builds1.png +0 -0
  26. data/docs/static/man-editor-notepad.png +0 -0
  27. data/docs/static/man-editor-osx.png +0 -0
  28. data/docs/static/man-ele-background.png +0 -0
  29. data/docs/static/man-ele-border.png +0 -0
  30. data/docs/static/man-ele-button.png +0 -0
  31. data/docs/static/man-ele-check.png +0 -0
  32. data/docs/static/man-ele-editbox.png +0 -0
  33. data/docs/static/man-ele-editline.png +0 -0
  34. data/docs/static/man-ele-image.png +0 -0
  35. data/docs/static/man-ele-listbox.png +0 -0
  36. data/docs/static/man-ele-progress.png +0 -0
  37. data/docs/static/man-ele-radio.png +0 -0
  38. data/docs/static/man-ele-shape.png +0 -0
  39. data/docs/static/man-ele-textblock.png +0 -0
  40. data/docs/static/man-ele-video.png +0 -0
  41. data/docs/static/man-intro-dmg.png +0 -0
  42. data/docs/static/man-intro-exe.png +0 -0
  43. data/docs/static/man-look-tiger.png +0 -0
  44. data/docs/static/man-look-ubuntu.png +0 -0
  45. data/docs/static/man-look-vista.png +0 -0
  46. data/docs/static/man-run-osx.png +0 -0
  47. data/docs/static/man-run-vista.png +0 -0
  48. data/docs/static/man-run-xp.png +0 -0
  49. data/docs/static/man-shot1.png +0 -0
  50. data/docs/static/manual-en.txt +3529 -0
  51. data/docs/static/manual-ja.txt +2829 -0
  52. data/docs/static/manual.css +171 -0
  53. data/docs/static/manual.md +3528 -0
  54. data/docs/static/menu-corner1.png +0 -0
  55. data/docs/static/menu-corner2.png +0 -0
  56. data/docs/static/menu-gray.png +0 -0
  57. data/docs/static/menu-left.png +0 -0
  58. data/docs/static/menu-right.png +0 -0
  59. data/docs/static/menu-top.png +0 -0
  60. data/docs/static/shoes-dmg.jpg +0 -0
  61. data/docs/static/shoes-icon-blue.png +0 -0
  62. data/docs/static/shoes-icon.png +0 -0
  63. data/docs/static/shoes-manual-apps.gif +0 -0
  64. data/docs/static/shoes_main_window.png +0 -0
  65. data/docs/static/stripe.png +0 -0
  66. data/docs/static/stubs/blank.exe +0 -0
  67. data/docs/static/stubs/blank.hfz +0 -0
  68. data/docs/static/stubs/blank.run +375 -0
  69. data/docs/static/stubs/cocoa-install +0 -0
  70. data/docs/static/stubs/sh-install +49 -0
  71. data/docs/static/stubs/shoes-stub-inject.exe +0 -0
  72. data/docs/static/stubs/shoes-stub.exe +0 -0
  73. data/docs/static/tutor-back.png +0 -0
  74. data/examples/bloopsaphone/working/1901_by_Aanand_Prasad.rb +478 -0
  75. data/examples/bloopsaphone/working/b1.rb +64 -0
  76. data/examples/bloopsaphone/working/b2.rb +36 -0
  77. data/examples/bloopsaphone/working/bloops_test.rb +41 -0
  78. data/examples/bloopsaphone/working/bloopsaphone_theme_song_by_why.rb +31 -0
  79. data/examples/bloopsaphone/working/feepogram.rb +67 -0
  80. data/examples/bloopsaphone/working/simpsons_theme_song_by_why.rb +14 -0
  81. data/examples/bloopsaphone/working/tune_cheeky_drat.rb +210 -0
  82. data/examples/button.rb +6 -5
  83. data/examples/button_alert.rb +6 -0
  84. data/examples/button_go_away.rb +6 -0
  85. data/examples/button_with_position_and_size.rb +7 -0
  86. data/examples/coffee.rb +14 -0
  87. data/examples/download.rb +5 -0
  88. data/examples/edit_box.rb +10 -0
  89. data/examples/edit_line.rb +8 -0
  90. data/examples/fill.rb +25 -0
  91. data/examples/flow.rb +11 -0
  92. data/examples/fonts.rb +6 -0
  93. data/examples/gen.rb +140 -0
  94. data/examples/hello_world.rb +2 -4
  95. data/examples/highlander.rb +87 -0
  96. data/examples/image/clickable_image.rb +5 -0
  97. data/examples/{image.rb → image/image.rb} +2 -4
  98. data/examples/image/image_size.rb +7 -0
  99. data/examples/image/image_with_position_and_size.rb +3 -0
  100. data/examples/info.rb +9 -0
  101. data/examples/legacy/not_checked/expert/colours.rb +105 -0
  102. data/examples/legacy/not_checked/expert/curve-animation.rb +31 -0
  103. data/examples/legacy/not_checked/expert/curve-control-point.rb +51 -0
  104. data/examples/legacy/not_checked/expert/custom-list-box.rb +53 -0
  105. data/examples/legacy/not_checked/expert/definr.rb +23 -0
  106. data/examples/legacy/not_checked/expert/funnies.rb +56 -0
  107. data/examples/legacy/not_checked/expert/minesweeper.rb +267 -0
  108. data/examples/legacy/not_checked/expert/othello.rb +318 -0
  109. data/examples/legacy/not_checked/expert/pong.rb +62 -0
  110. data/examples/legacy/not_checked/expert/tankspank.rb +385 -0
  111. data/examples/legacy/not_checked/expert/tooltips.rb +45 -0
  112. data/examples/legacy/not_checked/expert/url.rb +37 -0
  113. data/examples/legacy/not_checked/expert/video-player.rb +256 -0
  114. data/examples/legacy/not_checked/good/_why-stories.rb +44 -0
  115. data/examples/legacy/not_checked/good/_why-stories.yaml +387 -0
  116. data/examples/legacy/not_checked/good/arc.rb +37 -0
  117. data/examples/legacy/not_checked/good/cardflip.rb +141 -0
  118. data/examples/legacy/not_checked/good/clock.rb +51 -0
  119. data/examples/legacy/not_checked/good/console.rb +21 -0
  120. data/examples/legacy/not_checked/good/follow.rb +26 -0
  121. data/examples/legacy/not_checked/good/image-rotate.rb +14 -0
  122. data/examples/legacy/not_checked/good/paris.svg +7236 -0
  123. data/examples/legacy/not_checked/good/path-animation.rb +46 -0
  124. data/examples/legacy/not_checked/good/plots.rb +100 -0
  125. data/examples/legacy/not_checked/good/reminder.rb +174 -0
  126. data/examples/legacy/not_checked/good/svgview.rb +113 -0
  127. data/examples/legacy/not_checked/good/vjot.rb +56 -0
  128. data/examples/legacy/not_checked/shoes-contrib/.gitignore +2 -0
  129. data/examples/legacy/not_checked/shoes-contrib/README.md +34 -0
  130. data/examples/legacy/not_checked/shoes-contrib/animation/animate-ovals.rb +21 -0
  131. data/examples/legacy/not_checked/shoes-contrib/animation/flowers.rb +59 -0
  132. data/examples/legacy/not_checked/shoes-contrib/animation/happy-trails.rb +31 -0
  133. data/examples/legacy/not_checked/shoes-contrib/animation/mice-satellites.rb +27 -0
  134. data/examples/legacy/not_checked/shoes-contrib/animation/oval-motion.rb +12 -0
  135. data/examples/legacy/not_checked/shoes-contrib/animation/pink-bubbles.rb +34 -0
  136. data/examples/legacy/not_checked/shoes-contrib/animation/pulsate.rb +18 -0
  137. data/examples/legacy/not_checked/shoes-contrib/animation/rotating-star.rb +18 -0
  138. data/examples/legacy/not_checked/shoes-contrib/app/download-and-save.rb +11 -0
  139. data/examples/legacy/not_checked/shoes-contrib/app/download.rb +10 -0
  140. data/examples/legacy/not_checked/shoes-contrib/app/get-google.rb +11 -0
  141. data/examples/legacy/not_checked/shoes-contrib/app/mouse-detection.rb +7 -0
  142. data/examples/legacy/not_checked/shoes-contrib/app/resizeable-false.rb +6 -0
  143. data/examples/legacy/not_checked/shoes-contrib/art/bubble-bullseye.rb +23 -0
  144. data/examples/legacy/not_checked/shoes-contrib/art/faded.rb +17 -0
  145. data/examples/legacy/not_checked/shoes-contrib/art/fill-oval.rb +5 -0
  146. data/examples/legacy/not_checked/shoes-contrib/art/mask.rb +15 -0
  147. data/examples/legacy/not_checked/shoes-contrib/art/oval-gradient.rb +6 -0
  148. data/examples/legacy/not_checked/shoes-contrib/art/star-gradient.rb +4 -0
  149. data/examples/legacy/not_checked/shoes-contrib/basic/basic-edit-box.rb +8 -0
  150. data/examples/legacy/not_checked/shoes-contrib/basic/basic-new-window.rb +8 -0
  151. data/examples/legacy/not_checked/shoes-contrib/basic/basic-oval-image.rb +8 -0
  152. data/examples/legacy/not_checked/shoes-contrib/basic/basic-oval-shape.rb +8 -0
  153. data/examples/legacy/not_checked/shoes-contrib/basic/basic-oval.rb +6 -0
  154. data/examples/legacy/not_checked/shoes-contrib/basic/class-book.rb +43 -0
  155. data/examples/legacy/not_checked/shoes-contrib/basic/class-book.yaml +387 -0
  156. data/examples/legacy/not_checked/shoes-contrib/basic/clock.rb +6 -0
  157. data/examples/legacy/not_checked/shoes-contrib/basic/edit-stack +14 -0
  158. data/examples/legacy/not_checked/shoes-contrib/basic/gradient-shoes.rb +7 -0
  159. data/examples/legacy/not_checked/shoes-contrib/basic/list_box-shape-report.rb +19 -0
  160. data/examples/legacy/not_checked/shoes-contrib/basic/rect-arrow.rb +7 -0
  161. data/examples/legacy/not_checked/shoes-contrib/basic/scribble.rb +8 -0
  162. data/examples/legacy/not_checked/shoes-contrib/basic/search.rb +32 -0
  163. data/examples/legacy/not_checked/shoes-contrib/basic/shoes-notes.rb +16 -0
  164. data/examples/legacy/not_checked/shoes-contrib/basic/url-shoes-subclassing.rb +24 -0
  165. data/examples/legacy/not_checked/shoes-contrib/browser.rb +21 -0
  166. data/examples/legacy/not_checked/shoes-contrib/elements/background-column.rb +3 -0
  167. data/examples/legacy/not_checked/shoes-contrib/elements/background.rb +4 -0
  168. data/examples/legacy/not_checked/shoes-contrib/elements/basic-fps.rb +6 -0
  169. data/examples/legacy/not_checked/shoes-contrib/elements/border-cat.rb +6 -0
  170. data/examples/legacy/not_checked/shoes-contrib/elements/button-block.rb +8 -0
  171. data/examples/legacy/not_checked/shoes-contrib/elements/check-mate.rb +15 -0
  172. data/examples/legacy/not_checked/shoes-contrib/elements/common-styles.rb +13 -0
  173. data/examples/legacy/not_checked/shoes-contrib/elements/displace-animation.rb +13 -0
  174. data/examples/legacy/not_checked/shoes-contrib/elements/edit_box-character-count.rb +7 -0
  175. data/examples/legacy/not_checked/shoes-contrib/elements/edit_line-character-count.rb +7 -0
  176. data/examples/legacy/not_checked/shoes-contrib/elements/image-icon.rb +3 -0
  177. data/examples/legacy/not_checked/shoes-contrib/elements/list_box-select-class.rb +13 -0
  178. data/examples/legacy/not_checked/shoes-contrib/elements/list_box.rb +6 -0
  179. data/examples/legacy/not_checked/shoes-contrib/elements/move-flow-animate.rb +13 -0
  180. data/examples/legacy/not_checked/shoes-contrib/elements/phat-button.rb +7 -0
  181. data/examples/legacy/not_checked/shoes-contrib/elements/popup.rb +7 -0
  182. data/examples/legacy/not_checked/shoes-contrib/elements/progress-bar.rb +10 -0
  183. data/examples/legacy/not_checked/shoes-contrib/elements/radio-dreamcast-favs.rb +17 -0
  184. data/examples/legacy/not_checked/shoes-contrib/elements/timer.rb +6 -0
  185. data/examples/legacy/not_checked/shoes-contrib/elements/width-introspec.rb +8 -0
  186. data/examples/legacy/not_checked/shoes-contrib/events/background-hover.rb +11 -0
  187. data/examples/legacy/not_checked/shoes-contrib/events/motion-detect.rb +9 -0
  188. data/examples/legacy/not_checked/shoes-contrib/events/pressed-key.rb +6 -0
  189. data/examples/legacy/not_checked/shoes-contrib/expert/expert-funnies.rb +51 -0
  190. data/examples/legacy/not_checked/shoes-contrib/expert/expert-irb.rb +112 -0
  191. data/examples/legacy/not_checked/shoes-contrib/expert/expert-othello.rb +319 -0
  192. data/examples/legacy/not_checked/shoes-contrib/good/good-arc.rb +37 -0
  193. data/examples/legacy/not_checked/shoes-contrib/good/good-clock.rb +51 -0
  194. data/examples/legacy/not_checked/shoes-contrib/good/good-follow.rb +26 -0
  195. data/examples/legacy/not_checked/shoes-contrib/good/good-reminder.rb +174 -0
  196. data/examples/legacy/not_checked/shoes-contrib/good/good-vjot.rb +56 -0
  197. data/examples/legacy/not_checked/shoes-contrib/kernel/ask.rb +4 -0
  198. data/examples/legacy/not_checked/shoes-contrib/kernel/ask_color.rb +4 -0
  199. data/examples/legacy/not_checked/shoes-contrib/kernel/ask_open_file.rb +4 -0
  200. data/examples/legacy/not_checked/shoes-contrib/kernel/ask_save_file.rb +7 -0
  201. data/examples/legacy/not_checked/shoes-contrib/kernel/confirm.rb +3 -0
  202. data/examples/legacy/not_checked/shoes-contrib/kernel/debug.rb +4 -0
  203. data/examples/legacy/not_checked/shoes-contrib/kernel/exit.rb +5 -0
  204. data/examples/legacy/not_checked/shoes-contrib/kernel/font.rb +5 -0
  205. data/examples/legacy/not_checked/shoes-contrib/kernel/fonts.rb +3 -0
  206. data/examples/legacy/not_checked/shoes-contrib/manipulation/append-slot.rb +9 -0
  207. data/examples/legacy/not_checked/shoes-contrib/manipulation/clear-slot.rb +6 -0
  208. data/examples/legacy/not_checked/shoes-contrib/manipulation/prepend-slot.rb +6 -0
  209. data/examples/legacy/not_checked/shoes-contrib/manipulation/roll.rb +17 -0
  210. data/examples/legacy/not_checked/shoes-contrib/position/gutter-margin.rb +5 -0
  211. data/examples/legacy/not_checked/shoes-contrib/position/stack-width.rb +3 -0
  212. data/examples/legacy/not_checked/shoes-contrib/simple/simple-accordion.rb +75 -0
  213. data/examples/legacy/not_checked/shoes-contrib/simple/simple-anim-shapes.rb +17 -0
  214. data/examples/legacy/not_checked/shoes-contrib/simple/simple-anim-text.rb +13 -0
  215. data/examples/legacy/not_checked/shoes-contrib/simple/simple-arc.rb +23 -0
  216. data/examples/legacy/not_checked/shoes-contrib/simple/simple-bounce.rb +24 -0
  217. data/examples/legacy/not_checked/shoes-contrib/simple/simple-calc.rb +70 -0
  218. data/examples/legacy/not_checked/shoes-contrib/simple/simple-chipmunk.rb +26 -0
  219. data/examples/legacy/not_checked/shoes-contrib/simple/simple-control-sizes.rb +24 -0
  220. data/examples/legacy/not_checked/shoes-contrib/simple/simple-curve.rb +26 -0
  221. data/examples/legacy/not_checked/shoes-contrib/simple/simple-dialogs.rb +29 -0
  222. data/examples/legacy/not_checked/shoes-contrib/simple/simple-downloader.rb +27 -0
  223. data/examples/legacy/not_checked/shoes-contrib/simple/simple-draw.rb +13 -0
  224. data/examples/legacy/not_checked/shoes-contrib/simple/simple-editor.rb +28 -0
  225. data/examples/legacy/not_checked/shoes-contrib/simple/simple-form.rb +28 -0
  226. data/examples/legacy/not_checked/shoes-contrib/simple/simple-form.shy +0 -0
  227. data/examples/legacy/not_checked/shoes-contrib/simple/simple-mask.rb +21 -0
  228. data/examples/legacy/not_checked/shoes-contrib/simple/simple-menu.rb +31 -0
  229. data/examples/legacy/not_checked/shoes-contrib/simple/simple-menu1.rb +35 -0
  230. data/examples/legacy/not_checked/shoes-contrib/simple/simple-rubygems.rb +29 -0
  231. data/examples/legacy/not_checked/shoes-contrib/simple/simple-slide.rb +45 -0
  232. data/examples/legacy/not_checked/shoes-contrib/simple/simple-sphere.rb +28 -0
  233. data/examples/legacy/not_checked/shoes-contrib/simple/simple-sqlite3.rb +13 -0
  234. data/examples/legacy/not_checked/shoes-contrib/simple/simple-timer.rb +13 -0
  235. data/examples/legacy/not_checked/shoes-contrib/simple/simple-video.rb +13 -0
  236. data/examples/legacy/not_checked/shoes-contrib/styles/alignment.rb +4 -0
  237. data/examples/legacy/not_checked/shoes-contrib/styles/attachment.rb +5 -0
  238. data/examples/legacy/not_checked/shoes-contrib/styles/emphasis.rb +3 -0
  239. data/examples/legacy/not_checked/shoes-contrib/styles/gradient-angle.rb +3 -0
  240. data/examples/legacy/not_checked/shoes-contrib/styles/para-methods.rb +5 -0
  241. data/examples/legacy/not_checked/shoes-contrib/styles/para-red-underlined.rb +3 -0
  242. data/examples/legacy/not_checked/shoes-contrib/styles/para-style-method.rb +4 -0
  243. data/examples/legacy/not_checked/shoes-dep-samples/expert-game-of-life.rb +243 -0
  244. data/examples/legacy/not_checked/shoes-dep-samples/expert-othello.rb +319 -0
  245. data/examples/legacy/not_checked/shoes-dep-samples/good-clock.rb +51 -0
  246. data/examples/legacy/not_checked/shoes-dep-samples/good-follow.rb +26 -0
  247. data/examples/legacy/not_checked/shoes-dep-samples/good-reminder.rb +174 -0
  248. data/examples/legacy/not_checked/shoes-dep-samples/good-vjot.rb +56 -0
  249. data/examples/legacy/not_checked/shoes-dep-samples/simple-accordion.rb +75 -0
  250. data/examples/legacy/not_checked/shoes-dep-samples/simple-anim-shapes.rb +17 -0
  251. data/examples/legacy/not_checked/shoes-dep-samples/simple-anim-text.rb +13 -0
  252. data/examples/legacy/not_checked/shoes-dep-samples/simple-arc.rb +23 -0
  253. data/examples/legacy/not_checked/shoes-dep-samples/simple-bounce.rb +24 -0
  254. data/examples/legacy/not_checked/shoes-dep-samples/simple-calc.rb +70 -0
  255. data/examples/legacy/not_checked/shoes-dep-samples/simple-chipmunk.rb +26 -0
  256. data/examples/legacy/not_checked/shoes-dep-samples/simple-control-sizes.rb +24 -0
  257. data/examples/legacy/not_checked/shoes-dep-samples/simple-curve.rb +26 -0
  258. data/examples/legacy/not_checked/shoes-dep-samples/simple-dialogs.rb +29 -0
  259. data/examples/legacy/not_checked/shoes-dep-samples/simple-draw.rb +13 -0
  260. data/examples/legacy/not_checked/shoes-dep-samples/simple-editor.rb +28 -0
  261. data/examples/legacy/not_checked/shoes-dep-samples/simple-form.rb +28 -0
  262. data/examples/legacy/not_checked/shoes-dep-samples/simple-form.shy +0 -0
  263. data/examples/legacy/not_checked/shoes-dep-samples/simple-mask.rb +21 -0
  264. data/examples/legacy/not_checked/shoes-dep-samples/simple-menu.rb +31 -0
  265. data/examples/legacy/not_checked/shoes-dep-samples/simple-menu1.rb +35 -0
  266. data/examples/legacy/not_checked/shoes-dep-samples/simple-rubygems.rb +29 -0
  267. data/examples/legacy/not_checked/shoes-dep-samples/simple-slide.rb +45 -0
  268. data/examples/legacy/not_checked/shoes-dep-samples/simple-sphere.rb +28 -0
  269. data/examples/legacy/not_checked/shoes-dep-samples/simple-sqlite3.rb +13 -0
  270. data/examples/legacy/not_checked/shoes-dep-samples/simple-timer.rb +13 -0
  271. data/examples/legacy/not_checked/shoes-dep-samples/simple-video.rb +13 -0
  272. data/examples/legacy/not_checked/shoes3-tests/AnemicCinema1926marcelDuchampCut.mp4 +0 -0
  273. data/examples/legacy/not_checked/shoes3-tests/button/button.rb +53 -0
  274. data/examples/legacy/not_checked/shoes3-tests/cache/cache.rb +41 -0
  275. data/examples/legacy/not_checked/shoes3-tests/combo/combo.rb +24 -0
  276. data/examples/legacy/not_checked/shoes3-tests/curl/bare.rb +34 -0
  277. data/examples/legacy/not_checked/shoes3-tests/curl/downloader.rb +40 -0
  278. data/examples/legacy/not_checked/shoes3-tests/curl/m1.rb +11 -0
  279. data/examples/legacy/not_checked/shoes3-tests/curl/m2.rb +12 -0
  280. data/examples/legacy/not_checked/shoes3-tests/curl/m3.rb +11 -0
  281. data/examples/legacy/not_checked/shoes3-tests/curl/m4.rb +5 -0
  282. data/examples/legacy/not_checked/shoes3-tests/curl/typ.rb +30 -0
  283. data/examples/legacy/not_checked/shoes3-tests/cursor/c1.rb +21 -0
  284. data/examples/legacy/not_checked/shoes3-tests/decoration.rb +14 -0
  285. data/examples/legacy/not_checked/shoes3-tests/dialogs/ask.rb +6 -0
  286. data/examples/legacy/not_checked/shoes3-tests/dialogs/confirm.rb +6 -0
  287. data/examples/legacy/not_checked/shoes3-tests/editbox/editbox.rb +36 -0
  288. data/examples/legacy/not_checked/shoes3-tests/editline/editline.rb +27 -0
  289. data/examples/legacy/not_checked/shoes3-tests/events/button.rb +32 -0
  290. data/examples/legacy/not_checked/shoes3-tests/events/button.yaml +40 -0
  291. data/examples/legacy/not_checked/shoes3-tests/events/capture.rb +57 -0
  292. data/examples/legacy/not_checked/shoes3-tests/events/chipmunk.yaml +47 -0
  293. data/examples/legacy/not_checked/shoes3-tests/events/event0.rb +8 -0
  294. data/examples/legacy/not_checked/shoes3-tests/events/event1.rb +51 -0
  295. data/examples/legacy/not_checked/shoes3-tests/events/event1.yaml +26 -0
  296. data/examples/legacy/not_checked/shoes3-tests/events/event2.rb +46 -0
  297. data/examples/legacy/not_checked/shoes3-tests/events/event3.rb +44 -0
  298. data/examples/legacy/not_checked/shoes3-tests/events/event4.rb +65 -0
  299. data/examples/legacy/not_checked/shoes3-tests/events/event5.rb +17 -0
  300. data/examples/legacy/not_checked/shoes3-tests/events/event6.rb +51 -0
  301. data/examples/legacy/not_checked/shoes3-tests/events/replay.rb +60 -0
  302. data/examples/legacy/not_checked/shoes3-tests/gapp/fullscreen.rb +38 -0
  303. data/examples/legacy/not_checked/shoes3-tests/gapp/icon.rb +56 -0
  304. data/examples/legacy/not_checked/shoes3-tests/gapp/mon1.rb +46 -0
  305. data/examples/legacy/not_checked/shoes3-tests/gapp/settings1.rb +22 -0
  306. data/examples/legacy/not_checked/shoes3-tests/gapp/title1.rb +34 -0
  307. data/examples/legacy/not_checked/shoes3-tests/indian.m4a +0 -0
  308. data/examples/legacy/not_checked/shoes3-tests/menus/event.rb +33 -0
  309. data/examples/legacy/not_checked/shoes3-tests/menus/menu1.rb +8 -0
  310. data/examples/legacy/not_checked/shoes3-tests/menus/menu2.rb +25 -0
  311. data/examples/legacy/not_checked/shoes3-tests/menus/menu3.rb +103 -0
  312. data/examples/legacy/not_checked/shoes3-tests/menus/menu4.rb +41 -0
  313. data/examples/legacy/not_checked/shoes3-tests/menus/tests.txt +42 -0
  314. data/examples/legacy/not_checked/shoes3-tests/opacity.rb +13 -0
  315. data/examples/legacy/not_checked/shoes3-tests/plot/^IRX.R +5219 -0
  316. data/examples/legacy/not_checked/shoes3-tests/plot/^SPX +5219 -0
  317. data/examples/legacy/not_checked/shoes3-tests/plot/cstest.rb +51 -0
  318. data/examples/legacy/not_checked/shoes3-tests/plot/gr1.rb +73 -0
  319. data/examples/legacy/not_checked/shoes3-tests/plot/gr2.rb +40 -0
  320. data/examples/legacy/not_checked/shoes3-tests/plot/gr3.rb +47 -0
  321. data/examples/legacy/not_checked/shoes3-tests/plot/gr4.rb +35 -0
  322. data/examples/legacy/not_checked/shoes3-tests/plot/gr5.rb +31 -0
  323. data/examples/legacy/not_checked/shoes3-tests/plot/gr6.rb +35 -0
  324. data/examples/legacy/not_checked/shoes3-tests/plot/gr7.rb +37 -0
  325. data/examples/legacy/not_checked/shoes3-tests/plot/grcsv.rb +219 -0
  326. data/examples/legacy/not_checked/shoes3-tests/plot/manual.rb +40 -0
  327. data/examples/legacy/not_checked/shoes3-tests/progress/progress.rb +29 -0
  328. data/examples/legacy/not_checked/shoes3-tests/radio/clear.rb +20 -0
  329. data/examples/legacy/not_checked/shoes3-tests/radio/group.rb +18 -0
  330. data/examples/legacy/not_checked/shoes3-tests/radio/multiple.rb +32 -0
  331. data/examples/legacy/not_checked/shoes3-tests/radio/nogroup.rb +9 -0
  332. data/examples/legacy/not_checked/shoes3-tests/simpletest.svg +14 -0
  333. data/examples/legacy/not_checked/shoes3-tests/spinner.rb +15 -0
  334. data/examples/legacy/not_checked/shoes3-tests/svg.rb +208 -0
  335. data/examples/legacy/not_checked/shoes3-tests/switch/switch.rb +28 -0
  336. data/examples/legacy/not_checked/shoes3-tests/systray/back.rb +20 -0
  337. data/examples/legacy/not_checked/shoes3-tests/systray/note.rb +17 -0
  338. data/examples/legacy/not_checked/shoes3-tests/terminal/cursor.rb +27 -0
  339. data/examples/legacy/not_checked/shoes3-tests/terminal/ed.rb +65 -0
  340. data/examples/legacy/not_checked/shoes3-tests/terminal/el.rb +50 -0
  341. data/examples/legacy/not_checked/shoes3-tests/terminal/logattr.rb +31 -0
  342. data/examples/legacy/not_checked/shoes3-tests/tests_color.rb +138 -0
  343. data/examples/legacy/not_checked/shoes3-tests/tests_svg.rb +228 -0
  344. data/examples/legacy/not_checked/shoes3-tests/tests_video_vlc.rb +186 -0
  345. data/examples/legacy/not_checked/shoes3-tests/tooltips.rb +20 -0
  346. data/examples/legacy/not_checked/shoes3-tests/video_vlc.rb +242 -0
  347. data/examples/legacy/not_checked/shoes3-tests/wheel/wheel1.rb +21 -0
  348. data/examples/legacy/not_checked/simple/accordion.rb +81 -0
  349. data/examples/legacy/not_checked/simple/anim-shapes.rb +17 -0
  350. data/examples/legacy/not_checked/simple/anim-text.rb +13 -0
  351. data/examples/legacy/not_checked/simple/arc.rb +23 -0
  352. data/examples/legacy/not_checked/simple/bounce.rb +24 -0
  353. data/examples/legacy/not_checked/simple/chipmunk.rb +26 -0
  354. data/examples/legacy/not_checked/simple/control-sizes.rb +24 -0
  355. data/examples/legacy/not_checked/simple/curve-control-points.rb +24 -0
  356. data/examples/legacy/not_checked/simple/curve.rb +26 -0
  357. data/examples/legacy/not_checked/simple/dialogs.rb +29 -0
  358. data/examples/legacy/not_checked/simple/downloader.rb +40 -0
  359. data/examples/legacy/not_checked/simple/downloader1.rb +31 -0
  360. data/examples/legacy/not_checked/simple/draw.rb +13 -0
  361. data/examples/legacy/not_checked/simple/editor.rb +28 -0
  362. data/examples/legacy/not_checked/simple/form.rb +30 -0
  363. data/examples/legacy/not_checked/simple/image.rb +21 -0
  364. data/examples/legacy/not_checked/simple/info.rb +78 -0
  365. data/examples/legacy/not_checked/simple/mask.rb +21 -0
  366. data/examples/legacy/not_checked/simple/mask2.rb +27 -0
  367. data/examples/legacy/not_checked/simple/menu.rb +31 -0
  368. data/examples/legacy/not_checked/simple/menu1.rb +35 -0
  369. data/examples/legacy/not_checked/simple/slide.rb +45 -0
  370. data/examples/legacy/not_checked/simple/sphere.rb +28 -0
  371. data/examples/legacy/not_checked/superleg.rb +244 -0
  372. data/examples/legacy/working/shoes-contrib/basic/a-poem.rb +24 -0
  373. data/examples/legacy/working/shoes-contrib/basic/basic-blocks-instances.rb +7 -0
  374. data/examples/legacy/working/shoes-contrib/basic/basic-blocks.rb +7 -0
  375. data/examples/legacy/working/shoes-contrib/basic/basic-slot.rb +8 -0
  376. data/examples/legacy/working/shoes-contrib/basic/intro.rb +20 -0
  377. data/examples/legacy/working/shoes-contrib/basic/two-column.rb +12 -0
  378. data/examples/legacy/working/shoes-contrib/elements/edit_box.rb +6 -0
  379. data/examples/legacy/working/shoes-contrib/kernel/alert.rb +3 -0
  380. data/examples/legacy/working/simple/calc.rb +71 -0
  381. data/examples/legacy/working/simple/sqlite3.rb +27 -0
  382. data/examples/legacy/working/simple/timer.rb +13 -0
  383. data/examples/line.rb +5 -0
  384. data/examples/link.rb +20 -0
  385. data/examples/list_box.rb +8 -0
  386. data/examples/para/collection_of_arguments.rb +9 -0
  387. data/examples/para/hello_world.rb +5 -0
  388. data/examples/para/hide_and_show.rb +9 -0
  389. data/examples/para/rainbow.rb +11 -0
  390. data/examples/para/rainbow_2.rb +11 -0
  391. data/examples/para/sizes.rb +11 -0
  392. data/examples/para/sizes_2.rb +12 -0
  393. data/examples/para/strong.rb +3 -0
  394. data/examples/para_text_widgets.rb +4 -0
  395. data/examples/pirate.png +0 -0
  396. data/examples/raw_flow.rb +11 -0
  397. data/examples/ruby_racer.rb +52 -0
  398. data/examples/shapes/arc.rb +8 -0
  399. data/examples/shapes/shapes.rb +8 -0
  400. data/examples/shapes/shapes_fill.rb +10 -0
  401. data/examples/shapes/star.rb +5 -0
  402. data/examples/shoes_school.rb +68 -0
  403. data/examples/shoes_splorer.rb +150 -0
  404. data/examples/simple_slides.rb +73 -0
  405. data/examples/skip_ci/parrot.rb +22 -0
  406. data/examples/skip_ci/say.rb +20 -0
  407. data/examples/sleepless.rb +26 -0
  408. data/examples/slots.rb +2 -4
  409. data/examples/spacing.rb +18 -0
  410. data/examples/span.rb +6 -0
  411. data/examples/stack/background.rb +35 -0
  412. data/examples/stack/border.rb +11 -0
  413. data/examples/stack/gradients.rb +6 -0
  414. data/examples/stack/raw_stack.rb +8 -0
  415. data/examples/stack/stack.rb +27 -0
  416. data/examples/text_change.rb +4 -0
  417. data/examples/text_sizes.rb +10 -0
  418. data/examples/timmy.rb +109 -0
  419. data/examples/title_and_resize.rb +3 -0
  420. data/exe/scarpe +108 -0
  421. data/lib/constants.rb +5 -0
  422. data/lib/scarpe/alert.rb +19 -0
  423. data/lib/scarpe/app.rb +78 -0
  424. data/lib/scarpe/arc.rb +49 -0
  425. data/lib/scarpe/background.rb +14 -0
  426. data/lib/scarpe/border.rb +16 -0
  427. data/lib/scarpe/button.rb +26 -18
  428. data/lib/scarpe/colors.rb +215 -0
  429. data/lib/scarpe/display_service.rb +189 -0
  430. data/lib/scarpe/document_root.rb +20 -0
  431. data/lib/scarpe/edit_box.rb +24 -0
  432. data/lib/scarpe/edit_line.rb +16 -30
  433. data/lib/scarpe/fill.rb +23 -0
  434. data/lib/scarpe/flow.rb +18 -15
  435. data/lib/scarpe/glibui/README.md +34 -0
  436. data/lib/scarpe/glibui/alert.rb +65 -0
  437. data/lib/scarpe/glibui/app.rb +27 -0
  438. data/lib/scarpe/glibui/background.rb +18 -0
  439. data/lib/scarpe/glibui/border.rb +22 -0
  440. data/lib/scarpe/glibui/button.rb +38 -0
  441. data/lib/scarpe/glibui/dimensions.rb +22 -0
  442. data/lib/scarpe/glibui/document_root.rb +33 -0
  443. data/lib/scarpe/glibui/edit_box.rb +44 -0
  444. data/lib/scarpe/glibui/edit_line.rb +43 -0
  445. data/lib/scarpe/glibui/flow.rb +33 -0
  446. data/lib/scarpe/glibui/html.rb +77 -0
  447. data/lib/scarpe/glibui/image.rb +36 -0
  448. data/lib/scarpe/glibui/link.rb +29 -0
  449. data/lib/scarpe/glibui/local_display.rb +62 -0
  450. data/lib/scarpe/glibui/para.rb +84 -0
  451. data/lib/scarpe/glibui/spacing.rb +41 -0
  452. data/lib/scarpe/glibui/stack.rb +33 -0
  453. data/lib/scarpe/glibui/text_widget.rb +30 -0
  454. data/lib/scarpe/glibui/widget.rb +81 -0
  455. data/lib/scarpe/glibui.rb +29 -0
  456. data/lib/scarpe/image.rb +28 -9
  457. data/lib/scarpe/libui/alert.rb +9 -0
  458. data/lib/scarpe/libui/button.rb +18 -0
  459. data/lib/scarpe/libui/colors.rb +157 -0
  460. data/lib/scarpe/libui/core.rb +66 -0
  461. data/lib/scarpe/libui/flow.rb +16 -0
  462. data/lib/scarpe/libui/libui.rb +45 -0
  463. data/lib/scarpe/libui/notepad.md +26 -0
  464. data/lib/scarpe/libui/para.rb +154 -0
  465. data/lib/scarpe/libui/stack.rb +34 -0
  466. data/lib/scarpe/line.rb +25 -0
  467. data/lib/scarpe/link.rb +25 -0
  468. data/lib/scarpe/list_box.rb +25 -0
  469. data/lib/scarpe/logger.rb +155 -0
  470. data/lib/scarpe/para.rb +84 -12
  471. data/lib/scarpe/promises.rb +387 -0
  472. data/lib/scarpe/shape.rb +19 -0
  473. data/lib/scarpe/spacing.rb +9 -0
  474. data/lib/scarpe/span.rb +26 -0
  475. data/lib/scarpe/stack.rb +66 -12
  476. data/lib/scarpe/star.rb +47 -0
  477. data/lib/scarpe/text_widget.rb +42 -0
  478. data/lib/scarpe/unit_test_helpers.rb +163 -0
  479. data/lib/scarpe/version.rb +2 -2
  480. data/lib/scarpe/widget.rb +198 -0
  481. data/lib/scarpe/widgets.rb +30 -0
  482. data/lib/scarpe/wv/alert.rb +65 -0
  483. data/lib/scarpe/wv/app.rb +85 -0
  484. data/lib/scarpe/wv/arc.rb +57 -0
  485. data/lib/scarpe/wv/background.rb +18 -0
  486. data/lib/scarpe/wv/border.rb +22 -0
  487. data/lib/scarpe/wv/button.rb +50 -0
  488. data/lib/scarpe/wv/control_interface.rb +153 -0
  489. data/lib/scarpe/wv/control_interface_test.rb +253 -0
  490. data/lib/scarpe/wv/dimensions.rb +22 -0
  491. data/lib/scarpe/wv/document_root.rb +50 -0
  492. data/lib/scarpe/wv/edit_box.rb +44 -0
  493. data/lib/scarpe/wv/edit_line.rb +43 -0
  494. data/lib/scarpe/wv/fill.rb +30 -0
  495. data/lib/scarpe/wv/flow.rb +32 -0
  496. data/lib/scarpe/wv/html.rb +107 -0
  497. data/lib/scarpe/wv/image.rb +36 -0
  498. data/lib/scarpe/wv/line.rb +38 -0
  499. data/lib/scarpe/wv/link.rb +29 -0
  500. data/lib/scarpe/wv/list_box.rb +50 -0
  501. data/lib/scarpe/wv/para.rb +90 -0
  502. data/lib/scarpe/wv/shape.rb +34 -0
  503. data/lib/scarpe/wv/shape_helper.rb +44 -0
  504. data/lib/scarpe/wv/spacing.rb +41 -0
  505. data/lib/scarpe/wv/span.rb +66 -0
  506. data/lib/scarpe/wv/stack.rb +42 -0
  507. data/lib/scarpe/wv/star.rb +64 -0
  508. data/lib/scarpe/wv/text_widget.rb +30 -0
  509. data/lib/scarpe/wv/web_wrangler.rb +679 -0
  510. data/lib/scarpe/wv/webview_local_display.rb +72 -0
  511. data/lib/scarpe/wv/webview_relay_display.rb +185 -0
  512. data/lib/scarpe/wv/widget.rb +181 -0
  513. data/lib/scarpe/wv/wv_display_worker.rb +65 -0
  514. data/lib/scarpe/wv.rb +39 -0
  515. data/lib/scarpe/wv_local.rb +6 -0
  516. data/lib/scarpe/wv_relay.rb +6 -0
  517. data/lib/scarpe.rb +35 -27
  518. data/logger/debug_web_wrangler.json +4 -0
  519. data/logger/scarpe_wv_test.json +4 -0
  520. data/scarpegen.rb +193 -0
  521. data/sig/scarpe.rbs +1 -1
  522. data/templates/basic_class_template.erb +38 -0
  523. data/templates/class_template_with_event_bind.erb +27 -0
  524. data/templates/class_template_with_shapes.erb +43 -0
  525. data/templates/example_template.erb +3 -0
  526. data/templates/module_template.erb +12 -0
  527. data/templates/webview_template.erb +30 -0
  528. metadata +586 -9
  529. data/lib/scarpe/container.rb +0 -10
  530. data/lib/scarpe/internal_app.rb +0 -46
data/lib/scarpe/stack.rb CHANGED
@@ -1,16 +1,70 @@
1
- module Scarpe
2
- class Stack
3
- include Scarpe::Container
4
-
5
- attr_reader :app
6
- def initialize(app, &block)
7
- @app = app
8
- @app.append(render)
9
- append(&block)
1
+ # frozen_string_literal: true
2
+
3
+ require "net/http"
4
+ require "openssl"
5
+ require "nokogiri"
6
+
7
+ class Scarpe
8
+ class Stack < Scarpe::Widget
9
+ include Scarpe::Background
10
+ include Scarpe::Border
11
+ include Scarpe::Spacing
12
+
13
+ display_properties :width, :height, :margin, :padding, :scroll, :margin_top, :margin_left, :margin_right, :margin_bottom, :options
14
+
15
+ def initialize(width: nil, height: "100%", margin: nil, padding: nil, scroll: false, margin_top: nil, margin_bottom: nil, margin_left: nil,
16
+ margin_right: nil, **options, &block)
17
+
18
+ # TODO: what are these options? Are they guaranteed serializable?
19
+ @options = options
20
+
21
+ super
22
+
23
+ create_display_widget
24
+ # Create the display-side widget *before* instance_eval, which will add child widgets with their display widgets
25
+ instance_eval(&block) if block_given?
26
+ end
27
+ end
28
+
29
+ class Widget
30
+ def download(url)
31
+ Thread.new do
32
+ begin
33
+ uri = URI(url)
34
+ http = Net::HTTP.new(uri.host, uri.port)
35
+ http.use_ssl = true
36
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
37
+
38
+ request = Net::HTTP::Get.new(uri.request_uri)
39
+
40
+ http.request(request) do |response|
41
+ case response
42
+ when Net::HTTPSuccess
43
+ # content = response.body
44
+
45
+ # headers = response.header
46
+
47
+ get_title(content)
48
+ else
49
+ Scarpe.error("Failed to download content. Response code: #{response.code}")
50
+ end
51
+ end
52
+ rescue StandardError => e
53
+ Scarpe.error("Error occurred while downloading: #{e.message}")
54
+ end
55
+ end
10
56
  end
11
57
 
12
- def render
13
- "<div style='display: flex; flex-direction: column' id=#{object_id}></div>"
58
+ private
59
+
60
+ def get_title(content)
61
+ doc = Nokogiri::HTML(content)
62
+
63
+ title = doc.at_css("title")&.text&.strip || ""
64
+
65
+ # headings = doc.css("h1").map(&:text)
66
+
67
+ title
14
68
  end
15
69
  end
16
- end
70
+ 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 < Scarpe::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,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Scarpe::TextWidget
4
+
5
+ class Scarpe
6
+ class TextWidget < Scarpe::Widget
7
+ class << self
8
+ # rubocop:disable Lint/MissingSuper
9
+ def inherited(subclass)
10
+ Scarpe::Widget.widget_classes ||= []
11
+ Scarpe::Widget.widget_classes << subclass
12
+ end
13
+ # rubocop:enable Lint/MissingSuper
14
+ end
15
+ end
16
+
17
+ class << self
18
+ def default_text_widget_with(element)
19
+ class_name = element.capitalize
20
+
21
+ widget_class = Class.new(Scarpe::TextWidget) do
22
+ display_property :content
23
+
24
+ def initialize(content)
25
+ @content = content
26
+
27
+ super
28
+
29
+ create_display_widget
30
+ end
31
+ end
32
+ Scarpe.const_set class_name, widget_class
33
+ widget_class.class_eval do
34
+ display_property :content
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ Scarpe.default_text_widget_with(:code)
41
+ Scarpe.default_text_widget_with(:em)
42
+ Scarpe.default_text_widget_with(:strong)
@@ -0,0 +1,163 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tempfile"
4
+ require "json"
5
+ require "fileutils"
6
+
7
+ # Helpers here should *not* use Webview-specific functionality.
8
+ # The intention is that these are helpers for various Scarpe display
9
+ # services that do *not* use Webview.
10
+
11
+ module Scarpe::Test; end
12
+
13
+ # We want test failures set up once *total*, not per Minitest::Test. So an instance var
14
+ # doesn't do it.
15
+ ALREADY_SET_UP_LOGGED_TEST_FAILURES = { setup: false }
16
+
17
+ # General helpers for general usage
18
+ module Scarpe::Test::Helpers
19
+ def with_tempfile(prefix, contents, dir: Dir.tmpdir)
20
+ t = Tempfile.new(prefix, dir)
21
+ t.write(contents)
22
+ t.flush # Make sure the contents are written out
23
+
24
+ yield(t.path)
25
+ ensure
26
+ t.close
27
+ t.unlink
28
+ end
29
+
30
+ # Temporarily set env vars for the block of code inside
31
+ def with_env_vars(envs)
32
+ old_env = {}
33
+ envs.each do |k, v|
34
+ old_env[k] = ENV[k]
35
+ ENV[k] = v
36
+ end
37
+ yield
38
+ ensure
39
+ old_env.each { |k, v| ENV[k] = v }
40
+ end
41
+ end
42
+
43
+ # This test will save extensive logs in case of test failure.
44
+ # Note that it defines setup/teardown methods. If you want
45
+ # multiple setup/teardowns from multiple places to happen you
46
+ # may need to explictly call (e.g. with logged_test_setup/teardown)
47
+ # to ensure everything you want happens.
48
+ module Scarpe::Test::LoggedTest
49
+ LOGGER_DIR = File.expand_path("#{__dir__}/../../logger")
50
+
51
+ def file_id
52
+ "#{self.class.name}_#{self.name}"
53
+ end
54
+
55
+ def logged_test_setup
56
+ # Make sure test failures will be saved at the end of the run.
57
+ # Delete stale test failures and logging only the *first* time this is called.
58
+ set_up_test_failures
59
+
60
+ @normal_log_config = Scarpe::Logger.current_log_config
61
+ Scarpe::Logger.configure_logger(log_config_for_test)
62
+
63
+ Scarpe::Logger.logger("LoggedScarpeTest").info("Test: #{self.class.name}##{self.name}")
64
+ end
65
+
66
+ # If you include this module and don't override setup/teardown, everything will
67
+ # work fine. But if you need more setup/teardown steps, you can do that too.
68
+ def setup
69
+ logged_test_setup
70
+ end
71
+
72
+ def logged_test_teardown
73
+ # Restore previous log config
74
+ Scarpe::Logger.configure_logger(@normal_log_config)
75
+
76
+ if self.failure
77
+ save_failure_logs
78
+ else
79
+ remove_unsaved_logs
80
+ end
81
+ end
82
+
83
+ def teardown
84
+ logged_test_teardown
85
+ end
86
+
87
+ def log_config_for_test
88
+ {
89
+ "default" => ["debug", "logger/test_failure_#{file_id}.log"],
90
+
91
+ "WebviewAPI" => ["debug", "logger/test_failure_wv_api_#{file_id}.log"],
92
+
93
+ "DisplayService" => ["debug", "logger/test_failure_events_#{file_id}.log"],
94
+ "WV::RelayDisplayService" => ["debug", "logger/test_failure_events_#{file_id}.log"],
95
+ "WV::WebviewDisplayService" => ["debug", "logger/test_failure_events_#{file_id}.log"],
96
+ "WV::ControlInterface" => ["debug", "logger/test_failure_events_#{file_id}.log"],
97
+ }
98
+ end
99
+
100
+ # This could be a lot simpler except I want to only update the file list in one place,
101
+ # log_config_for_test(). Having a single spot should (I hope) make it a lot friendlier to
102
+ # add more logfiles for different components, logged API objects, etc.
103
+ def saved_log_files
104
+ lc = log_config_for_test
105
+ log_outfiles = lc.values.map { |_level, loc| loc }
106
+ log_outfiles.select { |s| s.start_with?("logger/") }.map { |s| s.delete_prefix("logger/") }
107
+ end
108
+
109
+ def set_up_test_failures
110
+ return if ALREADY_SET_UP_LOGGED_TEST_FAILURES[:setup]
111
+
112
+ ALREADY_SET_UP_LOGGED_TEST_FAILURES[:setup] = true
113
+ # Delete stale test failures, if any, before starting the first failure-logged test
114
+ Dir["#{LOGGER_DIR}/test_failure*.log"].each { |fn| File.unlink(fn) }
115
+
116
+ Minitest.after_run do
117
+ # Print test failure notice to console
118
+ unless Dir["#{LOGGER_DIR}/test_failure*.out.log"].empty?
119
+ puts "Some tests have failed! See #{LOGGER_DIR}/test_failure*.out.log for test logs!"
120
+ end
121
+
122
+ # Remove un-saved test logs
123
+ Dir["#{LOGGER_DIR}/test_failure*.log"].each do |f|
124
+ next if f.include?(".out.log")
125
+
126
+ File.unlink(f) if File.exist?(f)
127
+ end
128
+ end
129
+ end
130
+
131
+ def logfail_out_loc(filepath)
132
+ # Add a .out prefix before final .log
133
+ out_loc = filepath.gsub(%r{.log\Z}, ".out.log")
134
+
135
+ if out_loc == filepath
136
+ raise "Something is wrong! Could not figure out failure-log output path for #{filepath.inspect}!"
137
+ end
138
+
139
+ if File.exist?(out_loc)
140
+ raise "Duplicate test file #{out_loc.inspect}? This file should *not* already exist!"
141
+ end
142
+
143
+ out_loc
144
+ end
145
+
146
+ def save_failure_logs
147
+ saved_log_files.each do |log_file|
148
+ full_loc = File.expand_path("#{LOGGER_DIR}/#{log_file}")
149
+ # TODO: we'd like to skip 0-length logfiles. But also Logging doesn't flush. For now, ignore.
150
+ next unless File.exist?(full_loc)
151
+
152
+ FileUtils.mv full_loc, logfail_out_loc(full_loc)
153
+ end
154
+ end
155
+
156
+ def remove_unsaved_logs
157
+ Dir["#{LOGGER_DIR}/test_failure*.log"].each do |f|
158
+ next if f.include?(".out.log") # Don't delete saved logs
159
+
160
+ File.unlink(f)
161
+ end
162
+ end
163
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Scarpe
4
- VERSION = "0.1.0"
3
+ class Scarpe
4
+ VERSION = "0.2.0"
5
5
  end
@@ -0,0 +1,198 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Scarpe::Widget
4
+ #
5
+ # Interface:
6
+ # A Scarpe::Widget defines the "element" method to indicate that it has custom markup of
7
+ # some kind. A Widget with no element method renders as its children's markup, joined.
8
+
9
+ class Scarpe
10
+ class Widget < DisplayService::Linkable
11
+ include Scarpe::Log
12
+ include Scarpe::Colors
13
+
14
+ class << self
15
+ attr_accessor :widget_classes, :alias_name
16
+
17
+ def alias_as(name)
18
+ self.alias_name = name
19
+ end
20
+
21
+ def inherited(subclass)
22
+ self.widget_classes ||= []
23
+ self.widget_classes << subclass
24
+ super
25
+ end
26
+
27
+ def dsl_name
28
+ n = name.split("::").last.chomp("Widget")
29
+ n.gsub(/(.)([A-Z])/, '\1_\2').downcase
30
+ end
31
+
32
+ def widget_class_by_name(name)
33
+ widget_classes.detect { |k| k.dsl_name == name.to_s || k.alias_name.to_s == name.to_s }
34
+ end
35
+
36
+ private
37
+
38
+ def linkable_properties
39
+ @linkable_properties ||= []
40
+ end
41
+
42
+ def linkable_properties_hash
43
+ @linkable_properties_hash ||= {}
44
+ end
45
+
46
+ public
47
+
48
+ # Display properties in Shoes Linkables are automatically sync'd with the display side objects.
49
+ # TODO: do we want types or other modifiers on specific properties?
50
+ def display_property(name)
51
+ name = name.to_s
52
+
53
+ return if linkable_properties_hash[name]
54
+
55
+ linkable_properties << { name: name }
56
+ linkable_properties_hash[name] = true
57
+ end
58
+
59
+ def display_properties(*names)
60
+ names.each { |n| display_property(n) }
61
+ end
62
+
63
+ def display_property_names
64
+ linkable_properties.map { |prop| prop[:name] }
65
+ end
66
+
67
+ def display_property_name?(name)
68
+ linkable_properties_hash[name.to_s]
69
+ end
70
+ end
71
+
72
+ def initialize(*args, **kwargs)
73
+ log_init("Widget")
74
+
75
+ self.class.display_property_names.each do |prop|
76
+ if kwargs[prop.to_sym]
77
+ instance_variable_set("@" + prop, kwargs[prop.to_sym])
78
+ end
79
+ end
80
+
81
+ super() # linkable_id defaults to object_id
82
+ end
83
+
84
+ def bind_self_event(event_name, &block)
85
+ raise("Widget has no linkable_id! #{inspect}") unless linkable_id
86
+
87
+ bind_shoes_event(event_name: event_name, target: linkable_id, &block)
88
+ end
89
+
90
+ def bind_no_target_event(event_name, &block)
91
+ bind_shoes_event(event_name:, &block)
92
+ end
93
+
94
+ def display_properties
95
+ properties = {}
96
+ self.class.display_property_names.each do |prop|
97
+ properties[prop] = instance_variable_get("@" + prop)
98
+ end
99
+ properties["shoes_linkable_id"] = self.linkable_id
100
+ properties
101
+ end
102
+
103
+ def create_display_widget
104
+ klass_name = self.class.name.delete_prefix("Scarpe::").delete_prefix("Shoes::")
105
+
106
+ # Should we save a reference to widget for later reference?
107
+ DisplayService.display_service.create_display_widget_for(klass_name, self.linkable_id, display_properties)
108
+ end
109
+
110
+ attr_reader :parent
111
+ attr_reader :children
112
+
113
+ def set_parent(new_parent)
114
+ @parent&.remove_child(self)
115
+ new_parent&.add_child(self)
116
+ @parent = new_parent
117
+ send_shoes_event(new_parent.linkable_id, event_name: "parent", target: linkable_id)
118
+ end
119
+
120
+ # Do not call directly, use set_parent
121
+ def remove_child(child)
122
+ @children ||= []
123
+ unless @children.include?(child)
124
+ @log.warn("remove_child: no such child(#{child.inspect}) for parent(#{parent.inspect})!")
125
+ end
126
+ @children.delete(child)
127
+ end
128
+
129
+ # Do not call directly, use set_parent
130
+ def add_child(child)
131
+ @children ||= []
132
+ @children << child
133
+ end
134
+
135
+ # Removes the element from the Scarpe::Widget tree
136
+ def destroy
137
+ @parent&.remove_child(self)
138
+ send_shoes_event(event_name: "destroy", target: linkable_id)
139
+ end
140
+
141
+ alias_method :destroy_self, :destroy
142
+
143
+ # We use method_missing for widget-creating methods like "button",
144
+ # and also to auto-create display-property getters and setters.
145
+ def method_missing(name, *args, **kwargs, &block)
146
+ name_s = name.to_s
147
+
148
+ if name_s[-1] == "="
149
+ prop_name = name_s[0..-2]
150
+ if self.class.display_property_name?(prop_name)
151
+ self.class.define_method(name) do |new_value|
152
+ raise "Trying to set display properties in an object with no linkable ID!" unless linkable_id
153
+
154
+ instance_variable_set("@" + prop_name, new_value)
155
+ send_shoes_event({ prop_name => new_value }, event_name: "prop_change", target: linkable_id)
156
+ end
157
+
158
+ return self.send(name, *args, **kwargs, &block)
159
+ end
160
+ end
161
+
162
+ if self.class.display_property_name?(name_s)
163
+ self.class.define_method(name) do
164
+ raise "Trying to get display properties in an object with no linkable ID!" unless linkable_id
165
+
166
+ instance_variable_get("@" + name_s)
167
+ end
168
+
169
+ return self.send(name, *args, **kwargs, &block)
170
+ end
171
+
172
+ klass = Widget.widget_class_by_name(name)
173
+ return super unless klass
174
+
175
+ ::Scarpe::Widget.define_method(name) do |*args, **kwargs, &block|
176
+ # Look up the Shoes widget and create it...
177
+ widget_instance = klass.new(*args, **kwargs, &block)
178
+
179
+ unless klass.ancestors.include?(Scarpe::TextWidget)
180
+ widget_instance.set_parent(self)
181
+ end
182
+
183
+ widget_instance
184
+ end
185
+
186
+ send(name, *args, **kwargs, &block)
187
+ end
188
+
189
+ def respond_to_missing?(name, include_private = false)
190
+ name_s = name.to_s
191
+ return true if self.class.display_property_name?(name_s)
192
+ return true if self.class.display_property_name?(name_s[0..-2]) && name_s[-1] == "="
193
+ return true if Widget.widget_class_by_name(name_s)
194
+
195
+ super
196
+ end
197
+ end
198
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "colors"
4
+ require_relative "widget"
5
+ require_relative "app"
6
+
7
+ require_relative "spacing"
8
+ require_relative "background"
9
+ require_relative "border"
10
+ require_relative "star"
11
+
12
+ require_relative "fill"
13
+
14
+ require_relative "document_root"
15
+ require_relative "para"
16
+ require_relative "stack"
17
+ require_relative "flow"
18
+ require_relative "button"
19
+ require_relative "image"
20
+ require_relative "edit_box"
21
+ require_relative "edit_line"
22
+ require_relative "list_box"
23
+ require_relative "alert"
24
+ require_relative "span"
25
+ require_relative "shape"
26
+ require_relative "arc"
27
+
28
+ require_relative "text_widget"
29
+ require_relative "link"
30
+ require_relative "line"
@@ -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