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.
- checksums.yaml +7 -0
- data/.rubocop.yml +85 -0
- data/.ruby-version +1 -0
- data/.vscode/extensions.json +5 -0
- data/.yardopts +12 -0
- data/CHANGELOG.md +19 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/CONTRIBUTING.md +20 -0
- data/Gemfile +24 -0
- data/LICENSE.txt +21 -0
- data/README.md +178 -0
- data/Rakefile +15 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/dev.yml +7 -0
- data/docs/static/PKGBUILD +47 -0
- data/docs/static/Shoes.icns +0 -0
- data/docs/static/avatar.png +0 -0
- data/docs/static/code_highlighter.js +188 -0
- data/docs/static/code_highlighter_ruby.js +26 -0
- data/docs/static/icon-debug.png +0 -0
- data/docs/static/icon-error.png +0 -0
- data/docs/static/icon-info.png +0 -0
- data/docs/static/icon-warn.png +0 -0
- data/docs/static/listbox_button1.png +0 -0
- data/docs/static/listbox_button2.png +0 -0
- data/docs/static/man-app.png +0 -0
- data/docs/static/man-builds.png +0 -0
- data/docs/static/man-builds1.png +0 -0
- data/docs/static/man-editor-notepad.png +0 -0
- data/docs/static/man-editor-osx.png +0 -0
- data/docs/static/man-ele-background.png +0 -0
- data/docs/static/man-ele-border.png +0 -0
- data/docs/static/man-ele-button.png +0 -0
- data/docs/static/man-ele-check.png +0 -0
- data/docs/static/man-ele-editbox.png +0 -0
- data/docs/static/man-ele-editline.png +0 -0
- data/docs/static/man-ele-image.png +0 -0
- data/docs/static/man-ele-listbox.png +0 -0
- data/docs/static/man-ele-progress.png +0 -0
- data/docs/static/man-ele-radio.png +0 -0
- data/docs/static/man-ele-shape.png +0 -0
- data/docs/static/man-ele-textblock.png +0 -0
- data/docs/static/man-ele-video.png +0 -0
- data/docs/static/man-intro-dmg.png +0 -0
- data/docs/static/man-intro-exe.png +0 -0
- data/docs/static/man-look-tiger.png +0 -0
- data/docs/static/man-look-ubuntu.png +0 -0
- data/docs/static/man-look-vista.png +0 -0
- data/docs/static/man-run-osx.png +0 -0
- data/docs/static/man-run-vista.png +0 -0
- data/docs/static/man-run-xp.png +0 -0
- data/docs/static/man-shot1.png +0 -0
- data/docs/static/manual-en.txt +3529 -0
- data/docs/static/manual-ja.txt +2829 -0
- data/docs/static/manual.css +171 -0
- data/docs/static/manual.md +3528 -0
- data/docs/static/menu-corner1.png +0 -0
- data/docs/static/menu-corner2.png +0 -0
- data/docs/static/menu-gray.png +0 -0
- data/docs/static/menu-left.png +0 -0
- data/docs/static/menu-right.png +0 -0
- data/docs/static/menu-top.png +0 -0
- data/docs/static/shoes-dmg.jpg +0 -0
- data/docs/static/shoes-icon-blue.png +0 -0
- data/docs/static/shoes-icon.png +0 -0
- data/docs/static/shoes-manual-apps.gif +0 -0
- data/docs/static/shoes_main_window.png +0 -0
- data/docs/static/stripe.png +0 -0
- data/docs/static/stubs/blank.exe +0 -0
- data/docs/static/stubs/blank.hfz +0 -0
- data/docs/static/stubs/blank.run +375 -0
- data/docs/static/stubs/cocoa-install +0 -0
- data/docs/static/stubs/sh-install +49 -0
- data/docs/static/stubs/shoes-stub-inject.exe +0 -0
- data/docs/static/stubs/shoes-stub.exe +0 -0
- data/docs/static/tutor-back.png +0 -0
- data/docs/yard/catscradle.md +44 -0
- data/docs/yard/template/default/fulldoc/html/setup.rb +13 -0
- data/docs/yard/template/default/layout/html/setup.rb +9 -0
- data/examples/backdround_with_image.rb +16 -0
- data/examples/bloopsaphone/working/1901_by_Aanand_Prasad.rb +478 -0
- data/examples/bloopsaphone/working/b1.rb +64 -0
- data/examples/bloopsaphone/working/b2.rb +36 -0
- data/examples/bloopsaphone/working/bloops_test.rb +41 -0
- data/examples/bloopsaphone/working/bloopsaphone_theme_song_by_why.rb +31 -0
- data/examples/bloopsaphone/working/feepogram.rb +67 -0
- data/examples/bloopsaphone/working/simpsons_theme_song_by_why.rb +14 -0
- data/examples/bloopsaphone/working/tune_cheeky_drat.rb +210 -0
- data/examples/button.rb +10 -0
- data/examples/button_alert.rb +6 -0
- data/examples/button_go_away.rb +6 -0
- data/examples/button_with_position_and_size.rb +7 -0
- data/examples/coffee.rb +14 -0
- data/examples/download.rb +5 -0
- data/examples/download_and_show_image.rb +28 -0
- data/examples/edit_box.rb +8 -0
- data/examples/edit_line.rb +8 -0
- data/examples/fill.rb +25 -0
- data/examples/flow.rb +11 -0
- data/examples/fonts.rb +6 -0
- data/examples/gen.rb +140 -0
- data/examples/get_headers.rb +10 -0
- data/examples/hello_world.rb +3 -0
- data/examples/highlander.rb +87 -0
- data/examples/image/clickable_image.rb +5 -0
- data/examples/image/image.rb +3 -0
- data/examples/image/image_size.rb +7 -0
- data/examples/image/image_with_position_and_size.rb +3 -0
- data/examples/info.rb +9 -0
- data/examples/legacy/not_checked/expert/colours.rb +105 -0
- data/examples/legacy/not_checked/expert/curve-animation.rb +31 -0
- data/examples/legacy/not_checked/expert/curve-control-point.rb +51 -0
- data/examples/legacy/not_checked/expert/custom-list-box.rb +53 -0
- data/examples/legacy/not_checked/expert/definr.rb +23 -0
- data/examples/legacy/not_checked/expert/funnies.rb +56 -0
- data/examples/legacy/not_checked/expert/minesweeper.rb +267 -0
- data/examples/legacy/not_checked/expert/othello.rb +318 -0
- data/examples/legacy/not_checked/expert/pong.rb +62 -0
- data/examples/legacy/not_checked/expert/tankspank.rb +385 -0
- data/examples/legacy/not_checked/expert/tooltips.rb +45 -0
- data/examples/legacy/not_checked/expert/url.rb +37 -0
- data/examples/legacy/not_checked/expert/video-player.rb +256 -0
- data/examples/legacy/not_checked/good/_why-stories.rb +44 -0
- data/examples/legacy/not_checked/good/_why-stories.yaml +387 -0
- data/examples/legacy/not_checked/good/arc.rb +37 -0
- data/examples/legacy/not_checked/good/cardflip.rb +141 -0
- data/examples/legacy/not_checked/good/clock.rb +51 -0
- data/examples/legacy/not_checked/good/console.rb +21 -0
- data/examples/legacy/not_checked/good/follow.rb +26 -0
- data/examples/legacy/not_checked/good/image-rotate.rb +14 -0
- data/examples/legacy/not_checked/good/paris.svg +7236 -0
- data/examples/legacy/not_checked/good/path-animation.rb +46 -0
- data/examples/legacy/not_checked/good/plots.rb +100 -0
- data/examples/legacy/not_checked/good/reminder.rb +174 -0
- data/examples/legacy/not_checked/good/svgview.rb +113 -0
- data/examples/legacy/not_checked/good/vjot.rb +56 -0
- data/examples/legacy/not_checked/shoes-contrib/.gitignore +2 -0
- data/examples/legacy/not_checked/shoes-contrib/README.md +34 -0
- data/examples/legacy/not_checked/shoes-contrib/animation/animate-ovals.rb +21 -0
- data/examples/legacy/not_checked/shoes-contrib/animation/flowers.rb +59 -0
- data/examples/legacy/not_checked/shoes-contrib/animation/happy-trails.rb +31 -0
- data/examples/legacy/not_checked/shoes-contrib/animation/mice-satellites.rb +27 -0
- data/examples/legacy/not_checked/shoes-contrib/animation/oval-motion.rb +12 -0
- data/examples/legacy/not_checked/shoes-contrib/animation/pink-bubbles.rb +34 -0
- data/examples/legacy/not_checked/shoes-contrib/animation/pulsate.rb +18 -0
- data/examples/legacy/not_checked/shoes-contrib/animation/rotating-star.rb +18 -0
- data/examples/legacy/not_checked/shoes-contrib/app/download-and-save.rb +11 -0
- data/examples/legacy/not_checked/shoes-contrib/app/download.rb +10 -0
- data/examples/legacy/not_checked/shoes-contrib/app/get-google.rb +11 -0
- data/examples/legacy/not_checked/shoes-contrib/app/mouse-detection.rb +7 -0
- data/examples/legacy/not_checked/shoes-contrib/app/resizeable-false.rb +6 -0
- data/examples/legacy/not_checked/shoes-contrib/art/bubble-bullseye.rb +23 -0
- data/examples/legacy/not_checked/shoes-contrib/art/faded.rb +17 -0
- data/examples/legacy/not_checked/shoes-contrib/art/fill-oval.rb +5 -0
- data/examples/legacy/not_checked/shoes-contrib/art/mask.rb +15 -0
- data/examples/legacy/not_checked/shoes-contrib/art/oval-gradient.rb +6 -0
- data/examples/legacy/not_checked/shoes-contrib/art/star-gradient.rb +4 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/basic-edit-box.rb +8 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/basic-new-window.rb +8 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/basic-oval-image.rb +8 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/basic-oval-shape.rb +8 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/basic-oval.rb +6 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/class-book.rb +43 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/class-book.yaml +387 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/clock.rb +6 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/edit-stack +14 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/gradient-shoes.rb +7 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/list_box-shape-report.rb +19 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/rect-arrow.rb +7 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/scribble.rb +8 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/search.rb +32 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/shoes-notes.rb +16 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/url-shoes-subclassing.rb +24 -0
- data/examples/legacy/not_checked/shoes-contrib/browser.rb +21 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/background-column.rb +3 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/background.rb +4 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/basic-fps.rb +6 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/border-cat.rb +6 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/button-block.rb +8 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/check-mate.rb +15 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/common-styles.rb +13 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/displace-animation.rb +13 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/edit_box-character-count.rb +7 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/edit_line-character-count.rb +7 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/image-icon.rb +3 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/list_box-select-class.rb +13 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/list_box.rb +6 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/move-flow-animate.rb +13 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/phat-button.rb +7 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/popup.rb +7 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/progress-bar.rb +10 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/radio-dreamcast-favs.rb +17 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/timer.rb +6 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/width-introspec.rb +8 -0
- data/examples/legacy/not_checked/shoes-contrib/events/background-hover.rb +11 -0
- data/examples/legacy/not_checked/shoes-contrib/events/motion-detect.rb +9 -0
- data/examples/legacy/not_checked/shoes-contrib/events/pressed-key.rb +6 -0
- data/examples/legacy/not_checked/shoes-contrib/expert/expert-funnies.rb +51 -0
- data/examples/legacy/not_checked/shoes-contrib/expert/expert-irb.rb +112 -0
- data/examples/legacy/not_checked/shoes-contrib/expert/expert-othello.rb +319 -0
- data/examples/legacy/not_checked/shoes-contrib/good/good-arc.rb +37 -0
- data/examples/legacy/not_checked/shoes-contrib/good/good-clock.rb +51 -0
- data/examples/legacy/not_checked/shoes-contrib/good/good-follow.rb +26 -0
- data/examples/legacy/not_checked/shoes-contrib/good/good-reminder.rb +174 -0
- data/examples/legacy/not_checked/shoes-contrib/good/good-vjot.rb +56 -0
- data/examples/legacy/not_checked/shoes-contrib/kernel/ask.rb +4 -0
- data/examples/legacy/not_checked/shoes-contrib/kernel/ask_color.rb +4 -0
- data/examples/legacy/not_checked/shoes-contrib/kernel/ask_open_file.rb +4 -0
- data/examples/legacy/not_checked/shoes-contrib/kernel/ask_save_file.rb +7 -0
- data/examples/legacy/not_checked/shoes-contrib/kernel/confirm.rb +3 -0
- data/examples/legacy/not_checked/shoes-contrib/kernel/debug.rb +4 -0
- data/examples/legacy/not_checked/shoes-contrib/kernel/exit.rb +5 -0
- data/examples/legacy/not_checked/shoes-contrib/kernel/font.rb +5 -0
- data/examples/legacy/not_checked/shoes-contrib/kernel/fonts.rb +3 -0
- data/examples/legacy/not_checked/shoes-contrib/manipulation/append-slot.rb +9 -0
- data/examples/legacy/not_checked/shoes-contrib/manipulation/clear-slot.rb +6 -0
- data/examples/legacy/not_checked/shoes-contrib/manipulation/prepend-slot.rb +6 -0
- data/examples/legacy/not_checked/shoes-contrib/manipulation/roll.rb +17 -0
- data/examples/legacy/not_checked/shoes-contrib/position/gutter-margin.rb +5 -0
- data/examples/legacy/not_checked/shoes-contrib/position/stack-width.rb +3 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-accordion.rb +75 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-anim-shapes.rb +17 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-anim-text.rb +13 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-arc.rb +23 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-bounce.rb +24 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-calc.rb +70 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-chipmunk.rb +26 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-control-sizes.rb +24 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-curve.rb +26 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-dialogs.rb +29 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-downloader.rb +27 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-draw.rb +13 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-editor.rb +28 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-form.rb +28 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-form.shy +0 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-mask.rb +21 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-menu.rb +31 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-menu1.rb +35 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-rubygems.rb +29 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-slide.rb +45 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-sphere.rb +28 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-sqlite3.rb +13 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-timer.rb +13 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-video.rb +13 -0
- data/examples/legacy/not_checked/shoes-contrib/styles/alignment.rb +4 -0
- data/examples/legacy/not_checked/shoes-contrib/styles/attachment.rb +5 -0
- data/examples/legacy/not_checked/shoes-contrib/styles/emphasis.rb +3 -0
- data/examples/legacy/not_checked/shoes-contrib/styles/gradient-angle.rb +3 -0
- data/examples/legacy/not_checked/shoes-contrib/styles/para-methods.rb +5 -0
- data/examples/legacy/not_checked/shoes-contrib/styles/para-red-underlined.rb +3 -0
- data/examples/legacy/not_checked/shoes-contrib/styles/para-style-method.rb +4 -0
- data/examples/legacy/not_checked/shoes-dep-samples/expert-game-of-life.rb +243 -0
- data/examples/legacy/not_checked/shoes-dep-samples/expert-othello.rb +319 -0
- data/examples/legacy/not_checked/shoes-dep-samples/good-clock.rb +51 -0
- data/examples/legacy/not_checked/shoes-dep-samples/good-follow.rb +26 -0
- data/examples/legacy/not_checked/shoes-dep-samples/good-reminder.rb +174 -0
- data/examples/legacy/not_checked/shoes-dep-samples/good-vjot.rb +56 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-accordion.rb +75 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-anim-shapes.rb +17 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-anim-text.rb +13 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-arc.rb +23 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-bounce.rb +24 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-calc.rb +70 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-chipmunk.rb +26 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-control-sizes.rb +24 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-curve.rb +26 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-dialogs.rb +29 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-draw.rb +13 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-editor.rb +28 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-form.rb +28 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-form.shy +0 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-mask.rb +21 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-menu.rb +31 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-menu1.rb +35 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-rubygems.rb +29 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-slide.rb +45 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-sphere.rb +28 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-sqlite3.rb +13 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-timer.rb +13 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-video.rb +13 -0
- data/examples/legacy/not_checked/shoes3-tests/AnemicCinema1926marcelDuchampCut.mp4 +0 -0
- data/examples/legacy/not_checked/shoes3-tests/button/button.rb +53 -0
- data/examples/legacy/not_checked/shoes3-tests/cache/cache.rb +41 -0
- data/examples/legacy/not_checked/shoes3-tests/combo/combo.rb +24 -0
- data/examples/legacy/not_checked/shoes3-tests/curl/bare.rb +34 -0
- data/examples/legacy/not_checked/shoes3-tests/curl/downloader.rb +40 -0
- data/examples/legacy/not_checked/shoes3-tests/curl/m1.rb +11 -0
- data/examples/legacy/not_checked/shoes3-tests/curl/m2.rb +12 -0
- data/examples/legacy/not_checked/shoes3-tests/curl/m3.rb +11 -0
- data/examples/legacy/not_checked/shoes3-tests/curl/m4.rb +5 -0
- data/examples/legacy/not_checked/shoes3-tests/curl/typ.rb +30 -0
- data/examples/legacy/not_checked/shoes3-tests/cursor/c1.rb +21 -0
- data/examples/legacy/not_checked/shoes3-tests/decoration.rb +14 -0
- data/examples/legacy/not_checked/shoes3-tests/dialogs/ask.rb +6 -0
- data/examples/legacy/not_checked/shoes3-tests/dialogs/confirm.rb +6 -0
- data/examples/legacy/not_checked/shoes3-tests/editbox/editbox.rb +36 -0
- data/examples/legacy/not_checked/shoes3-tests/editline/editline.rb +27 -0
- data/examples/legacy/not_checked/shoes3-tests/events/button.rb +32 -0
- data/examples/legacy/not_checked/shoes3-tests/events/button.yaml +40 -0
- data/examples/legacy/not_checked/shoes3-tests/events/capture.rb +57 -0
- data/examples/legacy/not_checked/shoes3-tests/events/chipmunk.yaml +47 -0
- data/examples/legacy/not_checked/shoes3-tests/events/event0.rb +8 -0
- data/examples/legacy/not_checked/shoes3-tests/events/event1.rb +51 -0
- data/examples/legacy/not_checked/shoes3-tests/events/event1.yaml +26 -0
- data/examples/legacy/not_checked/shoes3-tests/events/event2.rb +46 -0
- data/examples/legacy/not_checked/shoes3-tests/events/event3.rb +44 -0
- data/examples/legacy/not_checked/shoes3-tests/events/event4.rb +65 -0
- data/examples/legacy/not_checked/shoes3-tests/events/event5.rb +17 -0
- data/examples/legacy/not_checked/shoes3-tests/events/event6.rb +51 -0
- data/examples/legacy/not_checked/shoes3-tests/events/replay.rb +60 -0
- data/examples/legacy/not_checked/shoes3-tests/gapp/fullscreen.rb +38 -0
- data/examples/legacy/not_checked/shoes3-tests/gapp/icon.rb +56 -0
- data/examples/legacy/not_checked/shoes3-tests/gapp/mon1.rb +46 -0
- data/examples/legacy/not_checked/shoes3-tests/gapp/settings1.rb +22 -0
- data/examples/legacy/not_checked/shoes3-tests/gapp/title1.rb +34 -0
- data/examples/legacy/not_checked/shoes3-tests/indian.m4a +0 -0
- data/examples/legacy/not_checked/shoes3-tests/menus/event.rb +33 -0
- data/examples/legacy/not_checked/shoes3-tests/menus/menu1.rb +8 -0
- data/examples/legacy/not_checked/shoes3-tests/menus/menu2.rb +25 -0
- data/examples/legacy/not_checked/shoes3-tests/menus/menu3.rb +103 -0
- data/examples/legacy/not_checked/shoes3-tests/menus/menu4.rb +41 -0
- data/examples/legacy/not_checked/shoes3-tests/menus/tests.txt +42 -0
- data/examples/legacy/not_checked/shoes3-tests/opacity.rb +13 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/^IRX.R +5219 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/^SPX +5219 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/cstest.rb +51 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/gr1.rb +73 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/gr2.rb +40 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/gr3.rb +47 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/gr4.rb +35 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/gr5.rb +31 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/gr6.rb +35 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/gr7.rb +37 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/grcsv.rb +219 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/manual.rb +40 -0
- data/examples/legacy/not_checked/shoes3-tests/progress/progress.rb +29 -0
- data/examples/legacy/not_checked/shoes3-tests/radio/clear.rb +20 -0
- data/examples/legacy/not_checked/shoes3-tests/radio/group.rb +18 -0
- data/examples/legacy/not_checked/shoes3-tests/radio/multiple.rb +32 -0
- data/examples/legacy/not_checked/shoes3-tests/radio/nogroup.rb +9 -0
- data/examples/legacy/not_checked/shoes3-tests/simpletest.svg +14 -0
- data/examples/legacy/not_checked/shoes3-tests/spinner.rb +15 -0
- data/examples/legacy/not_checked/shoes3-tests/svg.rb +208 -0
- data/examples/legacy/not_checked/shoes3-tests/switch/switch.rb +28 -0
- data/examples/legacy/not_checked/shoes3-tests/systray/back.rb +20 -0
- data/examples/legacy/not_checked/shoes3-tests/systray/note.rb +17 -0
- data/examples/legacy/not_checked/shoes3-tests/terminal/cursor.rb +27 -0
- data/examples/legacy/not_checked/shoes3-tests/terminal/ed.rb +65 -0
- data/examples/legacy/not_checked/shoes3-tests/terminal/el.rb +50 -0
- data/examples/legacy/not_checked/shoes3-tests/terminal/logattr.rb +31 -0
- data/examples/legacy/not_checked/shoes3-tests/tests_color.rb +138 -0
- data/examples/legacy/not_checked/shoes3-tests/tests_svg.rb +228 -0
- data/examples/legacy/not_checked/shoes3-tests/tests_video_vlc.rb +186 -0
- data/examples/legacy/not_checked/shoes3-tests/tooltips.rb +20 -0
- data/examples/legacy/not_checked/shoes3-tests/video_vlc.rb +242 -0
- data/examples/legacy/not_checked/shoes3-tests/wheel/wheel1.rb +21 -0
- data/examples/legacy/not_checked/simple/accordion.rb +81 -0
- data/examples/legacy/not_checked/simple/anim-shapes.rb +17 -0
- data/examples/legacy/not_checked/simple/anim-text.rb +13 -0
- data/examples/legacy/not_checked/simple/arc.rb +23 -0
- data/examples/legacy/not_checked/simple/bounce.rb +24 -0
- data/examples/legacy/not_checked/simple/chipmunk.rb +26 -0
- data/examples/legacy/not_checked/simple/control-sizes.rb +24 -0
- data/examples/legacy/not_checked/simple/curve-control-points.rb +24 -0
- data/examples/legacy/not_checked/simple/curve.rb +26 -0
- data/examples/legacy/not_checked/simple/dialogs.rb +29 -0
- data/examples/legacy/not_checked/simple/downloader.rb +40 -0
- data/examples/legacy/not_checked/simple/downloader1.rb +31 -0
- data/examples/legacy/not_checked/simple/draw.rb +13 -0
- data/examples/legacy/not_checked/simple/editor.rb +28 -0
- data/examples/legacy/not_checked/simple/form.rb +30 -0
- data/examples/legacy/not_checked/simple/image.rb +21 -0
- data/examples/legacy/not_checked/simple/info.rb +78 -0
- data/examples/legacy/not_checked/simple/mask.rb +21 -0
- data/examples/legacy/not_checked/simple/mask2.rb +27 -0
- data/examples/legacy/not_checked/simple/menu.rb +31 -0
- data/examples/legacy/not_checked/simple/menu1.rb +35 -0
- data/examples/legacy/not_checked/simple/slide.rb +45 -0
- data/examples/legacy/not_checked/simple/sphere.rb +28 -0
- data/examples/legacy/not_checked/superleg.rb +244 -0
- data/examples/legacy/working/shoes-contrib/basic/a-poem.rb +24 -0
- data/examples/legacy/working/shoes-contrib/basic/basic-blocks-instances.rb +7 -0
- data/examples/legacy/working/shoes-contrib/basic/basic-blocks.rb +7 -0
- data/examples/legacy/working/shoes-contrib/basic/basic-slot.rb +8 -0
- data/examples/legacy/working/shoes-contrib/basic/intro.rb +20 -0
- data/examples/legacy/working/shoes-contrib/basic/two-column.rb +12 -0
- data/examples/legacy/working/shoes-contrib/elements/edit_box.rb +6 -0
- data/examples/legacy/working/shoes-contrib/kernel/alert.rb +3 -0
- data/examples/legacy/working/simple/calc.rb +71 -0
- data/examples/legacy/working/simple/sqlite3.rb +27 -0
- data/examples/legacy/working/simple/timer.rb +13 -0
- data/examples/line.rb +5 -0
- data/examples/link.rb +20 -0
- data/examples/list_box.rb +8 -0
- data/examples/local_fonts.rb +4 -0
- data/examples/local_images.rb +4 -0
- data/examples/motion_events.rb +20 -0
- data/examples/para/collection_of_arguments.rb +9 -0
- data/examples/para/hello_world.rb +5 -0
- data/examples/para/hide_and_show.rb +9 -0
- data/examples/para/rainbow.rb +11 -0
- data/examples/para/rainbow_2.rb +11 -0
- data/examples/para/sizes.rb +11 -0
- data/examples/para/sizes_2.rb +12 -0
- data/examples/para/strong.rb +3 -0
- data/examples/para_text_widgets.rb +4 -0
- data/examples/parse_xl_funnies.rb +58 -0
- data/examples/pirate.png +0 -0
- data/examples/raw_flow.rb +11 -0
- data/examples/ruby_racer.rb +50 -0
- data/examples/selfitude.rb +18 -0
- data/examples/shapes/arc.rb +8 -0
- data/examples/shapes/shapes.rb +8 -0
- data/examples/shapes/shapes_fill.rb +10 -0
- data/examples/shapes/star.rb +5 -0
- data/examples/shoes_school.rb +66 -0
- data/examples/shoes_splorer.rb +150 -0
- data/examples/simple_slides.rb +73 -0
- data/examples/skip_ci/parrot.rb +22 -0
- data/examples/skip_ci/say.rb +20 -0
- data/examples/sleepless.rb +26 -0
- data/examples/slots.rb +10 -0
- data/examples/spacing.rb +18 -0
- data/examples/span.rb +6 -0
- data/examples/stack/background.rb +35 -0
- data/examples/stack/border.rb +11 -0
- data/examples/stack/gradients.rb +6 -0
- data/examples/stack/raw_stack.rb +8 -0
- data/examples/stack/stack.rb +27 -0
- data/examples/text_change.rb +4 -0
- data/examples/text_sizes.rb +10 -0
- data/examples/timmy.rb +109 -0
- data/examples/title_and_resize.rb +3 -0
- data/examples/video.rb +10 -0
- data/exe/scarpe +107 -0
- data/fonts/Pacifico.ttf +0 -0
- data/lib/scarpe/alert.rb +19 -0
- data/lib/scarpe/arc.rb +49 -0
- data/lib/scarpe/background.rb +14 -0
- data/lib/scarpe/base64.rb +27 -0
- data/lib/scarpe/border.rb +16 -0
- data/lib/scarpe/button.rb +35 -0
- data/lib/scarpe/cats_cradle.rb +255 -0
- data/lib/scarpe/colors.rb +215 -0
- data/lib/scarpe/display_service.rb +185 -0
- data/lib/scarpe/document_root.rb +20 -0
- data/lib/scarpe/download.rb +123 -0
- data/lib/scarpe/edit_box.rb +29 -0
- data/lib/scarpe/edit_line.rb +25 -0
- data/lib/scarpe/fill.rb +23 -0
- data/lib/scarpe/flow.rb +18 -0
- data/lib/scarpe/font.rb +14 -0
- data/lib/scarpe/glibui/README.md +34 -0
- data/lib/scarpe/glibui/alert.rb +65 -0
- data/lib/scarpe/glibui/app.rb +27 -0
- data/lib/scarpe/glibui/background.rb +18 -0
- data/lib/scarpe/glibui/border.rb +22 -0
- data/lib/scarpe/glibui/button.rb +38 -0
- data/lib/scarpe/glibui/dimensions.rb +22 -0
- data/lib/scarpe/glibui/document_root.rb +33 -0
- data/lib/scarpe/glibui/edit_box.rb +44 -0
- data/lib/scarpe/glibui/edit_line.rb +43 -0
- data/lib/scarpe/glibui/flow.rb +33 -0
- data/lib/scarpe/glibui/html.rb +77 -0
- data/lib/scarpe/glibui/image.rb +36 -0
- data/lib/scarpe/glibui/link.rb +29 -0
- data/lib/scarpe/glibui/local_display.rb +62 -0
- data/lib/scarpe/glibui/para.rb +84 -0
- data/lib/scarpe/glibui/spacing.rb +41 -0
- data/lib/scarpe/glibui/stack.rb +33 -0
- data/lib/scarpe/glibui/text_widget.rb +30 -0
- data/lib/scarpe/glibui/widget.rb +81 -0
- data/lib/scarpe/glibui.rb +29 -0
- data/lib/scarpe/image.rb +35 -0
- data/lib/scarpe/libui/alert.rb +9 -0
- data/lib/scarpe/libui/button.rb +18 -0
- data/lib/scarpe/libui/colors.rb +157 -0
- data/lib/scarpe/libui/core.rb +66 -0
- data/lib/scarpe/libui/flow.rb +16 -0
- data/lib/scarpe/libui/libui.rb +45 -0
- data/lib/scarpe/libui/notepad.md +26 -0
- data/lib/scarpe/libui/para.rb +154 -0
- data/lib/scarpe/libui/stack.rb +34 -0
- data/lib/scarpe/line.rb +25 -0
- data/lib/scarpe/link.rb +25 -0
- data/lib/scarpe/list_box.rb +25 -0
- data/lib/scarpe/logger.rb +159 -0
- data/lib/scarpe/para.rb +92 -0
- data/lib/scarpe/promises.rb +405 -0
- data/lib/scarpe/shape.rb +20 -0
- data/lib/scarpe/slot.rb +7 -0
- data/lib/scarpe/spacing.rb +9 -0
- data/lib/scarpe/span.rb +26 -0
- data/lib/scarpe/stack.rb +20 -0
- data/lib/scarpe/star.rb +47 -0
- data/lib/scarpe/subscription_item.rb +60 -0
- data/lib/scarpe/unit_test_helpers.rb +236 -0
- data/lib/scarpe/version.rb +5 -0
- data/lib/scarpe/video.rb +15 -0
- data/lib/scarpe/widgets.rb +35 -0
- data/lib/scarpe/wv/alert.rb +65 -0
- data/lib/scarpe/wv/app.rb +104 -0
- data/lib/scarpe/wv/arc.rb +57 -0
- data/lib/scarpe/wv/background.rb +27 -0
- data/lib/scarpe/wv/border.rb +24 -0
- data/lib/scarpe/wv/button.rb +50 -0
- data/lib/scarpe/wv/control_interface.rb +147 -0
- data/lib/scarpe/wv/control_interface_test.rb +234 -0
- data/lib/scarpe/wv/dimensions.rb +22 -0
- data/lib/scarpe/wv/document_root.rb +8 -0
- data/lib/scarpe/wv/edit_box.rb +44 -0
- data/lib/scarpe/wv/edit_line.rb +43 -0
- data/lib/scarpe/wv/fill.rb +30 -0
- data/lib/scarpe/wv/flow.rb +24 -0
- data/lib/scarpe/wv/font.rb +36 -0
- data/lib/scarpe/wv/html.rb +108 -0
- data/lib/scarpe/wv/image.rb +41 -0
- data/lib/scarpe/wv/line.rb +38 -0
- data/lib/scarpe/wv/link.rb +29 -0
- data/lib/scarpe/wv/list_box.rb +50 -0
- data/lib/scarpe/wv/para.rb +90 -0
- data/lib/scarpe/wv/shape.rb +35 -0
- data/lib/scarpe/wv/shape_helper.rb +44 -0
- data/lib/scarpe/wv/slot.rb +81 -0
- data/lib/scarpe/wv/spacing.rb +41 -0
- data/lib/scarpe/wv/span.rb +66 -0
- data/lib/scarpe/wv/stack.rb +24 -0
- data/lib/scarpe/wv/star.rb +64 -0
- data/lib/scarpe/wv/subscription_item.rb +50 -0
- data/lib/scarpe/wv/text_widget.rb +30 -0
- data/lib/scarpe/wv/video.rb +42 -0
- data/lib/scarpe/wv/web_wrangler.rb +683 -0
- data/lib/scarpe/wv/webview_local_display.rb +73 -0
- data/lib/scarpe/wv/webview_relay_display.rb +185 -0
- data/lib/scarpe/wv/widget.rb +185 -0
- data/lib/scarpe/wv/wv_display_worker.rb +65 -0
- data/lib/scarpe/wv.rb +43 -0
- data/lib/scarpe/wv_local.rb +6 -0
- data/lib/scarpe/wv_relay.rb +6 -0
- data/lib/scarpe.rb +29 -0
- data/lib/shoes/app.rb +187 -0
- data/lib/shoes/constants.rb +26 -0
- data/lib/shoes/text_widget.rb +52 -0
- data/lib/shoes/widget.rb +209 -0
- data/lib/shoes.rb +65 -0
- data/logger/debug_web_wrangler.json +4 -0
- data/logger/scarpe_wv_test.json +4 -0
- data/scarpe-0.2.0.gem +0 -0
- data/scarpe.gemspec +44 -0
- data/scarpegen.rb +193 -0
- data/sig/scarpe.rbs +4 -0
- data/templates/basic_class_template.erb +38 -0
- data/templates/class_template_with_event_bind.erb +27 -0
- data/templates/class_template_with_shapes.erb +43 -0
- data/templates/example_template.erb +3 -0
- data/templates/module_template.erb +12 -0
- data/templates/webview_template.erb +27 -0
- 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
|