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
data/lib/scarpe/span.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Scarpe
|
4
|
+
class Span < Shoes::Widget
|
5
|
+
display_properties :text, :stroke, :size, :font, :html_attributes
|
6
|
+
|
7
|
+
def initialize(text, stroke: nil, size: :span, font: nil, **html_attributes)
|
8
|
+
@text = text
|
9
|
+
@stroke = stroke
|
10
|
+
@size = size
|
11
|
+
@font = font
|
12
|
+
@html_attributes = html_attributes
|
13
|
+
|
14
|
+
super
|
15
|
+
|
16
|
+
create_display_widget
|
17
|
+
end
|
18
|
+
|
19
|
+
def replace(text)
|
20
|
+
@text = text
|
21
|
+
|
22
|
+
# This should signal the display widget to change
|
23
|
+
self.text = @text
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/scarpe/stack.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Scarpe
|
4
|
+
class Stack < Shoes::Slot
|
5
|
+
# TODO: sort out various margin and padding properties, including putting stuff into spacing
|
6
|
+
display_properties :width, :height, :scroll
|
7
|
+
|
8
|
+
def initialize(width: nil, height: nil, margin: nil, padding: nil, scroll: false, margin_top: nil, margin_bottom: nil, margin_left: nil,
|
9
|
+
margin_right: nil, **options, &block)
|
10
|
+
|
11
|
+
@options = options
|
12
|
+
|
13
|
+
super
|
14
|
+
|
15
|
+
create_display_widget
|
16
|
+
# Create the display-side widget *before* running the block, which will add child widgets with their display widgets
|
17
|
+
Shoes::App.instance.with_slot(self, &block) if block_given?
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/scarpe/star.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "wv/shape_helper"
|
4
|
+
class Scarpe
|
5
|
+
class InvalidAttributeValueError < Scarpe::Error; end
|
6
|
+
|
7
|
+
class Star < Shoes::Widget
|
8
|
+
include ShapeHelper
|
9
|
+
display_properties :left, :top, :points, :outer, :inner, :color
|
10
|
+
|
11
|
+
def initialize(left, top, points = 10, outer = 100, inner = 50)
|
12
|
+
@points = convert_to_integer(points, "points", 10)
|
13
|
+
@outer = convert_to_float(outer, "outer", 100.0)
|
14
|
+
@inner = convert_to_float(inner, "inner", 50.0)
|
15
|
+
@color = color_for_fill
|
16
|
+
|
17
|
+
super()
|
18
|
+
create_display_widget
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def convert_to_integer(value, attribute_name, default = 0)
|
24
|
+
begin
|
25
|
+
value = Integer(value)
|
26
|
+
raise InvalidAttributeValueError, "Negative num '#{value}' not allowed for attribute '#{attribute_name}'" if value < 0
|
27
|
+
|
28
|
+
value
|
29
|
+
rescue ArgumentError
|
30
|
+
error_message = "Invalid value '#{value}' provided for attribute '#{attribute_name}'. The value should be a number."
|
31
|
+
raise InvalidAttributeValueError, error_message
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def convert_to_float(value, attribute_name, default = 0.0)
|
36
|
+
begin
|
37
|
+
value = Float(value)
|
38
|
+
raise InvalidAttributeValueError, "Negative num '#{value}' not allowed for attribute '#{attribute_name}'" if value < 0
|
39
|
+
|
40
|
+
value
|
41
|
+
rescue ArgumentError
|
42
|
+
error_message = "Invalid value '#{value}' provided for attribute '#{attribute_name}'. The value should be a number."
|
43
|
+
raise InvalidAttributeValueError, error_message
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Certain Shoes calls like motion and keydown are basically an
|
4
|
+
# event subscription, with no other visible presence. However,
|
5
|
+
# they have a place in the widget tree and can be deleted.
|
6
|
+
#
|
7
|
+
# Depending on the display library they may not have any
|
8
|
+
# direct visual (or similar) presence there either.
|
9
|
+
#
|
10
|
+
# Inheriting from Widget gives these a parent slot and a
|
11
|
+
# linkable_id automatically.
|
12
|
+
class SubscriptionItem < Shoes::Widget
|
13
|
+
display_property :shoes_api_name
|
14
|
+
|
15
|
+
def initialize(shoes_api_name:, &block)
|
16
|
+
super
|
17
|
+
|
18
|
+
@callback = block
|
19
|
+
|
20
|
+
case shoes_api_name
|
21
|
+
when "hover"
|
22
|
+
# Hover passes the Shoes widget as the block param
|
23
|
+
@unsub_id = bind_self_event("hover") do
|
24
|
+
@callback&.call(self)
|
25
|
+
end
|
26
|
+
when "motion"
|
27
|
+
# Shoes sends back x, y, mods as the args.
|
28
|
+
# Shoes3 uses the strings "control" "shift" and
|
29
|
+
# "control_shift" as the mods arg.
|
30
|
+
@unsub_id = bind_self_event("motion") do |x, y, ctrl_key, shift_key, **_kwargs|
|
31
|
+
mods = [ctrl_key ? "control" : nil, shift_key ? "shift" : nil].compact.join("_")
|
32
|
+
@callback&.call(x, y, mods)
|
33
|
+
end
|
34
|
+
when "click"
|
35
|
+
# Click has block params button, left, top
|
36
|
+
# button is the button number, left and top are coords
|
37
|
+
@unsub_id = bind_self_event("click") do |button, x, y, **_kwargs|
|
38
|
+
@callback&.call(button, x, y)
|
39
|
+
end
|
40
|
+
else
|
41
|
+
raise "Unknown Shoes API call #{shoes_api_name.inspect} passed to SubscriptionItem!"
|
42
|
+
end
|
43
|
+
|
44
|
+
@unsub_id = bind_self_event(shoes_api_name) do |*args|
|
45
|
+
@callback&.call(*args)
|
46
|
+
end
|
47
|
+
|
48
|
+
# This won't create a visible display widget, but will turn into
|
49
|
+
# an invisible widget and a stream of events.
|
50
|
+
create_display_widget
|
51
|
+
end
|
52
|
+
|
53
|
+
def destroy
|
54
|
+
# TODO: we need a better way to do this automatically. See https://github.com/scarpe-team/scarpe/issues/291
|
55
|
+
unsub_shoes_event(@unsub_id) if @unsub_id
|
56
|
+
@unsub_id = nil
|
57
|
+
|
58
|
+
super
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,236 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "tempfile"
|
4
|
+
require "json"
|
5
|
+
require "fileutils"
|
6
|
+
|
7
|
+
module Scarpe::Test; end
|
8
|
+
|
9
|
+
# We want test failures set up once *total*, not per Minitest::Test. So an instance var
|
10
|
+
# doesn't do it.
|
11
|
+
ALREADY_SET_UP_LOGGED_TEST_FAILURES = { setup: false }
|
12
|
+
|
13
|
+
# General helpers for general usage
|
14
|
+
# Helpers here should *not* use Webview-specific functionality.
|
15
|
+
# The intention is that these are helpers for various Scarpe display
|
16
|
+
# services that do *not* use Webview.
|
17
|
+
module Scarpe::Test::Helpers
|
18
|
+
def with_tempfile(prefix, contents, dir: Dir.tmpdir)
|
19
|
+
t = Tempfile.new(prefix, dir)
|
20
|
+
t.write(contents)
|
21
|
+
t.flush # Make sure the contents are written out
|
22
|
+
|
23
|
+
yield(t.path)
|
24
|
+
ensure
|
25
|
+
t.close
|
26
|
+
t.unlink
|
27
|
+
end
|
28
|
+
|
29
|
+
# Pass an array of arrays, where each array is of the form:
|
30
|
+
# [prefix, contents, (optional)dir]
|
31
|
+
#
|
32
|
+
# I don't love inlining with_tempfile's contents into here.
|
33
|
+
# But calling it iteratively or recursively was difficult
|
34
|
+
# when I tried it the obvious ways.
|
35
|
+
def with_tempfiles(tf_specs, &block)
|
36
|
+
tempfiles = []
|
37
|
+
tf_specs.each do |prefix, contents, dir|
|
38
|
+
dir ||= Dir.tmpdir
|
39
|
+
t = Tempfile.new(prefix, dir)
|
40
|
+
tempfiles << t
|
41
|
+
t.write(contents)
|
42
|
+
t.flush # Make sure the contents are written out
|
43
|
+
end
|
44
|
+
|
45
|
+
args = tempfiles.map(&:path)
|
46
|
+
yield(args)
|
47
|
+
ensure
|
48
|
+
tempfiles.each do |t|
|
49
|
+
t.close
|
50
|
+
t.unlink
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Temporarily set env vars for the block of code inside
|
55
|
+
def with_env_vars(envs)
|
56
|
+
old_env = {}
|
57
|
+
envs.each do |k, v|
|
58
|
+
old_env[k] = ENV[k]
|
59
|
+
ENV[k] = v
|
60
|
+
end
|
61
|
+
yield
|
62
|
+
ensure
|
63
|
+
old_env.each { |k, v| ENV[k] = v }
|
64
|
+
end
|
65
|
+
|
66
|
+
def assert_include(text, subtext, msg = nil)
|
67
|
+
msg ||= "Expected #{text.inspect} to include #{subtext.inspect}"
|
68
|
+
assert text.include?(subtext), msg
|
69
|
+
end
|
70
|
+
|
71
|
+
def assert_not_include(text, subtext, msg = nil)
|
72
|
+
msg ||= "Expected #{text.inspect} not to include #{subtext.inspect}"
|
73
|
+
assert !text.include?(subtext), msg
|
74
|
+
end
|
75
|
+
|
76
|
+
def assert_html(actual_html, expected_tag, **opts, &block)
|
77
|
+
expected_html = Scarpe::HTML.render do |h|
|
78
|
+
h.public_send(expected_tag, opts, &block)
|
79
|
+
end
|
80
|
+
|
81
|
+
assert_equal expected_html, actual_html
|
82
|
+
end
|
83
|
+
|
84
|
+
# This does a final return of results. If it gets called
|
85
|
+
# multiple times, the test fails because that's not okay.
|
86
|
+
def return_results(result_bool, msg, data = {})
|
87
|
+
result_file = ENV["SCARPE_TEST_RESULTS"] || "./scarpe_results.txt"
|
88
|
+
|
89
|
+
result_structs = [result_bool, msg, data.merge(test_metadata)]
|
90
|
+
if File.exist?(result_file)
|
91
|
+
results_returned = JSON.parse File.read(result_file)
|
92
|
+
end
|
93
|
+
|
94
|
+
# Multiple different sets of results is bad, even if both are passing.
|
95
|
+
if results_returned && results_returned[0..1] != result_structs[0..1]
|
96
|
+
# Just raising here doesn't reliably fail the test.
|
97
|
+
# See: https://github.com/scarpe-team/scarpe/issues/212
|
98
|
+
Scarpe::Logger.logger("Test Results").error("Writing multi-result failure file to #{result_file.inspect}!")
|
99
|
+
|
100
|
+
new_res_data = { first_result: results_returned, second_result: result_structs }.merge(test_metadata)
|
101
|
+
bad_result = [false, "Returned two sets of results!", new_res_data]
|
102
|
+
File.write(result_file, JSON.pretty_generate(bad_result))
|
103
|
+
|
104
|
+
return
|
105
|
+
elsif results_returned
|
106
|
+
Scarpe::Logger.logger("Test Results").warn "Returning identical results twice: #{results_returned.inspect}"
|
107
|
+
end
|
108
|
+
|
109
|
+
Scarpe::Logger.logger("Test Results").debug("Writing results file #{result_file.inspect} to disk!")
|
110
|
+
File.write(result_file, JSON.pretty_generate(result_structs))
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# This test will save extensive logs in case of test failure.
|
115
|
+
# Note that it defines setup/teardown methods. If you want
|
116
|
+
# multiple setup/teardowns from multiple places to happen you
|
117
|
+
# may need to explictly call (e.g. with logged_test_setup/teardown)
|
118
|
+
# to ensure everything you want happens.
|
119
|
+
module Scarpe::Test::LoggedTest
|
120
|
+
LOGGER_DIR = File.expand_path("#{__dir__}/../../logger")
|
121
|
+
|
122
|
+
def file_id
|
123
|
+
"#{self.class.name}_#{self.name}"
|
124
|
+
end
|
125
|
+
|
126
|
+
def logged_test_setup
|
127
|
+
# Make sure test failures will be saved at the end of the run.
|
128
|
+
# Delete stale test failures and logging only the *first* time this is called.
|
129
|
+
set_up_test_failures
|
130
|
+
|
131
|
+
@normal_log_config = Scarpe::Logger.current_log_config
|
132
|
+
Scarpe::Logger.configure_logger(log_config_for_test)
|
133
|
+
|
134
|
+
Scarpe::Logger.logger("LoggedScarpeTest").info("Test: #{self.class.name}##{self.name}")
|
135
|
+
end
|
136
|
+
|
137
|
+
# If you include this module and don't override setup/teardown, everything will
|
138
|
+
# work fine. But if you need more setup/teardown steps, you can do that too.
|
139
|
+
def setup
|
140
|
+
logged_test_setup
|
141
|
+
end
|
142
|
+
|
143
|
+
def logged_test_teardown
|
144
|
+
# Restore previous log config
|
145
|
+
Scarpe::Logger.configure_logger(@normal_log_config)
|
146
|
+
|
147
|
+
if self.failure
|
148
|
+
save_failure_logs
|
149
|
+
else
|
150
|
+
remove_unsaved_logs
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
def teardown
|
155
|
+
logged_test_teardown
|
156
|
+
end
|
157
|
+
|
158
|
+
def log_config_for_test
|
159
|
+
{
|
160
|
+
"default" => ["debug", "logger/test_failure_#{file_id}.log"],
|
161
|
+
|
162
|
+
"WebviewAPI" => ["debug", "logger/test_failure_wv_api_#{file_id}.log"],
|
163
|
+
|
164
|
+
"CatsCradle" => ["debug", "logger/test_failure_catscradle_#{file_id}.log"],
|
165
|
+
|
166
|
+
"DisplayService" => ["debug", "logger/test_failure_events_#{file_id}.log"],
|
167
|
+
"WV::RelayDisplayService" => ["debug", "logger/test_failure_events_#{file_id}.log"],
|
168
|
+
"WV::WebviewDisplayService" => ["debug", "logger/test_failure_events_#{file_id}.log"],
|
169
|
+
"WV::ControlInterface" => ["debug", "logger/test_failure_events_#{file_id}.log"],
|
170
|
+
}
|
171
|
+
end
|
172
|
+
|
173
|
+
# This could be a lot simpler except I want to only update the file list in one place,
|
174
|
+
# log_config_for_test(). Having a single spot should (I hope) make it a lot friendlier to
|
175
|
+
# add more logfiles for different components, logged API objects, etc.
|
176
|
+
def saved_log_files
|
177
|
+
lc = log_config_for_test
|
178
|
+
log_outfiles = lc.values.map { |_level, loc| loc }
|
179
|
+
log_outfiles.select { |s| s.start_with?("logger/") }.map { |s| s.delete_prefix("logger/") }
|
180
|
+
end
|
181
|
+
|
182
|
+
def set_up_test_failures
|
183
|
+
return if ALREADY_SET_UP_LOGGED_TEST_FAILURES[:setup]
|
184
|
+
|
185
|
+
ALREADY_SET_UP_LOGGED_TEST_FAILURES[:setup] = true
|
186
|
+
# Delete stale test failures, if any, before starting the first failure-logged test
|
187
|
+
Dir["#{LOGGER_DIR}/test_failure*.log"].each { |fn| File.unlink(fn) }
|
188
|
+
|
189
|
+
Minitest.after_run do
|
190
|
+
# Print test failure notice to console
|
191
|
+
unless Dir["#{LOGGER_DIR}/test_failure*.out.log"].empty?
|
192
|
+
puts "Some tests have failed! See #{LOGGER_DIR}/test_failure*.out.log for test logs!"
|
193
|
+
end
|
194
|
+
|
195
|
+
# Remove un-saved test logs
|
196
|
+
Dir["#{LOGGER_DIR}/test_failure*.log"].each do |f|
|
197
|
+
next if f.include?(".out.log")
|
198
|
+
|
199
|
+
File.unlink(f) if File.exist?(f)
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
def logfail_out_loc(filepath)
|
205
|
+
# Add a .out prefix before final .log
|
206
|
+
out_loc = filepath.gsub(%r{.log\Z}, ".out.log")
|
207
|
+
|
208
|
+
if out_loc == filepath
|
209
|
+
raise "Something is wrong! Could not figure out failure-log output path for #{filepath.inspect}!"
|
210
|
+
end
|
211
|
+
|
212
|
+
if File.exist?(out_loc)
|
213
|
+
raise "Duplicate test file #{out_loc.inspect}? This file should *not* already exist!"
|
214
|
+
end
|
215
|
+
|
216
|
+
out_loc
|
217
|
+
end
|
218
|
+
|
219
|
+
def save_failure_logs
|
220
|
+
saved_log_files.each do |log_file|
|
221
|
+
full_loc = File.expand_path("#{LOGGER_DIR}/#{log_file}")
|
222
|
+
# TODO: we'd like to skip 0-length logfiles. But also Logging doesn't flush. For now, ignore.
|
223
|
+
next unless File.exist?(full_loc)
|
224
|
+
|
225
|
+
FileUtils.mv full_loc, logfail_out_loc(full_loc)
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
def remove_unsaved_logs
|
230
|
+
Dir["#{LOGGER_DIR}/test_failure*.log"].each do |f|
|
231
|
+
next if f.include?(".out.log") # Don't delete saved logs
|
232
|
+
|
233
|
+
File.unlink(f)
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
data/lib/scarpe/video.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "colors"
|
4
|
+
require "shoes/widget"
|
5
|
+
require "shoes/app"
|
6
|
+
|
7
|
+
require_relative "spacing"
|
8
|
+
require_relative "background"
|
9
|
+
require_relative "border"
|
10
|
+
require_relative "star"
|
11
|
+
|
12
|
+
require_relative "fill"
|
13
|
+
require_relative "font"
|
14
|
+
|
15
|
+
require_relative "slot"
|
16
|
+
require_relative "para"
|
17
|
+
require_relative "stack"
|
18
|
+
require_relative "flow"
|
19
|
+
require_relative "document_root"
|
20
|
+
require_relative "download"
|
21
|
+
require_relative "subscription_item"
|
22
|
+
require_relative "button"
|
23
|
+
require_relative "image"
|
24
|
+
require_relative "edit_box"
|
25
|
+
require_relative "edit_line"
|
26
|
+
require_relative "list_box"
|
27
|
+
require_relative "alert"
|
28
|
+
require_relative "span"
|
29
|
+
require_relative "shape"
|
30
|
+
require_relative "arc"
|
31
|
+
|
32
|
+
require "shoes/text_widget"
|
33
|
+
require_relative "link"
|
34
|
+
require_relative "line"
|
35
|
+
require_relative "video"
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Scarpe
|
4
|
+
class WebviewAlert < WebviewWidget
|
5
|
+
def initialize(properties)
|
6
|
+
super
|
7
|
+
|
8
|
+
bind("click") do
|
9
|
+
send_self_event(event_name: "click")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def element
|
14
|
+
onclick = handler_js_code("click")
|
15
|
+
|
16
|
+
HTML.render do |h|
|
17
|
+
h.div(id: html_id, style: overlay_style) do
|
18
|
+
h.div(style: modal_style) do
|
19
|
+
h.div(style: text_style) { @text }
|
20
|
+
h.button(style: button_style, onclick: onclick) { "OK" }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def overlay_style
|
29
|
+
{
|
30
|
+
position: "fixed",
|
31
|
+
top: "0",
|
32
|
+
left: "0",
|
33
|
+
width: "100%",
|
34
|
+
height: "100%",
|
35
|
+
overflow: "auto",
|
36
|
+
"z-index": "1",
|
37
|
+
background: "rgba(0,0,0,0.4)",
|
38
|
+
display: "flex",
|
39
|
+
"align-items": "center",
|
40
|
+
"justify-content": "center",
|
41
|
+
}
|
42
|
+
end
|
43
|
+
|
44
|
+
def modal_style
|
45
|
+
{
|
46
|
+
"min-width": "200px",
|
47
|
+
"min-height": "50px",
|
48
|
+
padding: "10px",
|
49
|
+
display: "flex",
|
50
|
+
background: "#fefefe",
|
51
|
+
"flex-direction": "column",
|
52
|
+
"justify-content": "space-between",
|
53
|
+
"border-radius": "9px",
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
def text_style
|
58
|
+
{}
|
59
|
+
end
|
60
|
+
|
61
|
+
def button_style
|
62
|
+
{}
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Scarpe
|
4
|
+
# Scarpe::WebviewApp must only be used from the main thread, due to GTK+ limitations.
|
5
|
+
class WebviewApp < WebviewWidget
|
6
|
+
attr_reader :debug
|
7
|
+
attr_reader :control_interface
|
8
|
+
|
9
|
+
attr_writer :shoes_linkable_id
|
10
|
+
|
11
|
+
def initialize(properties)
|
12
|
+
super
|
13
|
+
|
14
|
+
# It's possible to provide a Ruby script by setting
|
15
|
+
# SCARPE_TEST_CONTROL to its file path. This can
|
16
|
+
# allow pre-setting test options or otherwise
|
17
|
+
# performing additional actions not written into
|
18
|
+
# the Shoes app itself.
|
19
|
+
#
|
20
|
+
# The control interface is what lets these files see
|
21
|
+
# events, specify overrides and so on.
|
22
|
+
@control_interface = ControlInterface.new
|
23
|
+
if ENV["SCARPE_TEST_CONTROL"]
|
24
|
+
require "scarpe/unit_test_helpers"
|
25
|
+
@control_interface.instance_eval File.read(ENV["SCARPE_TEST_CONTROL"])
|
26
|
+
end
|
27
|
+
|
28
|
+
# TODO: rename @view
|
29
|
+
@view = Scarpe::WebWrangler.new title: @title,
|
30
|
+
width: @width,
|
31
|
+
height: @height,
|
32
|
+
resizable: @resizable,
|
33
|
+
debug: @debug
|
34
|
+
|
35
|
+
@callbacks = {}
|
36
|
+
|
37
|
+
# The control interface has to exist to get callbacks like "override Scarpe app opts".
|
38
|
+
# But the Scarpe App needs those options to be created. So we can't pass these to
|
39
|
+
# ControlInterface.new.
|
40
|
+
@control_interface.set_system_components app: self, doc_root: nil, wrangler: @view
|
41
|
+
|
42
|
+
bind_shoes_event(event_name: "init") { init }
|
43
|
+
bind_shoes_event(event_name: "run") { run }
|
44
|
+
bind_shoes_event(event_name: "destroy") { destroy }
|
45
|
+
end
|
46
|
+
|
47
|
+
attr_writer :document_root
|
48
|
+
|
49
|
+
def init
|
50
|
+
scarpe_app = self
|
51
|
+
|
52
|
+
@view.init_code("scarpeInit") do
|
53
|
+
request_redraw!
|
54
|
+
end
|
55
|
+
|
56
|
+
@view.bind("scarpeHandler") do |*args|
|
57
|
+
handle_callback(*args)
|
58
|
+
end
|
59
|
+
|
60
|
+
@view.bind("scarpeExit") do
|
61
|
+
scarpe_app.destroy
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def run
|
66
|
+
@control_interface.dispatch_event(:init)
|
67
|
+
|
68
|
+
# This takes control of the main thread and never returns. And it *must* be run from
|
69
|
+
# the main thread. And it stops any Ruby background threads.
|
70
|
+
# That's totally cool and normal, right?
|
71
|
+
@view.run
|
72
|
+
end
|
73
|
+
|
74
|
+
def destroy
|
75
|
+
if @document_root || @view
|
76
|
+
@control_interface.dispatch_event :shutdown
|
77
|
+
end
|
78
|
+
@document_root = nil
|
79
|
+
if @view
|
80
|
+
@view.destroy
|
81
|
+
@view = nil
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# All JS callbacks to Scarpe widgets are dispatched
|
86
|
+
# via this handler
|
87
|
+
def handle_callback(name, *args)
|
88
|
+
@callbacks[name].call(*args)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Bind a Scarpe callback name; see handle_callback above.
|
92
|
+
# See Scarpe::Widget for how the naming is set up
|
93
|
+
def bind(name, &block)
|
94
|
+
@callbacks[name] = block
|
95
|
+
end
|
96
|
+
|
97
|
+
def request_redraw!
|
98
|
+
wrangler = WebviewDisplayService.instance.wrangler
|
99
|
+
if wrangler.is_running
|
100
|
+
wrangler.replace(@document_root.to_html)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "shape_helper"
|
4
|
+
|
5
|
+
class Scarpe
|
6
|
+
class WebviewArc < Scarpe::WebviewWidget
|
7
|
+
include ShapeHelper
|
8
|
+
def initialize(properties)
|
9
|
+
super(properties)
|
10
|
+
end
|
11
|
+
|
12
|
+
def element(&block)
|
13
|
+
HTML.render do |h|
|
14
|
+
h.div(id: html_id, style: style) do
|
15
|
+
h.svg(width: @width, height: @height) do
|
16
|
+
h.path(d: arc_path)
|
17
|
+
end
|
18
|
+
block.call(h) if block_given?
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def style
|
26
|
+
{
|
27
|
+
left: "#{@left}px",
|
28
|
+
top: "#{@top}px",
|
29
|
+
width: "#{@width}px",
|
30
|
+
height: "#{@height}px",
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
def arc_path
|
35
|
+
center_x = @width / 2
|
36
|
+
center_y = @height / 2
|
37
|
+
radius_x = @width / 2
|
38
|
+
radius_y = @height / 2
|
39
|
+
start_angle_degrees = radians_to_degrees(@angle1) % 360
|
40
|
+
end_angle_degrees = radians_to_degrees(@angle2) % 360
|
41
|
+
large_arc_flag = (end_angle_degrees - start_angle_degrees) % 360 > 180 ? 1 : 0
|
42
|
+
|
43
|
+
"M#{center_x} #{center_y} L#{@width} #{center_y} " \
|
44
|
+
"A#{radius_x} #{radius_y} 0 #{large_arc_flag} 0 " \
|
45
|
+
"#{center_x + radius_x * Math.cos(degrees_to_radians(end_angle_degrees))} " \
|
46
|
+
"#{center_y + radius_y * Math.sin(degrees_to_radians(end_angle_degrees))} Z"
|
47
|
+
end
|
48
|
+
|
49
|
+
def degrees_to_radians(degrees)
|
50
|
+
degrees * Math::PI / 180
|
51
|
+
end
|
52
|
+
|
53
|
+
def radians_to_degrees(radians)
|
54
|
+
radians * (180.0 / Math::PI)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|