scarpe 0.2.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +7 -1
- data/.yardopts +1 -0
- data/CHANGELOG.md +52 -6
- data/Gemfile +2 -1
- data/Gemfile.lock +20 -6
- data/LICENSE.txt +7 -1
- data/README.md +100 -21
- data/Rakefile +68 -1
- data/examples/Edit_box_Styles.rb +8 -0
- data/examples/Kerning.rb +7 -0
- data/examples/animate.rb +20 -0
- data/examples/arrow.rb +10 -0
- data/examples/border.rb +11 -0
- data/examples/btn_tooltip.rb +7 -0
- data/examples/button_style_changed.rb +7 -0
- data/examples/button_styles_default.rb +6 -0
- data/examples/check.rb +2 -0
- data/examples/download_and_show_image.rb +3 -0
- data/examples/flags/finland.rb +15 -0
- data/examples/flags/italy.rb +11 -0
- data/examples/flags/mauritius.rb +14 -0
- data/examples/font_family.rb +17 -0
- data/examples/font_shorthand.rb +9 -0
- data/examples/gen.rb +12 -8
- data/examples/highlander.rb +3 -3
- data/examples/legacy/README.md +6 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/shoes-notes.rb +1 -1
- data/examples/legacy/not_checked/shoes-manual/append.rb +10 -0
- data/examples/legacy/not_checked/shoes-manual/background_change.rb +12 -0
- data/examples/legacy/not_checked/shoes-manual/background_pattern.rb +5 -0
- data/examples/legacy/not_checked/shoes-manual/basic_app.rb +8 -0
- data/examples/legacy/not_checked/shoes-manual/border.rb +9 -0
- data/examples/legacy/not_checked/shoes-manual/builtins/FONTS.rb +5 -0
- data/examples/legacy/not_checked/shoes-manual/builtins/ask.rb +2 -0
- data/examples/legacy/not_checked/shoes-manual/builtins/ask_color.rb +5 -0
- data/examples/legacy/not_checked/shoes-manual/builtins/ask_open_file.rb +5 -0
- data/examples/legacy/not_checked/shoes-manual/builtins/ask_save_folder.rb +2 -0
- data/examples/legacy/not_checked/shoes-manual/builtins/confirm.rb +4 -0
- data/examples/legacy/not_checked/shoes-manual/builtins/debug.rb +2 -0
- data/examples/legacy/not_checked/shoes-manual/builtins/info.rb +3 -0
- data/examples/legacy/not_checked/shoes-manual/button.rb +9 -0
- data/examples/legacy/not_checked/shoes-manual/clear.rb +7 -0
- data/examples/legacy/not_checked/shoes-manual/custom_header.rb +13 -0
- data/examples/legacy/not_checked/shoes-manual/displace.rb +14 -0
- data/examples/legacy/not_checked/shoes-manual/edit_box.rb +8 -0
- data/examples/legacy/not_checked/shoes-manual/fill_pattern.rb +5 -0
- data/examples/legacy/not_checked/shoes-manual/fonts.rb +7 -0
- data/examples/legacy/not_checked/shoes-manual/gutter.rb +6 -0
- data/examples/legacy/not_checked/shoes-manual/image_web.rb +4 -0
- data/examples/legacy/not_checked/shoes-manual/keypress.rb +7 -0
- data/examples/legacy/not_checked/shoes-manual/list_box.rb +10 -0
- data/examples/legacy/not_checked/shoes-manual/motion.rb +10 -0
- data/examples/legacy/not_checked/shoes-manual/mouse.rb +8 -0
- data/examples/legacy/not_checked/shoes-manual/move.rb +14 -0
- data/examples/legacy/not_checked/shoes-manual/nested_ovals.rb +8 -0
- data/examples/legacy/not_checked/shoes-manual/oval.rb +7 -0
- data/examples/legacy/not_checked/shoes-manual/ovals.rb +6 -0
- data/examples/legacy/not_checked/shoes-manual/ovals_image.rb +8 -0
- data/examples/legacy/not_checked/shoes-manual/prepend.rb +7 -0
- data/examples/legacy/not_checked/shoes-manual/progress_bar.rb +10 -0
- data/examples/legacy/not_checked/shoes-manual/radio.rb +18 -0
- data/examples/legacy/not_checked/shoes-manual/radio_alternative_1.rb +7 -0
- data/examples/legacy/not_checked/shoes-manual/radio_alternative_2.rb +9 -0
- data/examples/legacy/not_checked/shoes-manual/rotate_rectangle.rb +6 -0
- data/examples/legacy/not_checked/shoes-manual/shape.rb +11 -0
- data/examples/legacy/not_checked/shoes-manual/static/avatar.png +0 -0
- data/examples/legacy/not_checked/shoes-manual/stroke.rb +5 -0
- data/examples/legacy/not_checked/shoes-manual/style.rb +3 -0
- data/examples/legacy/not_checked/shoes-manual/style_alternative_1.rb +4 -0
- data/examples/legacy/not_checked/shoes-manual/style_alternative_2.rb +5 -0
- data/examples/legacy/not_checked/shoes-manual/style_length.rb +5 -0
- data/examples/legacy/not_checked/shoes-manual/timer.rb +6 -0
- data/examples/legacy/not_checked/shoes-manual/trigger_window.rb +8 -0
- data/examples/legacy/not_checked/shoes-manual/window_owner.rb +8 -0
- data/examples/legacy/not_checked/simple/anim-shapes.rb +1 -1
- data/examples/legacy/not_checked/speedometer_app.rb +55 -0
- data/examples/legacy/working/shoes_manual/alert_button.rb +2 -0
- data/examples/legacy/working/shoes_manual/animate.rb +7 -0
- data/examples/legacy/working/shoes_manual/background_para.rb +4 -0
- data/examples/legacy/working/shoes_manual/button_alternative.rb +7 -0
- data/examples/legacy/working/shoes_manual/checkbox.rb +17 -0
- data/examples/legacy/working/shoes_manual/download.rb +12 -0
- data/examples/legacy/working/shoes_manual/edit_box.rb +6 -0
- data/examples/legacy/working/shoes_manual/editline.rb +7 -0
- data/examples/legacy/working/shoes_manual/fixed_height.rb +8 -0
- data/examples/legacy/working/shoes_manual/fixed_width.rb +12 -0
- data/examples/legacy/working/shoes_manual/image.rb +5 -0
- data/examples/legacy/working/shoes_manual/instance_variable_check.rb +10 -0
- data/examples/legacy/working/shoes_manual/message.rb +18 -0
- data/examples/legacy/working/shoes_manual/rectangle.rb +6 -0
- data/examples/legacy/working/shoes_manual/save_download.rb +12 -0
- data/examples/legacy/working/shoes_manual/self_check.rb +10 -0
- data/examples/legacy/working/shoes_manual/stack.rb +7 -0
- data/examples/legacy/working/shoes_manual/style_info.rb +8 -0
- data/examples/legacy/working/shoes_manual/utf8_support.rb +8 -0
- data/examples/legacy/working/shoes_manual/width.rb +4 -0
- data/examples/legacy/working/simple/image-icon.rb +3 -0
- data/examples/legacy/{not_checked → working}/simple/image.rb +1 -1
- data/examples/list_box_choose.rb +17 -0
- data/examples/local_assets/local_file_server.rb +82 -0
- data/examples/local_assets/multi_image.rb +5 -0
- data/examples/local_assets/sample.gif +0 -0
- data/examples/local_assets/sample.mp4 +0 -0
- data/examples/local_assets/small.png +0 -0
- data/examples/local_fonts.rb +5 -2
- data/examples/local_images.rb +2 -3
- data/examples/margin.rb +13 -0
- data/examples/margin_check.rb +27 -0
- data/examples/oval-with-kwargs.rb +3 -0
- data/examples/oval.rb +26 -0
- data/examples/para/para_text.rb +14 -0
- data/examples/para_font_styles.rb +17 -0
- data/examples/para_font_variant.rb +6 -0
- data/examples/para_fontweight.rb +13 -0
- data/examples/parse_xl_funnies.rb +3 -0
- data/examples/progress.rb +31 -0
- data/examples/radio/radio_groups.rb +2 -2
- data/examples/rect.rb +4 -0
- data/examples/rotate_shapes.rb +17 -0
- data/examples/scarpe_ext.rb +3 -0
- data/examples/shapes/star.rb +1 -3
- data/examples/simpler-menu.rb +21 -0
- data/examples/spacing.rb +1 -1
- data/examples/span.rb +4 -2
- data/exe/scarpe +2 -1
- data/lacci/Gemfile +2 -0
- data/lacci/Gemfile.lock +8 -1
- data/lacci/lacci.gemspec +2 -2
- data/lacci/lib/lacci/scarpe_cli.rb +2 -2
- data/lacci/lib/lacci/scarpe_core.rb +2 -1
- data/lacci/lib/lacci/version.rb +1 -1
- data/lacci/lib/scarpe/niente/app.rb +23 -0
- data/lacci/lib/scarpe/niente/display_service.rb +66 -0
- data/lacci/lib/scarpe/niente/drawable.rb +59 -0
- data/lacci/lib/scarpe/niente/shoes_spec.rb +93 -0
- data/lacci/lib/scarpe/niente.rb +32 -0
- data/lacci/lib/shoes/app.rb +111 -72
- data/lacci/lib/shoes/background.rb +2 -2
- data/lacci/lib/shoes/border.rb +2 -2
- data/lacci/lib/shoes/builtins.rb +63 -0
- data/lacci/lib/shoes/changelog.rb +52 -0
- data/lacci/lib/shoes/colors.rb +3 -1
- data/lacci/lib/shoes/constants.rb +41 -2
- data/lacci/lib/shoes/display_service.rb +80 -18
- data/lacci/lib/shoes/download.rb +2 -2
- data/lacci/lib/shoes/drawable.rb +654 -0
- data/lacci/lib/shoes/drawables/arc.rb +27 -0
- data/lacci/lib/shoes/drawables/arrow.rb +21 -0
- data/lacci/lib/shoes/drawables/border.rb +28 -0
- data/lacci/lib/shoes/drawables/button.rb +57 -0
- data/lacci/lib/shoes/drawables/check.rb +33 -0
- data/lacci/lib/shoes/drawables/document_root.rb +20 -0
- data/lacci/lib/shoes/{widgets → drawables}/edit_box.rb +9 -8
- data/lacci/lib/shoes/{widgets → drawables}/edit_line.rb +8 -7
- data/lacci/lib/shoes/drawables/flow.rb +20 -0
- data/lacci/lib/shoes/drawables/font_helper.rb +62 -0
- data/lacci/lib/shoes/{widgets → drawables}/image.rb +7 -7
- data/lacci/lib/shoes/drawables/line.rb +17 -0
- data/lacci/lib/shoes/drawables/link.rb +31 -0
- data/lacci/lib/shoes/drawables/list_box.rb +59 -0
- data/lacci/lib/shoes/drawables/oval.rb +48 -0
- data/lacci/lib/shoes/drawables/para.rb +206 -0
- data/lacci/lib/shoes/drawables/progress.rb +15 -0
- data/lacci/lib/shoes/drawables/radio.rb +35 -0
- data/lacci/lib/shoes/drawables/rect.rb +18 -0
- data/lacci/lib/shoes/{widgets → drawables}/shape.rb +8 -8
- data/lacci/lib/shoes/drawables/slot.rb +178 -0
- data/lacci/lib/shoes/drawables/stack.rb +21 -0
- data/lacci/lib/shoes/drawables/star.rb +28 -0
- data/lacci/lib/shoes/drawables/subscription_item.rb +93 -0
- data/lacci/lib/shoes/drawables/text_drawable.rb +122 -0
- data/lacci/lib/shoes/drawables/video.rb +17 -0
- data/lacci/lib/shoes/drawables/widget.rb +74 -0
- data/lacci/lib/shoes/drawables.rb +32 -0
- data/lacci/lib/shoes/errors.rb +38 -0
- data/lacci/lib/shoes/log.rb +2 -2
- data/lacci/lib/shoes/margin_helper.rb +79 -0
- data/lacci/lib/shoes/ruby_extensions.rb +15 -0
- data/lacci/lib/shoes-spec.rb +93 -0
- data/lacci/lib/shoes.rb +31 -10
- data/lacci/test/.gitignore +1 -0
- data/lacci/test/test_draw_context.rb +167 -0
- data/lacci/test/test_font_helper.rb +57 -0
- data/lacci/test/test_helper.rb +81 -0
- data/lacci/test/test_lacci.rb +99 -3
- data/lacci/test/test_margin_helper.rb +82 -0
- data/lacci/test/test_niente_test_infra.rb +26 -0
- data/lacci/test/test_oval.rb +82 -0
- data/lacci/test/test_parenting.rb +140 -0
- data/lacci/test/test_shoes_errors.rb +49 -0
- data/lacci/test/test_text_drawables.rb +23 -0
- data/lib/scarpe/assets.rb +18 -0
- data/lib/scarpe/cats_cradle.rb +84 -103
- data/lib/scarpe/errors.rb +77 -0
- data/lib/scarpe/shoes_spec.rb +160 -0
- data/lib/scarpe/version.rb +2 -2
- data/lib/scarpe/wv/app.rb +21 -20
- data/lib/scarpe/wv/arc.rb +4 -51
- data/lib/scarpe/wv/arrow.rb +9 -0
- data/lib/scarpe/wv/border.rb +9 -18
- data/lib/scarpe/wv/button.rb +7 -35
- data/lib/scarpe/wv/check.rb +3 -5
- data/lib/scarpe/wv/control_interface.rb +20 -30
- data/lib/scarpe/wv/document_root.rb +81 -4
- data/lib/scarpe/wv/{widget.rb → drawable.rb} +71 -82
- data/lib/scarpe/wv/edit_box.rb +8 -18
- data/lib/scarpe/wv/edit_line.rb +9 -20
- data/lib/scarpe/wv/flow.rb +2 -18
- data/lib/scarpe/wv/image.rb +7 -30
- data/lib/scarpe/wv/line.rb +3 -25
- data/lib/scarpe/wv/link.rb +6 -17
- data/lib/scarpe/wv/list_box.rb +6 -29
- data/lib/scarpe/wv/oval.rb +13 -0
- data/lib/scarpe/wv/para.rb +12 -30
- data/lib/scarpe/wv/progress.rb +19 -0
- data/lib/scarpe/wv/radio.rb +9 -10
- data/lib/scarpe/wv/rect.rb +13 -0
- data/lib/scarpe/wv/scarpe_extensions.rb +8 -0
- data/lib/scarpe/wv/shape.rb +13 -13
- data/lib/scarpe/wv/slot.rb +8 -25
- data/lib/scarpe/wv/stack.rb +2 -18
- data/lib/scarpe/wv/star.rb +3 -53
- data/lib/scarpe/wv/subscription_item.rb +38 -4
- data/lib/scarpe/wv/text_drawable.rb +90 -0
- data/lib/scarpe/wv/video.rb +15 -15
- data/lib/scarpe/wv/web_wrangler.rb +320 -328
- data/lib/scarpe/wv/webview_local_display.rb +52 -33
- data/lib/scarpe/wv/webview_relay_display.rb +12 -12
- data/lib/scarpe/wv/webview_relay_util.rb +7 -10
- data/lib/scarpe/wv/wv_display_worker.rb +2 -2
- data/lib/scarpe/wv.rb +52 -12
- data/lib/scarpe/wv_local.rb +1 -1
- data/lib/scarpe/wv_relay.rb +1 -1
- data/lib/scarpe.rb +1 -0
- data/logger/debug_web_wrangler.json +1 -1
- data/logger/scarpe_wv_test.json +1 -1
- data/scarpe-components/Gemfile +4 -1
- data/scarpe-components/Gemfile.lock +85 -0
- data/scarpe-components/README.md +2 -2
- data/scarpe-components/assets/bootstrap-themes/bootstrap-cerulean.css +12229 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-cosmo.css +11810 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-cyborg.css +12210 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-darkly.css +12153 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-flatly.css +12126 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-icons.min.css +5 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-journal.css +12099 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-litera.css +12211 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-lumen.css +12369 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-lux.css +11928 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-materia.css +13184 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-minty.css +12177 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-morph.css +12750 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-pulse.css +11890 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-quartz.css +12622 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-sandstone.css +12201 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-simplex.css +12186 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-sketchy.css +12451 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-slate.css +12492 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-solar.css +12149 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-spacelab.css +12266 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-superhero.css +12216 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-united.css +12077 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-vapor.css +12549 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-yeti.css +12325 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap-zephyr.css +12283 -0
- data/scarpe-components/assets/bootstrap-themes/bootstrap.bundle.min.js +7 -0
- data/scarpe-components/lib/scarpe/components/asset_server.rb +219 -0
- data/scarpe-components/lib/scarpe/components/base64.rb +23 -5
- data/scarpe-components/lib/scarpe/components/calzini/alert.rb +49 -0
- data/scarpe-components/lib/scarpe/components/calzini/art_drawables.rb +227 -0
- data/scarpe-components/lib/scarpe/components/calzini/border.rb +38 -0
- data/scarpe-components/lib/scarpe/components/calzini/button.rb +37 -0
- data/scarpe-components/lib/scarpe/components/calzini/misc.rb +136 -0
- data/scarpe-components/lib/scarpe/components/calzini/para.rb +237 -0
- data/scarpe-components/lib/scarpe/components/calzini/slots.rb +109 -0
- data/scarpe-components/lib/scarpe/components/calzini.rb +236 -0
- data/scarpe-components/lib/scarpe/components/errors.rb +24 -0
- data/scarpe-components/lib/scarpe/components/file_helpers.rb +1 -0
- data/scarpe-components/lib/scarpe/components/html.rb +134 -0
- data/scarpe-components/lib/scarpe/components/minitest_export_reporter.rb +83 -0
- data/scarpe-components/lib/scarpe/components/minitest_import_runnable.rb +98 -0
- data/scarpe-components/lib/scarpe/components/minitest_result.rb +127 -0
- data/scarpe-components/lib/scarpe/components/modular_logger.rb +5 -5
- data/scarpe-components/lib/scarpe/components/print_logger.rb +22 -3
- data/scarpe-components/lib/scarpe/components/process_helpers.rb +37 -0
- data/scarpe-components/lib/scarpe/components/promises.rb +14 -14
- data/scarpe-components/lib/scarpe/components/segmented_file_loader.rb +36 -17
- data/scarpe-components/lib/scarpe/components/string_helpers.rb +10 -0
- data/scarpe-components/lib/scarpe/components/tiranti.rb +167 -0
- data/scarpe-components/lib/scarpe/components/unit_test_helpers.rb +48 -6
- data/scarpe-components/lib/scarpe/components/version.rb +2 -2
- data/scarpe-components/test/assets/big-image.png +0 -0
- data/scarpe-components/test/assets/big-stylesheet.css +497 -0
- data/scarpe-components/test/assets/little-image.png +0 -0
- data/scarpe-components/test/assets/little-stylesheet.css +1 -0
- data/scarpe-components/test/calzini/test_calzini_alert.rb +30 -0
- data/scarpe-components/test/calzini/test_calzini_art_drawables.rb +105 -0
- data/scarpe-components/test/calzini/test_calzini_button.rb +54 -0
- data/scarpe-components/test/calzini/test_calzini_misc.rb +115 -0
- data/scarpe-components/test/calzini/test_calzini_para.rb +34 -0
- data/scarpe-components/test/calzini/test_calzini_slots.rb +85 -0
- data/scarpe-components/test/calzini/test_calzini_text_drawables.rb +106 -0
- data/scarpe-components/test/calzini/test_various.rb +133 -0
- data/scarpe-components/test/mtr_data/exception.json +1 -0
- data/scarpe-components/test/mtr_data/fail_with_message.json +1 -0
- data/scarpe-components/test/mtr_data/skipped_no_message.json +1 -0
- data/scarpe-components/test/mtr_data/skipped_w_msg.json +1 -0
- data/scarpe-components/test/mtr_data/succeed_2_asserts.json +1 -0
- data/scarpe-components/test/test_asset_server.rb +72 -0
- data/scarpe-components/test/test_components.rb +31 -2
- data/scarpe-components/test/test_dimensions.rb +26 -0
- data/scarpe-components/test/test_helper.rb +20 -1
- data/scarpe-components/test/test_html.rb +65 -0
- data/scarpe-components/test/test_minitest_result.rb +68 -0
- data/scarpe-components/test/test_promises.rb +5 -4
- data/scarpe-components/test/test_segmented_app_files.rb +10 -6
- data/scarpegen.rb +14 -14
- data/sig/scarpe.rbs +1 -1
- data/tasks/check_html_fixtures.rb +140 -0
- data/tasks/regenerate_html_fixtures.rb +104 -0
- data/templates/basic_class_template.erb +13 -14
- data/templates/class_template_with_event_bind.erb +4 -4
- data/templates/class_template_with_shapes.erb +8 -28
- data/templates/example_template.erb +1 -1
- data/templates/module_template.erb +4 -4
- data/templates/webview_template.erb +3 -2
- metadata +286 -80
- data/examples/legacy/not_checked/shoes-contrib/elements/image-icon.rb +0 -3
- data/lacci/lib/shoes/spacing.rb +0 -9
- data/lacci/lib/shoes/widget.rb +0 -218
- data/lacci/lib/shoes/widgets/alert.rb +0 -19
- data/lacci/lib/shoes/widgets/arc.rb +0 -51
- data/lacci/lib/shoes/widgets/button.rb +0 -35
- data/lacci/lib/shoes/widgets/check.rb +0 -28
- data/lacci/lib/shoes/widgets/document_root.rb +0 -20
- data/lacci/lib/shoes/widgets/flow.rb +0 -22
- data/lacci/lib/shoes/widgets/font.rb +0 -14
- data/lacci/lib/shoes/widgets/line.rb +0 -18
- data/lacci/lib/shoes/widgets/link.rb +0 -25
- data/lacci/lib/shoes/widgets/list_box.rb +0 -25
- data/lacci/lib/shoes/widgets/para.rb +0 -68
- data/lacci/lib/shoes/widgets/radio.rb +0 -35
- data/lacci/lib/shoes/widgets/slot.rb +0 -75
- data/lacci/lib/shoes/widgets/span.rb +0 -26
- data/lacci/lib/shoes/widgets/stack.rb +0 -24
- data/lacci/lib/shoes/widgets/star.rb +0 -44
- data/lacci/lib/shoes/widgets/subscription_item.rb +0 -60
- data/lacci/lib/shoes/widgets/text_widget.rb +0 -51
- data/lacci/lib/shoes/widgets/video.rb +0 -15
- data/lacci/lib/shoes/widgets.rb +0 -29
- data/lib/scarpe/evented_assertions.rb +0 -88
- data/lib/scarpe/wv/alert.rb +0 -66
- data/lib/scarpe/wv/background.rb +0 -27
- data/lib/scarpe/wv/control_interface_test.rb +0 -238
- data/lib/scarpe/wv/dimensions.rb +0 -22
- data/lib/scarpe/wv/font.rb +0 -36
- data/lib/scarpe/wv/html.rb +0 -108
- data/lib/scarpe/wv/spacing.rb +0 -41
- data/lib/scarpe/wv/span.rb +0 -68
- data/lib/scarpe/wv/text_widget.rb +0 -30
- /data/examples/legacy/not_checked/{expert → shoes-contrib/basic}/definr.rb +0 -0
- /data/examples/legacy/not_checked/{expert → shoes-contrib/basic}/funnies.rb +0 -0
- /data/examples/legacy/not_checked/shoes-contrib/{elements → basic}/list_box-select-class.rb +0 -0
- /data/examples/legacy/{not_checked → working}/shoes3-tests/editline/editline.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/basic → working/simple}/basic-edit-box.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/elements → working/simple}/basic-fps.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/elements → working/simple}/border-cat.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/elements → working/simple}/check-mate.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/manipulation → working/simple}/clear-slot.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/basic → working/simple}/clock.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/basic → working/simple}/gradient-shoes.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/basic → working/simple}/list_box-shape-report.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/elements → working/simple}/list_box.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/elements → working/simple}/phat-button.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib → working}/simple/simple-calc.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/position → working/simple}/stack-width.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/elements → working/simple}/width-introspec.rb +0 -0
@@ -1,24 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Shoes
|
4
|
-
class Stack < Shoes::Slot
|
5
|
-
include Shoes::Background
|
6
|
-
include Shoes::Border
|
7
|
-
include Shoes::Spacing
|
8
|
-
|
9
|
-
# TODO: sort out various margin and padding properties, including putting stuff into spacing
|
10
|
-
display_properties :width, :height, :scroll
|
11
|
-
|
12
|
-
def initialize(width: nil, height: nil, margin: nil, padding: nil, scroll: false, margin_top: nil, margin_bottom: nil, margin_left: nil,
|
13
|
-
margin_right: nil, **options, &block)
|
14
|
-
|
15
|
-
@options = options
|
16
|
-
|
17
|
-
super
|
18
|
-
|
19
|
-
create_display_widget
|
20
|
-
# Create the display-side widget *before* running the block, which will add child widgets with their display widgets
|
21
|
-
Shoes::App.instance.with_slot(self, &block) if block_given?
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Shoes
|
4
|
-
class Star < Shoes::Widget
|
5
|
-
display_properties :left, :top, :points, :outer, :inner, :draw_context
|
6
|
-
|
7
|
-
def initialize(left, top, points = 10, outer = 100, inner = 50)
|
8
|
-
@points = convert_to_integer(points, "points", 10)
|
9
|
-
@outer = convert_to_float(outer, "outer", 100.0)
|
10
|
-
@inner = convert_to_float(inner, "inner", 50.0)
|
11
|
-
|
12
|
-
@draw_context = Shoes::App.instance.current_draw_context
|
13
|
-
|
14
|
-
super
|
15
|
-
create_display_widget
|
16
|
-
end
|
17
|
-
|
18
|
-
private
|
19
|
-
|
20
|
-
def convert_to_integer(value, attribute_name, default = 0)
|
21
|
-
begin
|
22
|
-
value = Integer(value)
|
23
|
-
raise InvalidAttributeValueError, "Negative num '#{value}' not allowed for attribute '#{attribute_name}'" if value < 0
|
24
|
-
|
25
|
-
value
|
26
|
-
rescue ArgumentError
|
27
|
-
error_message = "Invalid value '#{value}' provided for attribute '#{attribute_name}'. The value should be a number."
|
28
|
-
raise InvalidAttributeValueError, error_message
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def convert_to_float(value, attribute_name, default = 0.0)
|
33
|
-
begin
|
34
|
-
value = Float(value)
|
35
|
-
raise InvalidAttributeValueError, "Negative num '#{value}' not allowed for attribute '#{attribute_name}'" if value < 0
|
36
|
-
|
37
|
-
value
|
38
|
-
rescue ArgumentError
|
39
|
-
error_message = "Invalid value '#{value}' provided for attribute '#{attribute_name}'. The value should be a number."
|
40
|
-
raise InvalidAttributeValueError, error_message
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
@@ -1,60 +0,0 @@
|
|
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 Shoes::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
|
@@ -1,51 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Shoes::TextWidget
|
4
|
-
|
5
|
-
module Shoes
|
6
|
-
class TextWidget < Shoes::Widget
|
7
|
-
class << self
|
8
|
-
# rubocop:disable Lint/MissingSuper
|
9
|
-
def inherited(subclass)
|
10
|
-
Shoes::Widget.widget_classes ||= []
|
11
|
-
Shoes::Widget.widget_classes << subclass
|
12
|
-
end
|
13
|
-
# rubocop:enable Lint/MissingSuper
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
class << self
|
18
|
-
def default_text_widget_with(element)
|
19
|
-
class_name = element.capitalize
|
20
|
-
|
21
|
-
widget_class = Class.new(Shoes::TextWidget) do
|
22
|
-
# Can we just change content to text to match the Shoes API?
|
23
|
-
display_property :content
|
24
|
-
|
25
|
-
def initialize(content)
|
26
|
-
@content = content
|
27
|
-
|
28
|
-
super
|
29
|
-
|
30
|
-
create_display_widget
|
31
|
-
end
|
32
|
-
|
33
|
-
def text
|
34
|
-
self.content
|
35
|
-
end
|
36
|
-
|
37
|
-
def text=(new_text)
|
38
|
-
self.content = new_text
|
39
|
-
end
|
40
|
-
end
|
41
|
-
Shoes.const_set class_name, widget_class
|
42
|
-
widget_class.class_eval do
|
43
|
-
display_property :content
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
Shoes.default_text_widget_with(:code)
|
50
|
-
Shoes.default_text_widget_with(:em)
|
51
|
-
Shoes.default_text_widget_with(:strong)
|
data/lacci/lib/shoes/widgets.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "shoes/widgets/slot"
|
4
|
-
require "shoes/widgets/stack"
|
5
|
-
require "shoes/widgets/flow"
|
6
|
-
require "shoes/widgets/document_root"
|
7
|
-
|
8
|
-
require "shoes/widgets/text_widget"
|
9
|
-
|
10
|
-
require "shoes/widgets/font"
|
11
|
-
require "shoes/widgets/subscription_item"
|
12
|
-
|
13
|
-
require "shoes/widgets/arc"
|
14
|
-
require "shoes/widgets/line"
|
15
|
-
require "shoes/widgets/shape"
|
16
|
-
require "shoes/widgets/star"
|
17
|
-
|
18
|
-
require "shoes/widgets/alert"
|
19
|
-
require "shoes/widgets/button"
|
20
|
-
require "shoes/widgets/check"
|
21
|
-
require "shoes/widgets/edit_box"
|
22
|
-
require "shoes/widgets/edit_line"
|
23
|
-
require "shoes/widgets/image"
|
24
|
-
require "shoes/widgets/link"
|
25
|
-
require "shoes/widgets/list_box"
|
26
|
-
require "shoes/widgets/para"
|
27
|
-
require "shoes/widgets/radio"
|
28
|
-
require "shoes/widgets/span"
|
29
|
-
require "shoes/widgets/video"
|
@@ -1,88 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "tempfile"
|
4
|
-
require "json"
|
5
|
-
require "fileutils"
|
6
|
-
|
7
|
-
module Scarpe::Test; end
|
8
|
-
|
9
|
-
# We need a separate assertion system for the kind of Scarpe
|
10
|
-
# testing where we start a subprocess, perform the assertion
|
11
|
-
# logic in the subprocess, and then run Minitest in the parent.
|
12
|
-
# It's an unusual setup.
|
13
|
-
module Scarpe::Test::EventedAssertions
|
14
|
-
# Assert that `text` includes `subtext`.
|
15
|
-
#
|
16
|
-
# @param text [String] the longer text
|
17
|
-
# @param subtext [String] the text that is asserted to be included
|
18
|
-
# @param msg [String,nil] if supplied, the failure message for the assertion
|
19
|
-
# @return [void]
|
20
|
-
def assert_include(text, subtext, msg = nil)
|
21
|
-
msg ||= "Expected #{text.inspect} to include #{subtext.inspect}"
|
22
|
-
assert text.include?(subtext), msg
|
23
|
-
end
|
24
|
-
|
25
|
-
# Assert that `text` does not include `subtext`.
|
26
|
-
#
|
27
|
-
# @param text [String] the longer text
|
28
|
-
# @param subtext [String] the text that is asserted to not be included
|
29
|
-
# @param msg [String,nil] if supplied, the failure message for the assertion
|
30
|
-
# @return [void]
|
31
|
-
def assert_not_include(text, subtext, msg = nil)
|
32
|
-
msg ||= "Expected #{text.inspect} not to include #{subtext.inspect}"
|
33
|
-
assert !text.include?(subtext), msg
|
34
|
-
end
|
35
|
-
|
36
|
-
# Assert that `actual_html` is the same as `expected_tag` with `opts`.
|
37
|
-
# This uses Scarpe's HTML tag-based renderer to render the tag and options
|
38
|
-
# into text, and valides that the text is the same.
|
39
|
-
#
|
40
|
-
# @see Scarpe::HTML.render
|
41
|
-
#
|
42
|
-
# @param actual_html [String] the html to compare to
|
43
|
-
# @param expected_tag [String,Symbol] the HTML tag, used to send a method call
|
44
|
-
# @param opts keyword options passed to the tag method call
|
45
|
-
# @yield block passed to the tag method call.
|
46
|
-
# @return [void]
|
47
|
-
def assert_html(actual_html, expected_tag, **opts, &block)
|
48
|
-
expected_html = Scarpe::HTML.render do |h|
|
49
|
-
h.public_send(expected_tag, opts, &block)
|
50
|
-
end
|
51
|
-
|
52
|
-
assert_equal expected_html, actual_html
|
53
|
-
end
|
54
|
-
|
55
|
-
# This does a final return of results. If it gets called
|
56
|
-
# multiple times, the test fails because that's not allowed.
|
57
|
-
#
|
58
|
-
# @param result_bool [Boolean] true if the results are success, false if failure
|
59
|
-
# @param msg [String] the message included with the results
|
60
|
-
# @param data [Hash] any additional data to pass with the results
|
61
|
-
# @return void
|
62
|
-
def return_results(result_bool, msg, data = {})
|
63
|
-
result_file = ENV["SCARPE_TEST_RESULTS"] || "./scarpe_results.txt"
|
64
|
-
|
65
|
-
result_structs = [result_bool, msg, data.merge(test_metadata)]
|
66
|
-
if File.exist?(result_file)
|
67
|
-
results_returned = JSON.parse File.read(result_file)
|
68
|
-
end
|
69
|
-
|
70
|
-
# Multiple different sets of results is bad, even if both are passing.
|
71
|
-
if results_returned && results_returned[0..1] != result_structs[0..1]
|
72
|
-
# Just raising here doesn't reliably fail the test.
|
73
|
-
# See: https://github.com/scarpe-team/scarpe/issues/212
|
74
|
-
Shoes::Log.logger("Test Results").error("Writing multi-result failure file to #{result_file.inspect}!")
|
75
|
-
|
76
|
-
new_res_data = { first_result: results_returned, second_result: result_structs }.merge(test_metadata)
|
77
|
-
bad_result = [false, "Returned two sets of results!", new_res_data]
|
78
|
-
File.write(result_file, JSON.pretty_generate(bad_result))
|
79
|
-
|
80
|
-
return
|
81
|
-
elsif results_returned
|
82
|
-
Shoes::Log.logger("Test Results").warn "Returning identical results twice: #{results_returned.inspect}"
|
83
|
-
end
|
84
|
-
|
85
|
-
Shoes::Log.logger("Test Results").debug("Writing results file #{result_file.inspect} to disk!")
|
86
|
-
File.write(result_file, JSON.pretty_generate(result_structs))
|
87
|
-
end
|
88
|
-
end
|
data/lib/scarpe/wv/alert.rb
DELETED
@@ -1,66 +0,0 @@
|
|
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
|
-
protected
|
27
|
-
|
28
|
-
# If the whole widget is hidden, the parent style adds display:none
|
29
|
-
def overlay_style
|
30
|
-
{
|
31
|
-
position: "fixed",
|
32
|
-
top: "0",
|
33
|
-
left: "0",
|
34
|
-
width: "100%",
|
35
|
-
height: "100%",
|
36
|
-
overflow: "auto",
|
37
|
-
"z-index": "1",
|
38
|
-
background: "rgba(0,0,0,0.4)",
|
39
|
-
display: "flex",
|
40
|
-
"align-items": "center",
|
41
|
-
"justify-content": "center",
|
42
|
-
}.merge(style)
|
43
|
-
end
|
44
|
-
|
45
|
-
def modal_style
|
46
|
-
{
|
47
|
-
"min-width": "200px",
|
48
|
-
"min-height": "50px",
|
49
|
-
padding: "10px",
|
50
|
-
display: "flex",
|
51
|
-
background: "#fefefe",
|
52
|
-
"flex-direction": "column",
|
53
|
-
"justify-content": "space-between",
|
54
|
-
"border-radius": "9px",
|
55
|
-
}
|
56
|
-
end
|
57
|
-
|
58
|
-
def text_style
|
59
|
-
{}
|
60
|
-
end
|
61
|
-
|
62
|
-
def button_style
|
63
|
-
{}
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
data/lib/scarpe/wv/background.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "scarpe/components/base64"
|
4
|
-
|
5
|
-
class Scarpe
|
6
|
-
module WebviewBackground
|
7
|
-
include Components::Base64
|
8
|
-
|
9
|
-
def style
|
10
|
-
styles = (super if defined?(super)) || {}
|
11
|
-
return styles unless @background_color
|
12
|
-
|
13
|
-
color = case @background_color
|
14
|
-
when Array
|
15
|
-
"rgba(#{@background_color.join(", ")})"
|
16
|
-
when Range
|
17
|
-
"linear-gradient(45deg, #{@background_color.first}, #{@background_color.last})"
|
18
|
-
when ->(value) { File.exist?(value) }
|
19
|
-
"url(data:image/png;base64,#{encode_file_to_base64(@background_color)})"
|
20
|
-
else
|
21
|
-
@background_color
|
22
|
-
end
|
23
|
-
|
24
|
-
styles.merge(background: color)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,238 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# The ControlInterface doesn't, by default, include much of a test framework.
|
4
|
-
# But writing a test framework in heredocs in test_helper.rb seems bad.
|
5
|
-
# So we write a test framework here, but don't include it by default.
|
6
|
-
# A running shoes app won't normally include it, but unit tests will.
|
7
|
-
|
8
|
-
require "json"
|
9
|
-
|
10
|
-
require "scarpe/components/unit_test_helpers"
|
11
|
-
require "scarpe/evented_assertions"
|
12
|
-
|
13
|
-
class Scarpe
|
14
|
-
DEFAULT_ASSERTION_TIMEOUT = 1.0
|
15
|
-
|
16
|
-
class ControlInterface
|
17
|
-
include Scarpe::Test::EventedAssertions
|
18
|
-
include Scarpe::Test::Helpers
|
19
|
-
|
20
|
-
def timed_out?
|
21
|
-
@did_time_out
|
22
|
-
end
|
23
|
-
|
24
|
-
def die_after(time)
|
25
|
-
t_start = Time.now
|
26
|
-
@die_after = [t_start, time]
|
27
|
-
|
28
|
-
wrangler.periodic_code("scarpeTestTimeout") do |*_args|
|
29
|
-
t_delta = (Time.now - t_start).to_f
|
30
|
-
if t_delta > time
|
31
|
-
@did_time_out = true
|
32
|
-
@log.warn("die_after - timed out after #{t_delta.inspect} (threshold: #{time.inspect})")
|
33
|
-
return_results(false, "Timed out!")
|
34
|
-
app.destroy
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
# This is returned alongside the actual results automatically
|
40
|
-
def test_metadata
|
41
|
-
data = {}
|
42
|
-
if @die_after
|
43
|
-
t_delta = (Time.now - @die_after[0]).to_f
|
44
|
-
data["die_after"] = {
|
45
|
-
t_start: @die_after[0].to_s,
|
46
|
-
threshold: @die_after[1],
|
47
|
-
passed: t_delta,
|
48
|
-
}
|
49
|
-
end
|
50
|
-
data
|
51
|
-
end
|
52
|
-
|
53
|
-
# Need to be able to query widgets in test code
|
54
|
-
|
55
|
-
def all_wv_widgets
|
56
|
-
known = [doc_root]
|
57
|
-
to_check = [doc_root]
|
58
|
-
|
59
|
-
until to_check.empty?
|
60
|
-
next_layer = to_check.flat_map(&:children)
|
61
|
-
known += next_layer
|
62
|
-
to_check = next_layer
|
63
|
-
end
|
64
|
-
|
65
|
-
# I don't *think* we'll ever have widget trees that merge back together, but just in case we'll de-dup
|
66
|
-
known.uniq
|
67
|
-
end
|
68
|
-
|
69
|
-
# Shoes doesn't name widgets. We aren't guaranteed that the Shoes widgets are even in the same
|
70
|
-
# process, since we have the Relay display service for Webview. So mostly we can look by
|
71
|
-
# display service class.
|
72
|
-
def find_wv_widgets(*specifiers)
|
73
|
-
widgets = all_wv_widgets
|
74
|
-
|
75
|
-
specifiers.each do |spec|
|
76
|
-
if spec.is_a?(Class)
|
77
|
-
widgets.select! { |w| spec === w }
|
78
|
-
else
|
79
|
-
raise "I don't know how to search for widgets by #{spec.inspect}!"
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
widgets
|
84
|
-
end
|
85
|
-
|
86
|
-
# We want an assertions library, but one that runs inside the spawned
|
87
|
-
# Webview sub-process.
|
88
|
-
|
89
|
-
# Note that we do *not* extract this assertions library to use elsewhere
|
90
|
-
# because it's very focused on evented assertions that start and stop
|
91
|
-
# over a period of time. Instantaneous procedural asserts don't want to
|
92
|
-
# use this API.
|
93
|
-
|
94
|
-
def return_when_assertions_done
|
95
|
-
assertions_may_exist
|
96
|
-
|
97
|
-
wrangler.periodic_code("scarpeReturnWhenAssertionsDone") do |*_args|
|
98
|
-
if @assertions_pending.empty?
|
99
|
-
success = @assertions_failed.empty?
|
100
|
-
return_results success, "Assertions #{success ? "succeeded" : "failed"}", assertion_data_as_a_struct
|
101
|
-
app.destroy
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
def assertions_may_exist
|
107
|
-
@assertions_pending ||= {}
|
108
|
-
@assertions_failed ||= {}
|
109
|
-
@assertions_passed ||= 0
|
110
|
-
@assertion_counter ||= 0
|
111
|
-
end
|
112
|
-
|
113
|
-
def start_assertion(code)
|
114
|
-
assertions_may_exist
|
115
|
-
|
116
|
-
this_assertion = @assertion_counter
|
117
|
-
@assertion_counter += 1
|
118
|
-
|
119
|
-
@assertions_pending[this_assertion] = {
|
120
|
-
id: this_assertion,
|
121
|
-
code: code,
|
122
|
-
}
|
123
|
-
|
124
|
-
this_assertion
|
125
|
-
end
|
126
|
-
|
127
|
-
def pass_assertion(id)
|
128
|
-
@assertions_pending.delete(id)
|
129
|
-
@assertions_passed += 1
|
130
|
-
end
|
131
|
-
|
132
|
-
def fail_assertion(id, fail_message)
|
133
|
-
item = @assertions_pending.delete(id)
|
134
|
-
item[:fail_message] = fail_message
|
135
|
-
@assertions_failed[id] = item
|
136
|
-
end
|
137
|
-
|
138
|
-
def assertions_pending?
|
139
|
-
!@assertions_pending.empty?
|
140
|
-
end
|
141
|
-
|
142
|
-
def assertion_data_as_a_struct
|
143
|
-
{
|
144
|
-
still_pending: @assertions_pending.size,
|
145
|
-
succeeded: @assertions_passed,
|
146
|
-
failed: @assertions_failed.size,
|
147
|
-
failures: @assertions_failed.values.map { |item| [item[:code], item[:failure_reason]] },
|
148
|
-
}
|
149
|
-
end
|
150
|
-
|
151
|
-
# Create a promise to do a JS assertion, normally after other ops have finished.
|
152
|
-
def assert_js(js_code, wait_for: [], timeout: DEFAULT_ASSERTION_TIMEOUT)
|
153
|
-
id = start_assertion(js_code)
|
154
|
-
|
155
|
-
# this isn't a TestPromise, so it doesn't have the additional DSL entries
|
156
|
-
promise = wrangler.eval_js_async(js_code, wait_for: wait_for, timeout: timeout)
|
157
|
-
promise.on_rejected do
|
158
|
-
fail_assertion(id, "JS Eval failed: #{promise.reason.inspect}")
|
159
|
-
end
|
160
|
-
promise.on_fulfilled do
|
161
|
-
ret_val = promise.returned_value
|
162
|
-
if ret_val
|
163
|
-
pass_assertion(id)
|
164
|
-
else
|
165
|
-
fail_assertion(id, "Expected true JS value: #{ret_val.inspect}")
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
# So we wrap it in a no-op TestPromise, to get the DSL entries.
|
170
|
-
TestPromise.new(iface: self, wait_for: [promise]).to_execute {}
|
171
|
-
end
|
172
|
-
|
173
|
-
def assert(value, msg = nil)
|
174
|
-
id = start_assertion("#{caller[0]}: #{msg || "Value should be true!"}")
|
175
|
-
|
176
|
-
if value
|
177
|
-
pass_assertion(id)
|
178
|
-
else
|
179
|
-
fail_assertion(id, "Expected true Ruby value: #{value.inspect}")
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
def assert_equal(val1, val2, msg = nil)
|
184
|
-
assert val1 == val2, (msg || "Expected #{val2.inspect} to equal #{val1.inspect}!")
|
185
|
-
end
|
186
|
-
|
187
|
-
# How do we signal an error?
|
188
|
-
def with_js_value(js_code, wait_for: [], timeout: DEFAULT_ASSERTION_TIMEOUT, &block)
|
189
|
-
raise "Must give a block to with_js_value!" unless block
|
190
|
-
|
191
|
-
js_promise = wrangler.eval_js_async(js_code, wait_for: wait_for, timeout: timeout)
|
192
|
-
ruby_promise = TestPromise.new(iface: self, wait_for: [js_promise])
|
193
|
-
ruby_promise.to_execute(&block)
|
194
|
-
ruby_promise
|
195
|
-
end
|
196
|
-
|
197
|
-
def with_js_dom_html(wait_for: [], timeout: DEFAULT_ASSERTION_TIMEOUT, &block)
|
198
|
-
with_js_value("document.getElementById('wrapper-wvroot').innerHTML", wait_for: wait_for, timeout: timeout, &block)
|
199
|
-
end
|
200
|
-
|
201
|
-
def fully_updated(wait_for: [])
|
202
|
-
wrangler.promise_dom_fully_updated
|
203
|
-
end
|
204
|
-
end
|
205
|
-
|
206
|
-
# A {Scarpe::Promise} but with helper functions for Webview testing.
|
207
|
-
class TestPromise < Scarpe::Promise
|
208
|
-
def initialize(iface:, state: nil, wait_for: [], &scheduler)
|
209
|
-
@iface = iface
|
210
|
-
super(state: state, parents: wait_for, &scheduler)
|
211
|
-
end
|
212
|
-
|
213
|
-
def inspect
|
214
|
-
"<#TestPromise::#{object_id} state=#{state.inspect} parents=#{parents.inspect} value=#{returned_value.inspect} reason=#{reason.inspect}>"
|
215
|
-
end
|
216
|
-
|
217
|
-
# This method expects to wait for the parent TestPromise and then run a block of Ruby that returns
|
218
|
-
# another promise. This is useful for wrapping Promises like those from replace() that don't have
|
219
|
-
# the test DSL built in. The block will execute when this outer promise is scheduled -- so we don't do
|
220
|
-
# a replace() too early, for instance. And then the outer promise will fulfill when the inner one does.
|
221
|
-
def then_ruby_promise(wait_for: [], &block)
|
222
|
-
ruby_wrapper_promise = TestPromise.new iface: @iface, wait_for: ([self] + wait_for)
|
223
|
-
|
224
|
-
ruby_wrapper_promise.on_scheduled do
|
225
|
-
inner_ruby_promise = block.call
|
226
|
-
inner_ruby_promise.on_fulfilled { ruby_wrapper_promise.fulfilled!(inner_ruby_promise.returned_value) }
|
227
|
-
end
|
228
|
-
end
|
229
|
-
|
230
|
-
def then_with_js_value(js_code, wait_for: [], timeout: DEFAULT_ASSERTION_TIMEOUT, &block)
|
231
|
-
@iface.with_js_value(js_code, wait_for: (wait_for + [self]), timeout:, &block)
|
232
|
-
end
|
233
|
-
|
234
|
-
def then_with_js_dom_html(wait_for: [], timeout: DEFAULT_ASSERTION_TIMEOUT, &block)
|
235
|
-
@iface.with_js_dom_html(wait_for: (wait_for + [self]), timeout:, &block)
|
236
|
-
end
|
237
|
-
end
|
238
|
-
end
|
data/lib/scarpe/wv/dimensions.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class Scarpe
|
4
|
-
class Dimensions
|
5
|
-
class << self
|
6
|
-
def length(value)
|
7
|
-
case value
|
8
|
-
when Integer
|
9
|
-
if value < 0
|
10
|
-
"calc(100% - #{value.abs}px)"
|
11
|
-
else
|
12
|
-
"#{value}px"
|
13
|
-
end
|
14
|
-
when Float
|
15
|
-
"#{value * 100}%"
|
16
|
-
else
|
17
|
-
value
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|