scarpe 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. checksums.yaml +4 -4
  2. data/.cursor/rules/commit-style-preferences.mdc +72 -0
  3. data/.cursor/rules/component_context.mdc +82 -0
  4. data/.cursor/rules/debug-failed-tests.mdc +100 -0
  5. data/.cursor/rules/display_service_context.mdc +80 -0
  6. data/.cursor/rules/event_handling_context.mdc +100 -0
  7. data/.cursor/rules/git-pager-handling.mdc +64 -0
  8. data/.cursor/rules/lacci-context.mdc +52 -0
  9. data/.cursor/rules/scarpe_design_context.mdc +46 -0
  10. data/.cursor/rules/shoes_compatibility_context.mdc +75 -0
  11. data/.cursor/rules/timeout_context.mdc +78 -0
  12. data/.cursor/rules/update_lacci_and_wv.mdc +8 -0
  13. data/.cursor/rules/what_is_scarpe.mdc +22 -0
  14. data/.cursor/rules/writing-new-rules.mdc +73 -0
  15. data/CHANGELOG.md +46 -5
  16. data/CLAUDE.md +223 -0
  17. data/Gemfile +2 -2
  18. data/Gemfile.lock +85 -55
  19. data/LICENSE.txt +7 -1
  20. data/README.md +80 -20
  21. data/Rakefile +73 -14
  22. data/docs/SCARPE_FEATURES.md +38 -0
  23. data/docs/_config.yml +13 -0
  24. data/docs/calzini_components_and_updates.md +78 -0
  25. data/docs/display_service_separation.md +39 -0
  26. data/docs/documentation.md +43 -0
  27. data/docs/event_loops.md +66 -0
  28. data/docs/image.png +0 -0
  29. data/docs/index.md +118 -0
  30. data/docs/lacci.md +121 -0
  31. data/docs/scarpe_shoes_incompatibilities.md +71 -0
  32. data/docs/shoes_and_display_events.md +55 -0
  33. data/docs/shoes_implementations.md +79 -0
  34. data/docs/static/manual.md +5 -0
  35. data/docs/static/scarpe-logo.png +0 -0
  36. data/docs/timeouts_and_handlers.md +66 -0
  37. data/docs/web_archaeology.md +76 -0
  38. data/examples/Edit_box_Styles.rb +8 -0
  39. data/examples/Kerning.rb +7 -0
  40. data/examples/background_with_image.rb +14 -5
  41. data/examples/bloopsaphone/working/feepogram.rb +1 -1
  42. data/examples/bloopsaphone/working/le_dance_des_rubis.rb +135 -0
  43. data/examples/bloopsaphone/working/pixel_dreams_in_ruby.rb +131 -0
  44. data/examples/bloopsaphone/working/type_rebellion.rb +157 -0
  45. data/examples/border.rb +11 -0
  46. data/examples/check.rb +2 -0
  47. data/examples/download_and_show_image.rb +3 -0
  48. data/examples/flags/finland.rb +15 -0
  49. data/examples/flags/italy.rb +11 -0
  50. data/examples/flags/mauritius.rb +14 -0
  51. data/examples/font_family.rb +17 -0
  52. data/examples/font_shorthand.rb +9 -0
  53. data/examples/gen.rb +4 -0
  54. data/examples/internal_link_navigation.rb +19 -0
  55. data/examples/legacy/not_checked/shoes-manual/append.rb +10 -0
  56. data/examples/legacy/not_checked/shoes-manual/background_change.rb +12 -0
  57. data/examples/legacy/not_checked/shoes-manual/background_pattern.rb +5 -0
  58. data/examples/legacy/not_checked/shoes-manual/basic_app.rb +8 -0
  59. data/examples/legacy/not_checked/shoes-manual/border.rb +9 -0
  60. data/examples/legacy/not_checked/shoes-manual/builtins/FONTS.rb +5 -0
  61. data/examples/legacy/not_checked/shoes-manual/builtins/ask.rb +2 -0
  62. data/examples/legacy/not_checked/shoes-manual/builtins/ask_color.rb +5 -0
  63. data/examples/legacy/not_checked/shoes-manual/builtins/ask_open_file.rb +5 -0
  64. data/examples/legacy/not_checked/shoes-manual/builtins/ask_save_folder.rb +2 -0
  65. data/examples/legacy/not_checked/shoes-manual/builtins/confirm.rb +4 -0
  66. data/examples/legacy/not_checked/shoes-manual/builtins/debug.rb +2 -0
  67. data/examples/legacy/not_checked/shoes-manual/builtins/info.rb +3 -0
  68. data/examples/legacy/not_checked/shoes-manual/button.rb +9 -0
  69. data/examples/legacy/not_checked/shoes-manual/clear.rb +7 -0
  70. data/examples/legacy/not_checked/shoes-manual/custom_header.rb +13 -0
  71. data/examples/legacy/not_checked/shoes-manual/displace.rb +14 -0
  72. data/examples/legacy/not_checked/shoes-manual/edit_box.rb +8 -0
  73. data/examples/legacy/not_checked/shoes-manual/fill_pattern.rb +5 -0
  74. data/examples/legacy/not_checked/shoes-manual/fonts.rb +7 -0
  75. data/examples/legacy/not_checked/shoes-manual/gutter.rb +6 -0
  76. data/examples/legacy/not_checked/shoes-manual/image_web.rb +4 -0
  77. data/examples/legacy/not_checked/shoes-manual/keypress.rb +7 -0
  78. data/examples/legacy/not_checked/shoes-manual/list_box.rb +10 -0
  79. data/examples/legacy/not_checked/shoes-manual/motion.rb +10 -0
  80. data/examples/legacy/not_checked/shoes-manual/mouse.rb +8 -0
  81. data/examples/legacy/not_checked/shoes-manual/move.rb +14 -0
  82. data/examples/legacy/not_checked/shoes-manual/nested_ovals.rb +8 -0
  83. data/examples/legacy/not_checked/shoes-manual/oval.rb +7 -0
  84. data/examples/legacy/not_checked/shoes-manual/ovals.rb +6 -0
  85. data/examples/legacy/not_checked/shoes-manual/ovals_image.rb +8 -0
  86. data/examples/legacy/not_checked/shoes-manual/prepend.rb +7 -0
  87. data/examples/legacy/not_checked/shoes-manual/progress_bar.rb +10 -0
  88. data/examples/legacy/not_checked/shoes-manual/radio.rb +18 -0
  89. data/examples/legacy/not_checked/shoes-manual/radio_alternative_1.rb +7 -0
  90. data/examples/legacy/not_checked/shoes-manual/radio_alternative_2.rb +9 -0
  91. data/examples/legacy/not_checked/shoes-manual/rotate_rectangle.rb +6 -0
  92. data/examples/legacy/not_checked/shoes-manual/shape.rb +11 -0
  93. data/examples/legacy/not_checked/shoes-manual/static/avatar.png +0 -0
  94. data/examples/legacy/not_checked/shoes-manual/stroke.rb +5 -0
  95. data/examples/legacy/not_checked/shoes-manual/style.rb +3 -0
  96. data/examples/legacy/not_checked/shoes-manual/style_alternative_1.rb +4 -0
  97. data/examples/legacy/not_checked/shoes-manual/style_alternative_2.rb +5 -0
  98. data/examples/legacy/not_checked/shoes-manual/style_length.rb +5 -0
  99. data/examples/legacy/not_checked/shoes-manual/timer.rb +6 -0
  100. data/examples/legacy/not_checked/shoes-manual/trigger_window.rb +8 -0
  101. data/examples/legacy/not_checked/shoes-manual/window_owner.rb +8 -0
  102. data/examples/legacy/working/shoes_manual/alert_button.rb +2 -0
  103. data/examples/legacy/working/shoes_manual/animate.rb +7 -0
  104. data/examples/legacy/working/shoes_manual/background_para.rb +4 -0
  105. data/examples/legacy/working/shoes_manual/button_alternative.rb +7 -0
  106. data/examples/legacy/working/shoes_manual/checkbox.rb +17 -0
  107. data/examples/legacy/working/shoes_manual/download.rb +12 -0
  108. data/examples/legacy/working/shoes_manual/edit_box.rb +6 -0
  109. data/examples/legacy/working/shoes_manual/editline.rb +7 -0
  110. data/examples/legacy/working/shoes_manual/fixed_height.rb +8 -0
  111. data/examples/legacy/working/shoes_manual/fixed_width.rb +12 -0
  112. data/examples/legacy/working/shoes_manual/image.rb +5 -0
  113. data/examples/legacy/working/shoes_manual/instance_variable_check.rb +10 -0
  114. data/examples/legacy/working/shoes_manual/message.rb +18 -0
  115. data/examples/legacy/working/shoes_manual/rectangle.rb +6 -0
  116. data/examples/legacy/working/shoes_manual/save_download.rb +12 -0
  117. data/examples/legacy/working/shoes_manual/self_check.rb +10 -0
  118. data/examples/legacy/working/shoes_manual/stack.rb +7 -0
  119. data/examples/legacy/working/shoes_manual/style_info.rb +8 -0
  120. data/examples/legacy/working/shoes_manual/utf8_support.rb +8 -0
  121. data/examples/legacy/working/shoes_manual/width.rb +4 -0
  122. data/examples/local_assets/multi_image.rb +5 -0
  123. data/examples/local_assets/small.png +0 -0
  124. data/examples/local_fonts.rb +3 -0
  125. data/examples/margin.rb +13 -0
  126. data/examples/margin_check.rb +27 -0
  127. data/examples/oval-with-kwargs.rb +3 -0
  128. data/examples/oval.rb +26 -0
  129. data/examples/page_navigation_single_app.rb +42 -0
  130. data/examples/para_font_styles.rb +17 -0
  131. data/examples/para_font_variant.rb +6 -0
  132. data/examples/para_fontweight.rb +13 -0
  133. data/examples/parse_xl_funnies.rb +3 -0
  134. data/examples/rect.rb +1 -1
  135. data/examples/scarpe_ext.rb +3 -0
  136. data/examples/shapes/star.rb +1 -3
  137. data/examples/shoes_subclass_app.rb +25 -0
  138. data/examples/spacing.rb +1 -1
  139. data/examples/span.rb +4 -2
  140. data/examples/url_routing_example.rb +67 -0
  141. data/lacci/Gemfile +0 -2
  142. data/lacci/Gemfile.lock +4 -32
  143. data/lacci/lacci.gemspec +3 -3
  144. data/lacci/lib/lacci/scarpe_cli.rb +0 -1
  145. data/lacci/lib/lacci/version.rb +1 -1
  146. data/lacci/lib/scarpe/niente/app.rb +12 -1
  147. data/lacci/lib/scarpe/niente/display_service.rb +5 -1
  148. data/lacci/lib/scarpe/niente/drawable.rb +2 -0
  149. data/lacci/lib/scarpe/niente/shoes_spec.rb +10 -5
  150. data/lacci/lib/scarpe/niente.rb +15 -2
  151. data/lacci/lib/shoes/app.rb +204 -105
  152. data/lacci/lib/shoes/constants.rb +24 -2
  153. data/lacci/lib/shoes/display_service.rb +43 -4
  154. data/lacci/lib/shoes/drawable.rb +326 -36
  155. data/lacci/lib/shoes/drawables/arc.rb +4 -26
  156. data/lacci/lib/shoes/drawables/arrow.rb +3 -23
  157. data/lacci/lib/shoes/drawables/border.rb +28 -0
  158. data/lacci/lib/shoes/drawables/button.rb +5 -21
  159. data/lacci/lib/shoes/drawables/check.rb +7 -3
  160. data/lacci/lib/shoes/drawables/document_root.rb +4 -4
  161. data/lacci/lib/shoes/drawables/edit_box.rb +6 -5
  162. data/lacci/lib/shoes/drawables/edit_line.rb +5 -4
  163. data/lacci/lib/shoes/drawables/flow.rb +4 -6
  164. data/lacci/lib/shoes/drawables/font_helper.rb +62 -0
  165. data/lacci/lib/shoes/drawables/image.rb +2 -2
  166. data/lacci/lib/shoes/drawables/line.rb +3 -6
  167. data/lacci/lib/shoes/drawables/link.rb +16 -9
  168. data/lacci/lib/shoes/drawables/list_box.rb +8 -5
  169. data/lacci/lib/shoes/drawables/oval.rb +48 -0
  170. data/lacci/lib/shoes/drawables/para.rb +106 -18
  171. data/lacci/lib/shoes/drawables/progress.rb +2 -1
  172. data/lacci/lib/shoes/drawables/radio.rb +5 -3
  173. data/lacci/lib/shoes/drawables/rect.rb +7 -6
  174. data/lacci/lib/shoes/drawables/shape.rb +4 -3
  175. data/lacci/lib/shoes/drawables/slot.rb +102 -9
  176. data/lacci/lib/shoes/drawables/stack.rb +7 -12
  177. data/lacci/lib/shoes/drawables/star.rb +9 -31
  178. data/lacci/lib/shoes/drawables/text_drawable.rb +93 -34
  179. data/lacci/lib/shoes/drawables/video.rb +3 -2
  180. data/lacci/lib/shoes/drawables/widget.rb +9 -4
  181. data/lacci/lib/shoes/drawables.rb +2 -1
  182. data/lacci/lib/shoes/errors.rb +13 -3
  183. data/lacci/lib/shoes/margin_helper.rb +79 -0
  184. data/lacci/lib/shoes.rb +98 -20
  185. data/lacci/test/.gitignore +1 -0
  186. data/lacci/test/test_draw_context.rb +167 -0
  187. data/lacci/test/test_font_helper.rb +57 -0
  188. data/lacci/test/test_helper.rb +31 -4
  189. data/lacci/test/test_lacci.rb +93 -6
  190. data/lacci/test/test_margin_helper.rb +82 -0
  191. data/lacci/test/test_niente_test_infra.rb +40 -0
  192. data/lacci/test/test_oval.rb +82 -0
  193. data/lacci/test/test_parenting.rb +140 -0
  194. data/lacci/test/test_shoes_errors.rb +15 -13
  195. data/lacci/test/test_text_drawables.rb +23 -0
  196. data/lib/scarpe/assets.rb +19 -0
  197. data/lib/scarpe/cats_cradle.rb +57 -98
  198. data/lib/scarpe/shoes_spec.rb +24 -44
  199. data/lib/scarpe/version.rb +1 -1
  200. data/lib/scarpe/wv/app.rb +1 -0
  201. data/lib/scarpe/wv/arc.rb +0 -4
  202. data/lib/scarpe/wv/border.rb +15 -0
  203. data/lib/scarpe/wv/control_interface.rb +2 -10
  204. data/lib/scarpe/wv/document_root.rb +2 -2
  205. data/lib/scarpe/wv/drawable.rb +6 -40
  206. data/lib/scarpe/wv/edit_box.rb +4 -1
  207. data/lib/scarpe/wv/edit_line.rb +4 -1
  208. data/lib/scarpe/wv/image.rb +2 -5
  209. data/lib/scarpe/wv/link.rb +4 -2
  210. data/lib/scarpe/wv/oval.rb +13 -0
  211. data/lib/scarpe/wv/para.rb +1 -0
  212. data/lib/scarpe/wv/scarpe_extensions.rb +8 -0
  213. data/lib/scarpe/wv/shape.rb +10 -5
  214. data/lib/scarpe/wv/text_drawable.rb +72 -14
  215. data/lib/scarpe/wv/web_wrangler.rb +33 -11
  216. data/lib/scarpe/wv/webview_local_display.rb +6 -2
  217. data/lib/scarpe/wv.rb +16 -2
  218. data/scarpe-components/Gemfile +4 -3
  219. data/scarpe-components/Gemfile.lock +6 -37
  220. data/scarpe-components/README.md +2 -2
  221. data/scarpe-components/assets/bootstrap-themes/bootstrap-cerulean.css +12229 -0
  222. data/scarpe-components/assets/bootstrap-themes/bootstrap-cosmo.css +11810 -0
  223. data/scarpe-components/assets/bootstrap-themes/bootstrap-cyborg.css +12210 -0
  224. data/scarpe-components/assets/bootstrap-themes/bootstrap-darkly.css +12153 -0
  225. data/scarpe-components/assets/bootstrap-themes/bootstrap-flatly.css +12126 -0
  226. data/scarpe-components/assets/bootstrap-themes/bootstrap-icons.min.css +5 -0
  227. data/scarpe-components/assets/bootstrap-themes/bootstrap-journal.css +12099 -0
  228. data/scarpe-components/assets/bootstrap-themes/bootstrap-litera.css +12211 -0
  229. data/scarpe-components/assets/bootstrap-themes/bootstrap-lumen.css +12369 -0
  230. data/scarpe-components/assets/bootstrap-themes/bootstrap-lux.css +11928 -0
  231. data/scarpe-components/assets/bootstrap-themes/bootstrap-materia.css +13184 -0
  232. data/scarpe-components/assets/bootstrap-themes/bootstrap-minty.css +12177 -0
  233. data/scarpe-components/assets/bootstrap-themes/bootstrap-morph.css +12750 -0
  234. data/scarpe-components/assets/bootstrap-themes/bootstrap-pulse.css +11890 -0
  235. data/scarpe-components/assets/bootstrap-themes/bootstrap-quartz.css +12622 -0
  236. data/scarpe-components/assets/bootstrap-themes/bootstrap-sandstone.css +12201 -0
  237. data/scarpe-components/assets/bootstrap-themes/bootstrap-simplex.css +12186 -0
  238. data/scarpe-components/assets/bootstrap-themes/bootstrap-sketchy.css +12451 -0
  239. data/scarpe-components/assets/bootstrap-themes/bootstrap-slate.css +12492 -0
  240. data/scarpe-components/assets/bootstrap-themes/bootstrap-solar.css +12149 -0
  241. data/scarpe-components/assets/bootstrap-themes/bootstrap-spacelab.css +12266 -0
  242. data/scarpe-components/assets/bootstrap-themes/bootstrap-superhero.css +12216 -0
  243. data/scarpe-components/assets/bootstrap-themes/bootstrap-united.css +12077 -0
  244. data/scarpe-components/assets/bootstrap-themes/bootstrap-vapor.css +12549 -0
  245. data/scarpe-components/assets/bootstrap-themes/bootstrap-yeti.css +12325 -0
  246. data/scarpe-components/assets/bootstrap-themes/bootstrap-zephyr.css +12283 -0
  247. data/scarpe-components/assets/bootstrap-themes/bootstrap.bundle.min.js +7 -0
  248. data/scarpe-components/lib/scarpe/components/asset_server.rb +219 -0
  249. data/scarpe-components/lib/scarpe/components/base64.rb +22 -0
  250. data/scarpe-components/lib/scarpe/components/calzini/{art_widgets.rb → art_drawables.rb} +42 -18
  251. data/scarpe-components/lib/scarpe/components/calzini/border.rb +38 -0
  252. data/scarpe-components/lib/scarpe/components/calzini/button.rb +6 -8
  253. data/scarpe-components/lib/scarpe/components/calzini/misc.rb +14 -16
  254. data/scarpe-components/lib/scarpe/components/calzini/para.rb +218 -11
  255. data/scarpe-components/lib/scarpe/components/calzini/slots.rb +16 -60
  256. data/scarpe-components/lib/scarpe/components/calzini.rb +88 -1
  257. data/scarpe-components/lib/scarpe/components/errors.rb +4 -0
  258. data/scarpe-components/lib/scarpe/components/html.rb +4 -1
  259. data/scarpe-components/lib/scarpe/components/minitest_export_reporter.rb +11 -3
  260. data/scarpe-components/lib/scarpe/components/minitest_result.rb +41 -0
  261. data/scarpe-components/lib/scarpe/components/port_helpers.rb +30 -0
  262. data/scarpe-components/lib/scarpe/components/print_logger.rb +17 -2
  263. data/scarpe-components/lib/scarpe/components/process_helpers.rb +37 -0
  264. data/scarpe-components/lib/scarpe/components/segmented_file_loader.rb +1 -1
  265. data/scarpe-components/lib/scarpe/components/tiranti.rb +42 -100
  266. data/scarpe-components/lib/scarpe/components/unit_test_helpers.rb +3 -1
  267. data/scarpe-components/lib/scarpe/components/version.rb +1 -1
  268. data/scarpe-components/scarpe-components.gemspec +1 -1
  269. data/scarpe-components/test/assets/big-image.png +0 -0
  270. data/scarpe-components/test/assets/big-stylesheet.css +497 -0
  271. data/scarpe-components/test/assets/little-image.png +0 -0
  272. data/scarpe-components/test/assets/little-stylesheet.css +1 -0
  273. data/scarpe-components/test/calzini/test_calzini_art_drawables.rb +7 -7
  274. data/scarpe-components/test/calzini/test_calzini_button.rb +7 -5
  275. data/scarpe-components/test/calzini/test_calzini_misc.rb +9 -9
  276. data/scarpe-components/test/calzini/test_calzini_para.rb +6 -9
  277. data/scarpe-components/test/calzini/test_calzini_slots.rb +12 -57
  278. data/scarpe-components/test/calzini/test_calzini_text_drawables.rb +83 -18
  279. data/scarpe-components/test/calzini/test_various.rb +133 -0
  280. data/scarpe-components/test/test_asset_server.rb +72 -0
  281. data/scarpe-components/test/test_components.rb +31 -2
  282. data/scarpe-components/test/test_helper.rb +0 -1
  283. data/scarpe-components/test/test_minitest_result.rb +7 -0
  284. data/scarpe-components/test/test_port_helpers.rb +12 -0
  285. data/scarpe-components/test/test_segmented_app_files.rb +2 -0
  286. data/tasks/check_html_fixtures.rb +140 -0
  287. data/tasks/regenerate_html_fixtures.rb +104 -0
  288. data/templates/class_template_with_shapes.erb +0 -11
  289. metadata +225 -39
  290. data/.rubocop.yml +0 -88
  291. data/lacci/lib/scarpe/niente/logger.rb +0 -29
  292. data/lacci/lib/shoes/drawables/span.rb +0 -27
  293. data/lacci/lib/shoes/spacing.rb +0 -9
  294. data/lib/scarpe/evented_assertions.rb +0 -121
  295. data/lib/scarpe/wv/span.rb +0 -44
  296. data/scarpe-components/lib/scarpe/components/calzini/text_widgets.rb +0 -65
  297. /data/examples/legacy/{not_checked → working}/shoes3-tests/editline/editline.rb +0 -0
@@ -0,0 +1,140 @@
1
+ # frozen_string_literal: false
2
+ require 'diff/lcs'
3
+ require 'diff/lcs/hunk'
4
+ require 'fileutils'
5
+ require "htmlbeautifier"
6
+
7
+ puts "== Checking HTML fixtures =="
8
+
9
+
10
+ # Get top-level Ruby examples
11
+ file_paths = Dir["examples/*.rb"]
12
+
13
+ # Get each filename, or one if supplied as argument
14
+ file_names = if ENV['SELECTED_FILE']
15
+ [ENV['SELECTED_FILE']]
16
+ else
17
+ file_paths.map do |file|
18
+ File.basename(file) # Exclude the file extension
19
+ end
20
+ end
21
+
22
+ collection_of_html = []
23
+ any_failures = false
24
+ failures = []
25
+
26
+ # ASCII color and format codes
27
+ red = "\e[31m"
28
+ green = "\e[32m"
29
+ bold = "\e[1m"
30
+ reset = "\e[0m"
31
+
32
+ def diff_as_string(data_new, data_old, file_name)
33
+ data_old = data_old.split(/\n/).map! { |e| e.chomp }
34
+ data_new = data_new.split(/\n/).map! { |e| e.chomp }
35
+
36
+ diffs = Diff::LCS.diff(data_old, data_new)
37
+ return if diffs.empty?
38
+
39
+ context_lines = 1
40
+
41
+ oldhunk = hunk = nil
42
+ file_length_difference = 0
43
+
44
+ output = ""
45
+ diffs.each do |piece|
46
+ begin
47
+ hunk = Diff::LCS::Hunk.new(data_old, data_new, piece,
48
+ context_lines,
49
+ file_length_difference
50
+ )
51
+ file_length_difference = hunk.file_length_difference
52
+
53
+ next unless oldhunk
54
+
55
+ # Hunks may overlap, which is why we need to be careful when our
56
+ # diff includes lines of context. Otherwise, we might print
57
+ # redundant lines.
58
+ if (context_lines > 0) and hunk.overlaps?(oldhunk)
59
+ hunk.unshift(oldhunk)
60
+ else
61
+ output << oldhunk.diff(:unified, "#{file_name}:") << "\n"
62
+ end
63
+ ensure
64
+ oldhunk = hunk
65
+ end
66
+ end
67
+
68
+ #Handle the last remaining hunk
69
+ output << oldhunk.diff(:unified, "#{file_name}:") << "\n"
70
+ end
71
+
72
+ file_names.each do |file_name|
73
+ # Read the entire file
74
+ content = File.read(File.join(File.expand_path("../examples", __dir__),"#{file_name}"))
75
+ # Skip this file if it contains the magic comment
76
+ next if content.include?("# html_ci: false")
77
+
78
+ output = ""
79
+ pid = nil
80
+ command = "bundle exec ./exe/scarpe examples/#{file_name} --dev --debug"
81
+
82
+ IO.popen(command) do |io|
83
+ pid = io.pid # captures the pid of the child process
84
+ io.each_line do |line|
85
+ output << line
86
+ if line.include?(":heartbeat")
87
+ Process.kill("SIGKILL", pid)
88
+ break
89
+ end
90
+ end
91
+ end
92
+
93
+ def match_output(logs)
94
+ logs.match(/(?<=code_string = ").*(?=")/)[0].split("`")[1]
95
+ end
96
+
97
+ def format_html(html)
98
+ html.gsub!(/\\/, "") # Remove all backslashes
99
+ html
100
+ end
101
+
102
+ html = format_html(
103
+ match_output(output),
104
+ )
105
+ # puts formatted_html
106
+ pretty_html = HtmlBeautifier.beautify(html)
107
+
108
+ # Compare to fixture
109
+ dir_path = "test/wv/html_fixtures"
110
+ begin
111
+ file_path = "#{dir_path}/#{file_name.split(".")[0]}.html"
112
+ expected_output = File.read(file_path)
113
+ rescue => e
114
+ raise "Hey, you need to regenerate fixtures, do this using command 'rake test:regenerate_html_fixtures' "
115
+ end
116
+ # Do the comparison
117
+ # diff = Diff::LCS.diff(pretty_html, expected_output)
118
+ diff_output = diff_as_string(pretty_html, expected_output, file_name)
119
+
120
+ if diff_output.nil?
121
+ puts "#{green}#{bold}PASSED#{reset}: #{file_name}"
122
+ else
123
+ puts "#{red}#{bold}FAILED#{reset}: #{file_name}\nDiff:"
124
+ puts diff_output
125
+ print reset
126
+ failures << file_name # Add name of failed file to the array
127
+ end
128
+ end
129
+
130
+ unless failures.empty?
131
+ puts "\n=== #{bold}Summary#{reset} ==="
132
+ puts "The following files have had their HTML output change with your changes"
133
+ puts "This may indicate an error. Please check the diff and update the fixture if necessary."
134
+ puts "You can update the fixture by running #{bold}`rake test:regenerate_html_fixtures`#{reset}\n\n"
135
+ failures.each do |file|
136
+ puts "#{red}#{file}#{reset}"
137
+ end
138
+ exit 1
139
+ end
140
+ puts "== Completed HTML fixture check =="
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: false
2
+
3
+ puts "== Regenerating HTML fixtures =="
4
+
5
+ require 'fileutils'
6
+
7
+ # Get top-level Ruby examples
8
+ file_paths = Dir["examples/*.rb"]
9
+
10
+ # Get each filename, or one if supplied as argument
11
+ file_names = if ENV['SELECTED_FILE']
12
+ [ENV['SELECTED_FILE']]
13
+ else
14
+ file_paths.map do |file|
15
+ File.basename(file) # Exclude the file extension
16
+ end
17
+ end
18
+
19
+ collection_of_html = []
20
+ file_names.each do |file_name|
21
+ # Read the entire file
22
+ content = File.read(File.join(File.expand_path("../examples", __dir__),"#{file_name}"))
23
+ # Skip this file if it contains the magic comment
24
+ next if content.include?("# html_ci: false")
25
+
26
+ output = ""
27
+ pid = nil
28
+ command = "bundle exec ./exe/scarpe examples/#{file_name} --dev --debug"
29
+
30
+ IO.popen(command) do |io|
31
+ pid = io.pid # captures the pid of the child process
32
+ io.each_line do |line|
33
+ output << line
34
+ if line.include?(":heartbeat")
35
+ Process.kill("SIGKILL", pid)
36
+ break
37
+ end
38
+ end
39
+ end
40
+
41
+ # EXAMPLE_OF_WHAT_OUTPUT_LOOKS_LIKE = <<~OUTPUT
42
+ # INFO WebviewAPI : Method: set_title Args: ["Shoes!"] KWargs: {} Block: n Return: nil
43
+ # INFO WebviewAPI : Method: set_size Args: [480, 420, 0] KWargs: {} Block: n Return: nil
44
+ # INFO WebviewAPI : Method: navigate Args: ["data:text/html, %3Chtml%3E%0A++%3Chead+id%3D%27head-wvroot%27%3E%0A++++%3Cstyle+id%3D%27style-wvroot%27%3E%0A++++++%2F%2A%2A+Style+resets+%2A%2A%2F%0A++++++body+%7B%0A++++++++font-family%3A+arial%2C+Helvetica%2C+sans-serif%3B%0A++++++++margin%3A+0%3B%0A++++++++height%3A+100%25%3B%0A++++++++overflow%3A+hidden%3B%0A++++++%7D%0A++++++p+%7B%0A++++++++margin%3A+0%3B%0A++++++%7D%0A++++++%23wrapper-wvroot+%7B%0A++++++++height%3A+100%25%3B%0A++++++++width%3A+100%25%3B%0A++++++%7D%0A++++%3C%2Fstyle%3E%0A++%3C%2Fhead%3E%0A++%3Cbody+id%3D%27body-wvroot%27%3E%0A++++%3Cdiv+id%3D%27wrapper-wvroot%27%3E%3C%2Fdiv%3E%0A++%3C%2Fbody%3E%0A%3C%2Fhtml%3E%0A"] KWargs: {} Block: n Return: nil
45
+ # INFO WebviewAPI : Method: eval Args: ["function patchConsole(fn) {\n const original = console[fn];\n console[fn] = function(...args) {\n original(...args);\n puts(...args);\n }\n};\npatchConsole('log');\npatchConsole('info');\npatchConsole('error');\npatchConsole('warn');\n"] KWargs: {} Block: n Return: nil
46
+ # DEBUG Webview::WebWrangler::DOMWrangler : Requesting DOM replacement...
47
+ # DEBUG Webview::WebWrangler::DOMWrangler : Requesting redraw with 1 waiting changes and no waiting promise - need to schedule something!
48
+ # DEBUG Webview::WebWrangler::DOMWrangler : Requesting redraw with 1 waiting changes - scheduling a new redraw for them!
49
+ # INFO WebviewAPI : Method: eval Args: ["(function() {\n var code_string = "document.getElementById('wrapper-wvroot').innerHTML = `<div id=\\"2\\" style=\\"display:flex;flex-direction:row;flex-wrap:wrap;align-content:flex-start;justify-content:flex-start;align-items:flex-start;width:100%;height:100%\\"><button id=\\"3\\" onclick=\\"scarpeHandler('3-click')\\" onmouseover=\\"scarpeHandler('3-hover')\\">Push me</button><div id=\\"root-fonts\\"></div><div id=\\"root-alerts\\"> </div></div>`; true";\n try {\n result = eval(code_string);\n scarpeAsyncEvalResult("success", 0, result);\n } catch(error) {\n scarpeAsyncEvalResult("error", 0, error.message);\n }\n})();\n"] KWargs: {} Block: n Return: nil
50
+ # DEBUG Webview::WebWrangler : Scheduled JS: (0)
51
+ # (function() {
52
+ # var code_string = "document.getElementById('wrapper-wvroot').innerHTML = `<div id="2" style="display:flex;flex-direction:row;flex-wrap:wrap;align-content:flex-start;justify-content:flex-start;align-items:flex-start;width:100%;height:100%"><button id="3" onclick="scarpeHandler('3-click')" onmouseover="scarpeHandler('3-hover')">Push me</button><div id="root-fonts"></div><div id="root-alerts"> </div></div>`; true";
53
+ # try {
54
+ # result = eval(code_string);
55
+ # scarpeAsyncEvalResult("success", 0, result);
56
+ # } catch(error) {
57
+ # scarpeAsyncEvalResult("error", 0, error.message);
58
+ # }
59
+ # })();
60
+ # OUTPUT
61
+
62
+ require "htmlbeautifier"
63
+
64
+ def match_output(logs)
65
+ logs.match(/(?<=code_string = ").*(?=")/)[0].split("`")[1]
66
+ end
67
+
68
+ def format_html(html)
69
+ html.gsub!(/\\/, "") # Remove all backslashes
70
+ html
71
+ end
72
+
73
+ html = format_html(
74
+ match_output(output),
75
+ )
76
+ # puts formatted_html
77
+ pretty_html = HtmlBeautifier.beautify(html)
78
+
79
+ collection_of_html << [file_name, pretty_html]
80
+
81
+ # EXAMPLE_OF_WHAT_PRETTY_HTML_LOOKS_LIKE = <<~PRETTY_HTML
82
+ # <div id="2" style="display:flex;flex-direction:row;flex-wrap:wrap;align-content:flex-start;justify-content:flex-start;align-items:flex-start;width:100%;height:100%"><button id="3" onclick="scarpeHandler('3-click')" onmouseover="scarpeHandler('3-hover')">Push me</button>
83
+ # <div id="root-fonts"></div>
84
+ # <div id="root-alerts"> </div>
85
+ # </div>
86
+ # PRETTY_HTML
87
+
88
+ # Write to fixtures
89
+ dir_path = "test/wv/html_fixtures"
90
+ file_path = "#{dir_path}/#{file_name.split(".")[0]}.html"
91
+
92
+ # Create the directory if it doesn't exist
93
+ FileUtils.mkdir_p(dir_path)
94
+
95
+ # Write the HTML to the file
96
+ File.write(file_path, pretty_html)
97
+
98
+
99
+ collection_of_html << [file_name, html]
100
+ end
101
+
102
+ # Show how it looks
103
+ # collection_of_html.map { |file_name, html| puts "File: #{file_name}\n\n HTML: #{html}" }
104
+ puts "HTML fixtures regenerated successfully!"
@@ -19,16 +19,5 @@ module Scarpe
19
19
 
20
20
  private
21
21
 
22
- def convert_to_integer(value, attribute_name, default = 0)
23
- begin
24
- value = Integer(value)
25
- raise InvalidAttributeValueError, "Negative num '#{value}' not allowed for attribute '#{attribute_name}'" if value < 0
26
-
27
- value
28
- rescue ArgumentError
29
- error_message = "Invalid value '#{value}' provided for attribute '#{attribute_name}'. The value should be a number."
30
- raise InvalidAttributeValueError, error_message
31
- end
32
- end
33
22
  end
34
23
  end