scriptorium 0.0.3 → 0.7.2

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 (353) hide show
  1. checksums.yaml +4 -4
  2. data/README.lt3 +324 -0
  3. data/README.md +3155 -1
  4. data/assets/.DS_Store +0 -0
  5. data/assets/README.md +44 -0
  6. data/assets/icons/social/reddit.png +0 -0
  7. data/assets/icons/social/x-logo.png +0 -0
  8. data/assets/icons/ui/.DS_Store +0 -0
  9. data/assets/icons/ui/back.png +0 -0
  10. data/assets/icons/ui/copy.png +0 -0
  11. data/assets/icons/ui/down.png +0 -0
  12. data/assets/icons/ui/end.png +0 -0
  13. data/assets/icons/ui/exit.png +0 -0
  14. data/assets/icons/ui/foo +10 -0
  15. data/assets/icons/ui/home.png +0 -0
  16. data/assets/icons/ui/left.png +0 -0
  17. data/assets/icons/ui/next.png +0 -0
  18. data/assets/icons/ui/right.png +0 -0
  19. data/assets/icons/ui/start.png +0 -0
  20. data/assets/icons/ui/up.png +0 -0
  21. data/assets/imagenotfound.jpg +0 -0
  22. data/assets/samples/placeholder.svg +9 -0
  23. data/assets/themes/standard/favicon.svg +6 -0
  24. data/bin/sblog +84 -5
  25. data/bin/scriptorium +1 -0
  26. data/doc/README.txt +6 -0
  27. data/doc/anti-amnesia/20250727-054000-scriptorium-overview.md +94 -0
  28. data/doc/anti-amnesia/20250727-123000-anti-amnesia-conventions.md +2 -0
  29. data/doc/anti-amnesia/20250727-172600-cursor-rbenv-ruby-version-mystery.md +45 -0
  30. data/doc/anti-amnesia/20250727-172900-ai-cognitive-assessment-capabilities.md +40 -0
  31. data/doc/anti-amnesia/20250728-124243-aaa-syntax-clarification.md +46 -0
  32. data/doc/anti-amnesia/20250729-210000-reddit-autopost-integration-complete.md +158 -0
  33. data/doc/anti-amnesia/20250804-190500-cognitive-loop-bug.md +35 -0
  34. data/doc/anti-amnesia/20250804-190700-anti-amnesia-timestamping-fix.md +27 -0
  35. data/doc/anti-amnesia/20250807-213025.md +116 -0
  36. data/doc/anti-amnesia/20250901-211714-codemirror-integration-and-web-tests.md +172 -0
  37. data/doc/anti-amnesia/20250902-002402-backup-restore-system.md +126 -0
  38. data/doc/anti-amnesia/20250907-203339-backup-metadata-implementation.md +66 -0
  39. data/doc/banner_svg_config.md +114 -0
  40. data/doc/contrib.lt3 +8 -0
  41. data/doc/dependencies.md +281 -0
  42. data/doc/hacker.lt3 +5 -0
  43. data/doc/imported/0001-elixir-conf-2014/metadata.txt +7 -0
  44. data/doc/imported/0001-elixir-conf-2014/post.html +37 -0
  45. data/doc/imported/0001-elixir-conf-2014/source.lt3 +22 -0
  46. data/doc/imported/0002-programmers-and-word-processing/metadata.txt +7 -0
  47. data/doc/imported/0002-programmers-and-word-processing/post.html +192 -0
  48. data/doc/imported/0002-programmers-and-word-processing/source.lt3 +146 -0
  49. data/doc/imported/0003-how-to-turn-your-brain-sideways/metadata.txt +7 -0
  50. data/doc/imported/0003-how-to-turn-your-brain-sideways/post.html +60 -0
  51. data/doc/imported/0003-how-to-turn-your-brain-sideways/source.lt3 +40 -0
  52. data/doc/imported/0004-upcoming-lone-star-ruby-conference/metadata.txt +7 -0
  53. data/doc/imported/0004-upcoming-lone-star-ruby-conference/post.html +42 -0
  54. data/doc/imported/0004-upcoming-lone-star-ruby-conference/source.lt3 +24 -0
  55. data/doc/imported/0005-elixir-conf-2015-announced/metadata.txt +7 -0
  56. data/doc/imported/0005-elixir-conf-2015-announced/post.html +30 -0
  57. data/doc/imported/0005-elixir-conf-2015-announced/source.lt3 +16 -0
  58. data/doc/imported/0006-ruby-for-dinosaurs/metadata.txt +7 -0
  59. data/doc/imported/0006-ruby-for-dinosaurs/post.html +43 -0
  60. data/doc/imported/0006-ruby-for-dinosaurs/source.lt3 +27 -0
  61. data/doc/imported/0007-phoenix-isnt-rails/metadata.txt +7 -0
  62. data/doc/imported/0007-phoenix-isnt-rails/post.html +116 -0
  63. data/doc/imported/0007-phoenix-isnt-rails/source.lt3 +87 -0
  64. data/doc/imported/0008-concerning-the-term-monkeypatching/metadata.txt +7 -0
  65. data/doc/imported/0008-concerning-the-term-monkeypatching/post.html +129 -0
  66. data/doc/imported/0008-concerning-the-term-monkeypatching/source.lt3 +92 -0
  67. data/doc/imported/0009-announcement-coming-soon/metadata.txt +7 -0
  68. data/doc/imported/0009-announcement-coming-soon/post.html +33 -0
  69. data/doc/imported/0009-announcement-coming-soon/source.lt3 +19 -0
  70. data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/metadata.txt +7 -0
  71. data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/post.html +175 -0
  72. data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/source.lt3 +139 -0
  73. data/doc/imported/0011-computer-science-as-a-lost-art/metadata.txt +7 -0
  74. data/doc/imported/0011-computer-science-as-a-lost-art/post.html +139 -0
  75. data/doc/imported/0011-computer-science-as-a-lost-art/source.lt3 +104 -0
  76. data/doc/imported/0012-ruby-day-in-turin-italy/metadata.txt +7 -0
  77. data/doc/imported/0012-ruby-day-in-turin-italy/post.html +42 -0
  78. data/doc/imported/0012-ruby-day-in-turin-italy/source.lt3 +24 -0
  79. data/doc/imported/0013-rubyday-was-a-success/metadata.txt +7 -0
  80. data/doc/imported/0013-rubyday-was-a-success/post.html +44 -0
  81. data/doc/imported/0013-rubyday-was-a-success/source.lt3 +27 -0
  82. data/doc/imported/0014-working-on-the-blogging-software/metadata.txt +7 -0
  83. data/doc/imported/0014-working-on-the-blogging-software/post.html +63 -0
  84. data/doc/imported/0014-working-on-the-blogging-software/source.lt3 +41 -0
  85. data/doc/imported/0015-ok-its-not-really-a-lost-art/metadata.txt +7 -0
  86. data/doc/imported/0015-ok-its-not-really-a-lost-art/post.html +172 -0
  87. data/doc/imported/0015-ok-its-not-really-a-lost-art/source.lt3 +134 -0
  88. data/doc/imported/0016-an-in-operator-for-ruby/metadata.txt +7 -0
  89. data/doc/imported/0016-an-in-operator-for-ruby/post.html +155 -0
  90. data/doc/imported/0016-an-in-operator-for-ruby/source.lt3 +106 -0
  91. data/doc/imported/0017-the-forgotten-mathematician/metadata.txt +7 -0
  92. data/doc/imported/0017-the-forgotten-mathematician/post.html +161 -0
  93. data/doc/imported/0017-the-forgotten-mathematician/source.lt3 +119 -0
  94. data/doc/imported/0018-ruby-puns/metadata.txt +7 -0
  95. data/doc/imported/0018-ruby-puns/post.html +46 -0
  96. data/doc/imported/0018-ruby-puns/source.lt3 +28 -0
  97. data/doc/imported/0019-custom-exceptions-via-metaprogramming/metadata.txt +7 -0
  98. data/doc/imported/0019-custom-exceptions-via-metaprogramming/post.html +138 -0
  99. data/doc/imported/0019-custom-exceptions-via-metaprogramming/source.lt3 +101 -0
  100. data/doc/imported/0020-fffff/metadata.txt +7 -0
  101. data/doc/imported/0020-fffff/post.html +24 -0
  102. data/doc/imported/0020-fffff/source.lt3 +12 -0
  103. data/doc/imported/0021-trying-ror-yet-again/metadata.txt +7 -0
  104. data/doc/imported/0021-trying-ror-yet-again/post.html +26 -0
  105. data/doc/imported/0021-trying-ror-yet-again/source.lt3 +12 -0
  106. data/doc/imported/0023-doctor-sleep/metadata.txt +7 -0
  107. data/doc/imported/0023-doctor-sleep/post.html +63 -0
  108. data/doc/imported/0023-doctor-sleep/source.lt3 +44 -0
  109. data/doc/imported/0024-just-a-test/metadata.txt +7 -0
  110. data/doc/imported/0024-just-a-test/post.html +24 -0
  111. data/doc/imported/0024-just-a-test/source.lt3 +12 -0
  112. data/doc/imported/import_summary.txt +98 -0
  113. data/doc/livetext-informal-spec.txt +65 -0
  114. data/doc/myuserdoc/ch-0.lt3 +31 -0
  115. data/doc/myuserdoc/ch-1.lt3 +37 -0
  116. data/doc/myuserdoc/ch-10.lt3 +22 -0
  117. data/doc/myuserdoc/ch-2.lt3 +37 -0
  118. data/doc/myuserdoc/ch-3.lt3 +19 -0
  119. data/doc/myuserdoc/ch-4.lt3 +43 -0
  120. data/doc/myuserdoc/ch-5.lt3 +22 -0
  121. data/doc/myuserdoc/ch-6.lt3 +19 -0
  122. data/doc/myuserdoc/ch-7.lt3 +16 -0
  123. data/doc/myuserdoc/ch-8.lt3 +13 -0
  124. data/doc/myuserdoc/ch-9.lt3 +19 -0
  125. data/doc/myuserdoc/tweak.rb +18 -0
  126. data/doc/myuserdoc/userdoc-toc.txt +88 -0
  127. data/doc/old-posts/0001-elixir-conf-2014.lt3 +24 -0
  128. data/doc/old-posts/0002-programmers-and-word-processing.lt3 +150 -0
  129. data/doc/old-posts/0003-how-to-turn-your-brain-sideways.lt3 +43 -0
  130. data/doc/old-posts/0004-upcoming-lone-star-ruby-conference.lt3 +26 -0
  131. data/doc/old-posts/0005-elixir-conf-2015-announced.lt3 +17 -0
  132. data/doc/old-posts/0006-ruby-for-dinosaurs.lt3 +30 -0
  133. data/doc/old-posts/0007-phoenix-isnt-rails.lt3 +90 -0
  134. data/doc/old-posts/0008-concerning-the-term-monkeypatching.lt3 +105 -0
  135. data/doc/old-posts/0009-announcement-coming-soon.lt3 +20 -0
  136. data/doc/old-posts/0010-immutable-data-ditching-the-wax-tablet.lt3 +142 -0
  137. data/doc/old-posts/0011-computer-science-as-a-lost-art.lt3 +117 -0
  138. data/doc/old-posts/0012-ruby-day-in-turin-italy.lt3 +26 -0
  139. data/doc/old-posts/0013-rubyday-was-a-success.lt3 +28 -0
  140. data/doc/old-posts/0014-working-on-the-blogging-software.lt3 +42 -0
  141. data/doc/old-posts/0015-ok-its-not-really-a-lost-art.lt3 +137 -0
  142. data/doc/old-posts/0016-an-in-operator-for-ruby.lt3 +142 -0
  143. data/doc/old-posts/0017-the-forgotten-mathematician.lt3 +129 -0
  144. data/doc/old-posts/0018-ruby-puns.lt3 +31 -0
  145. data/doc/old-posts/0019-custom-exceptions-via-metaprogramming.lt3 +116 -0
  146. data/doc/old-posts/0021-trying-ror-yet-again.lt3 +35 -0
  147. data/doc/old-posts/0023-doctor-sleep.lt3 +43 -0
  148. data/doc/old-posts/0024-just-a-test.lt3 +12 -0
  149. data/doc/old-posts/0025-trying-another-post.lt3 +12 -0
  150. data/doc/old-repo +1 -0
  151. data/doc/reddit_credentials_template.json +8 -0
  152. data/doc/reddit_integration.md +207 -0
  153. data/doc/user.lt3 +35 -0
  154. data/doc/user_guide_section_1.md +137 -0
  155. data/doc/user_guide_section_10.md +515 -0
  156. data/doc/user_guide_section_11.md +708 -0
  157. data/doc/user_guide_section_2.md +233 -0
  158. data/doc/user_guide_section_3.md +5 -0
  159. data/doc/user_guide_section_4.md +221 -0
  160. data/doc/user_guide_section_5.md +243 -0
  161. data/doc/user_guide_section_6.md +147 -0
  162. data/doc/user_guide_section_7.md +311 -0
  163. data/doc/user_guide_section_8.md +224 -0
  164. data/doc/user_guide_section_9.md +375 -0
  165. data/lib/rouge/lexers/livetext.rb +74 -0
  166. data/lib/scriptorium/api.rb +2373 -0
  167. data/lib/scriptorium/banner_svg.rb +729 -0
  168. data/lib/scriptorium/contract.rb +34 -0
  169. data/lib/scriptorium/exceptions.rb +201 -1
  170. data/lib/scriptorium/helpers.rb +675 -0
  171. data/lib/scriptorium/post.rb +259 -0
  172. data/lib/scriptorium/reddit.rb +83 -0
  173. data/lib/scriptorium/repo.rb +938 -0
  174. data/lib/scriptorium/standard_files.rb +149 -0
  175. data/lib/scriptorium/support/bootstrap/css.txt +5 -0
  176. data/lib/scriptorium/support/bootstrap/js.txt +4 -0
  177. data/lib/scriptorium/support/common_js/clipboard.js +35 -0
  178. data/lib/scriptorium/support/common_js/content-loader.js +187 -0
  179. data/lib/scriptorium/support/common_js/navigation.js +52 -0
  180. data/lib/scriptorium/support/common_js/syntax-highlighting.js +27 -0
  181. data/lib/scriptorium/support/config/reddit.txt +10 -0
  182. data/lib/scriptorium/support/config/reddit_template.txt +17 -0
  183. data/lib/scriptorium/support/config/social.txt +8 -0
  184. data/lib/scriptorium/support/highlight/css.txt +2 -0
  185. data/lib/scriptorium/support/highlight/custom.css +119 -0
  186. data/lib/scriptorium/support/highlight/js.txt +1 -0
  187. data/lib/scriptorium/support/post_index/config.txt +15 -0
  188. data/lib/scriptorium/support/post_index/style.css +55 -0
  189. data/lib/scriptorium/support/templates/index_entry.lt3 +16 -0
  190. data/lib/scriptorium/support/templates/initial_post.lt3 +12 -0
  191. data/lib/scriptorium/support/templates/layout.txt +5 -0
  192. data/lib/scriptorium/support/templates/post.lt3 +104 -0
  193. data/lib/scriptorium/support/theme/footer.lt3 +2 -0
  194. data/lib/scriptorium/support/theme/header.lt3 +4 -0
  195. data/lib/scriptorium/support/theme/left.lt3 +3 -0
  196. data/lib/scriptorium/support/theme/main.lt3 +5 -0
  197. data/lib/scriptorium/support/theme/right.lt3 +3 -0
  198. data/lib/scriptorium/theme.rb +192 -0
  199. data/lib/scriptorium/version.rb +1 -1
  200. data/lib/scriptorium/view.rb +1021 -0
  201. data/lib/scriptorium/widgets/featured_posts.rb +149 -0
  202. data/lib/scriptorium/widgets/links.rb +112 -0
  203. data/lib/scriptorium/widgets/pages.rb +133 -0
  204. data/lib/scriptorium/widgets/widget.rb +133 -0
  205. data/lib/scriptorium.rb +38 -34
  206. data/lib/skeleton.rb +10 -1
  207. data/scriptorium.gemspec +17 -5
  208. data/test/README.md +69 -0
  209. data/test/WEB_INTEGRATION_README.md +196 -0
  210. data/test/all +83 -0
  211. data/test/api_demo.rb +99 -0
  212. data/test/assets/imagenotfound.jpg +0 -0
  213. data/test/assets/images/.DS_Store +0 -0
  214. data/test/assets/images/README.md +27 -0
  215. data/test/assets/images/odd_aspect.png +0 -0
  216. data/test/assets/images/perfect.png +0 -0
  217. data/test/assets/images/small.png +0 -0
  218. data/test/assets/images/tall.png +0 -0
  219. data/test/assets/images/very_tall.png +0 -0
  220. data/test/assets/images/very_wide.png +0 -0
  221. data/test/assets/images/wide.png +0 -0
  222. data/test/assets/testbanner.jpg +0 -0
  223. data/test/banner_svg/simple_helpers.rb +13 -0
  224. data/test/banner_svg/unit.rb +1000 -0
  225. data/test/config/deployment.txt +5 -0
  226. data/test/ed_test.rb +204 -0
  227. data/test/integration/cursor_banner_combinations.rb +193 -0
  228. data/test/integration/cursor_banner_features.rb +374 -0
  229. data/test/integration/integration_test.rb +326 -0
  230. data/test/integration/preview_flow_test.rb +94 -0
  231. data/test/livetext_plugin_test.rb +500 -0
  232. data/test/manual/asset_mgmt.rb +67 -0
  233. data/test/manual/banner-tests/index.html +45 -0
  234. data/test/manual/banner-tests/svg.txt +3 -0
  235. data/test/manual/banner-tests/test01.html +122 -0
  236. data/test/manual/banner-tests/test02.html +122 -0
  237. data/test/manual/banner-tests/test03.html +122 -0
  238. data/test/manual/banner-tests/test04.html +129 -0
  239. data/test/manual/banner-tests/test05.html +129 -0
  240. data/test/manual/banner-tests/test06.html +129 -0
  241. data/test/manual/banner-tests/test07.html +129 -0
  242. data/test/manual/banner-tests/test08.html +123 -0
  243. data/test/manual/banner-tests/test09.html +123 -0
  244. data/test/manual/banner-tests/test10.html +123 -0
  245. data/test/manual/banner-tests/test11.html +123 -0
  246. data/test/manual/banner-tests/test12.html +123 -0
  247. data/test/manual/banner-tests/test13.html +123 -0
  248. data/test/manual/banner-tests/test14.html +123 -0
  249. data/test/manual/banner-tests/test15.html +122 -0
  250. data/test/manual/banner-tests/test16.html +122 -0
  251. data/test/manual/banner-tests/test17.html +122 -0
  252. data/test/manual/banner-tests/test18.html +132 -0
  253. data/test/manual/banner-tests/test19.html +132 -0
  254. data/test/manual/banner-tests/test20.html +132 -0
  255. data/test/manual/banner-tests/test21.html +132 -0
  256. data/test/manual/banner-tests/test22.html +132 -0
  257. data/test/manual/banner-tests/test23.html +132 -0
  258. data/test/manual/banner-tests/test24.html +132 -0
  259. data/test/manual/banner-tests/test25.html +131 -0
  260. data/test/manual/banner_environment.rb +205 -0
  261. data/test/manual/codemirror_demo.html +773 -0
  262. data/test/manual/create_posts_for_web.rb +114 -0
  263. data/test/manual/environment.rb +67 -0
  264. data/test/manual/make_banner.rb +153 -0
  265. data/test/manual/preview_manual_test.rb +129 -0
  266. data/test/manual/sample_banner_config.txt +12 -0
  267. data/test/manual/test_advanced_widgets.rb +73 -0
  268. data/test/manual/test_banner_combinations.rb +120 -0
  269. data/test/manual/test_banner_features.rb +306 -0
  270. data/test/manual/test_banner_integration.rb +115 -0
  271. data/test/manual/test_banner_radial.rb +87 -0
  272. data/test/manual/test_basic_posts.rb +47 -0
  273. data/test/manual/test_layout_widgets.rb +40 -0
  274. data/test/manual/test_pagination.rb +24 -0
  275. data/test/manual/test_random_posts.rb +38 -0
  276. data/test/manual/test_syntax_highlighting.rb +167 -0
  277. data/test/rubytext/rubytext_comprehensive_test.rb +307 -0
  278. data/test/rubytext/rubytext_demo_test.rb +42 -0
  279. data/test/rubytext/rubytext_testing_guide.md +277 -0
  280. data/test/run_automated_tests.rb +45 -0
  281. data/test/staging/.DS_Store +0 -0
  282. data/test/support/preview_utils.rb +88 -0
  283. data/test/syntax_highlighting_test.lt3 +124 -0
  284. data/test/test_gem_assets.rb +48 -0
  285. data/test/test_helpers.rb +240 -0
  286. data/test/tui_editor_integration_test.rb +296 -0
  287. data/test/tui_integration_test.rb +883 -0
  288. data/test/unit/api.rb +1776 -0
  289. data/test/unit/asset_management.rb +219 -0
  290. data/test/unit/backup_test.rb +451 -0
  291. data/test/unit/clipboard_test.rb +60 -0
  292. data/test/unit/contract_test.rb +69 -0
  293. data/test/unit/core.rb +1211 -0
  294. data/test/unit/deploy_config_test.rb +248 -0
  295. data/test/unit/deploy_test.rb +478 -0
  296. data/test/unit/edit_post_test.rb +168 -0
  297. data/test/unit/gem_asset_management.rb +183 -0
  298. data/test/unit/livetext_basic.rb +57 -0
  299. data/test/unit/livetext_compatibility.rb +82 -0
  300. data/test/unit/parse_cmd_test.rb +260 -0
  301. data/test/unit/permalink_copy_test.rb +211 -0
  302. data/test/unit/post.rb +309 -0
  303. data/test/unit/post_index_config_test.rb +258 -0
  304. data/test/unit/post_state_helpers_test.rb +137 -0
  305. data/test/unit/read_commented_file_test.rb +278 -0
  306. data/test/unit/reddit_test.rb +235 -0
  307. data/test/unit/repo.rb +569 -0
  308. data/test/unit/social_test.rb +366 -0
  309. data/test/unit/syntax_highlighting.rb +70 -0
  310. data/test/unit/theme_management_test.rb +91 -0
  311. data/test/unit/view.rb +498 -0
  312. data/test/unit/widgets.rb +669 -0
  313. data/test/web_integration_test.rb +231 -0
  314. data/test/web_test_helper.rb +218 -0
  315. data/test/web_workflow_test.rb +527 -0
  316. data/test/wizard_test.rb +123 -0
  317. data/ui/README.md +67 -0
  318. data/ui/common/lib/ui_common.rb +8 -0
  319. data/ui/rubytext/README.md +191 -0
  320. data/ui/rubytext/bin/scriptorium-rubytext +402 -0
  321. data/ui/rubytext/lib/rubytext_ui.rb +300 -0
  322. data/ui/tui/bin/scriptorium +1890 -0
  323. data/ui/tui/test/tui_test.rb +23 -0
  324. data/ui/web/app/app.rb +2600 -0
  325. data/ui/web/app/assets/livetext_mode.js +244 -0
  326. data/ui/web/app/error_helpers.rb +150 -0
  327. data/ui/web/app/views/advanced_config.erb +196 -0
  328. data/ui/web/app/views/asset_management.erb +645 -0
  329. data/ui/web/app/views/backup_management.erb +238 -0
  330. data/ui/web/app/views/banner_config.erb +200 -0
  331. data/ui/web/app/views/config_widget.erb +232 -0
  332. data/ui/web/app/views/configure_view.erb +401 -0
  333. data/ui/web/app/views/dashboard.erb +154 -0
  334. data/ui/web/app/views/deploy_config.erb +149 -0
  335. data/ui/web/app/views/edit_pages.erb +363 -0
  336. data/ui/web/app/views/edit_post.erb +175 -0
  337. data/ui/web/app/views/edit_theme.erb +73 -0
  338. data/ui/web/app/views/edit_theme_file.erb +74 -0
  339. data/ui/web/app/views/error_page.erb +29 -0
  340. data/ui/web/app/views/header_config.erb +155 -0
  341. data/ui/web/app/views/layout_config.erb +147 -0
  342. data/ui/web/app/views/navbar_config.erb +411 -0
  343. data/ui/web/app/views/theme_management.erb +130 -0
  344. data/ui/web/app/views/view_dashboard.erb +779 -0
  345. data/ui/web/app/views/widgets.erb +249 -0
  346. data/ui/web/bin/scriptorium-web +164 -0
  347. data/ui/web/test/web_basic_test.rb +38 -0
  348. data/ui/web/test_navbar.txt +7 -0
  349. data/ui/web/tmp/timing.log +17 -0
  350. data/ui/web/tmp/web_server.log +0 -0
  351. metadata +434 -8
  352. data/lib/scriptorium/engine.rb +0 -22
  353. data/test/engine/unit.rb +0 -44
@@ -0,0 +1,306 @@
1
+ # Manual inspection tests for BannerSVG features
2
+ #
3
+ # This file creates individual HTML pages for each banner feature test,
4
+ # with simple navigation between them. Each page is completely isolated
5
+ # to prevent state sharing issues.
6
+ #
7
+ # Usage:
8
+ # ruby test_banner_features_simple.rb # Interactive mode with browser
9
+ # ruby test_banner_features_simple.rb --automated # Automated mode for CI/AI testing
10
+ #
11
+ require_relative "../../lib/scriptorium"
12
+ require_relative "./banner_environment"
13
+
14
+ # Test definitions
15
+ tests = [
16
+ {
17
+ title: "Red Background",
18
+ subtitle: "Solid color test",
19
+ config: "back.color #ff0000",
20
+ description: "Red Background"
21
+ },
22
+ {
23
+ title: "Blue Background",
24
+ subtitle: "Solid color test",
25
+ config: "back.color #0000ff",
26
+ description: "Blue Background"
27
+ },
28
+ {
29
+ title: "Green Background",
30
+ subtitle: "Solid color test",
31
+ config: "back.color #00ff00",
32
+ description: "Green Background"
33
+ },
34
+ {
35
+ title: "Red to Blue Gradient",
36
+ subtitle: "Linear gradient test",
37
+ config: "back.linear red blue lr",
38
+ description: "Linear Gradient (Left to Right)"
39
+ },
40
+ {
41
+ title: "Green to Yellow Gradient",
42
+ subtitle: "Linear gradient test",
43
+ config: "back.linear green yellow tb",
44
+ description: "Linear Gradient (Top to Bottom)"
45
+ },
46
+ {
47
+ title: "Red to Blue Radial",
48
+ subtitle: "Radial gradient test",
49
+ config: "back.radial red blue",
50
+ description: "Radial Gradient"
51
+ },
52
+ {
53
+ title: "Green to Yellow Radial",
54
+ subtitle: "Radial gradient test",
55
+ config: "back.radial green yellow",
56
+ description: "Radial Gradient"
57
+ },
58
+ {
59
+ title: "Small Text",
60
+ subtitle: "Size test",
61
+ config: "title.scale 0.5\nsubtitle.scale 0.3",
62
+ description: "Small Text (0.5x, 0.3x)"
63
+ },
64
+ {
65
+ title: "Large Text",
66
+ subtitle: "Size test",
67
+ config: "title.scale 1.5\nsubtitle.scale 1.0",
68
+ description: "Large Text (1.5x, 1.0x)"
69
+ },
70
+ {
71
+ title: "Bold Text",
72
+ subtitle: "Style test",
73
+ config: "title.style bold\nsubtitle.style bold",
74
+ description: "Bold Text"
75
+ },
76
+ {
77
+ title: "Italic Text",
78
+ subtitle: "Style test",
79
+ config: "title.style italic\nsubtitle.style italic",
80
+ description: "Italic Text"
81
+ },
82
+ {
83
+ title: "Bold & Italic",
84
+ subtitle: "Style test",
85
+ config: "title.style bold italic\nsubtitle.style bold italic",
86
+ description: "Bold & Italic Text"
87
+ },
88
+ {
89
+ title: "Blue Text",
90
+ subtitle: "Color test",
91
+ config: "title.color #0000ff\nsubtitle.color #0000ff",
92
+ description: "Blue Text"
93
+ },
94
+ {
95
+ title: "Green Text",
96
+ subtitle: "Color test",
97
+ config: "title.color #00ff00\nsubtitle.color #00ff00",
98
+ description: "Green Text"
99
+ },
100
+ {
101
+ title: "Left Position",
102
+ subtitle: "Position test",
103
+ config: "text.align left",
104
+ description: "Left Positioned Text"
105
+ },
106
+ {
107
+ title: "Center Position",
108
+ subtitle: "Position test",
109
+ config: "text.align center",
110
+ description: "Center Positioned Text"
111
+ },
112
+ {
113
+ title: "Right Position",
114
+ subtitle: "Position test",
115
+ config: "text.align right",
116
+ description: "Right Positioned Text"
117
+ },
118
+ {
119
+ title: "Perfect Image Background",
120
+ subtitle: "Image test (8:1 aspect)",
121
+ config: "back.image ../../assets/images/perfect.png",
122
+ description: "Perfect match: 8:1 aspect ratio image fits banner exactly - no cropping or scaling needed"
123
+ },
124
+ {
125
+ title: "Wide Image Background",
126
+ subtitle: "Image test (16:1 aspect)",
127
+ config: "back.image ../../assets/images/wide.png",
128
+ description: "Wide image (16:1) cropped to fit 8:1 banner - left/right edges removed, center preserved"
129
+ },
130
+ {
131
+ title: "Tall Image Background",
132
+ subtitle: "Image test (1:1 aspect)",
133
+ config: "back.image ../../assets/images/tall.png",
134
+ description: "Square image (1:1) cropped to fit 8:1 banner - top/bottom removed, center strip visible"
135
+ },
136
+ {
137
+ title: "Very Tall Image Background",
138
+ subtitle: "Image test (1:4 aspect)",
139
+ config: "back.image ../../assets/images/very_tall.png",
140
+ description: "Very tall image (1:4) heavily cropped - only narrow center strip visible, most content lost"
141
+ },
142
+ {
143
+ title: "Very Wide Image Background",
144
+ subtitle: "Image test (16:1 aspect)",
145
+ config: "back.image ../../assets/images/very_wide.png",
146
+ description: "Very wide image (16:1) heavily cropped - only narrow center strip visible, sides removed"
147
+ },
148
+ {
149
+ title: "Small Image Background",
150
+ subtitle: "Image test (low res, 8:1 aspect)",
151
+ config: "back.image ../../assets/images/small.png",
152
+ description: "Small low-res image scaled up to fill banner - may appear pixelated but maintains aspect"
153
+ },
154
+ {
155
+ title: "Odd Aspect Image Background",
156
+ subtitle: "Image test (~4:1 aspect)",
157
+ config: "back.image ../../assets/images/odd_aspect.png",
158
+ description: "Non-standard aspect ratio (~4:1) cropped to fit 8:1 banner - moderate cropping applied"
159
+ },
160
+ {
161
+ title: "Another gradient test",
162
+ subtitle: "Just one more, I swear",
163
+ config: "back.linear #0000ff #000033 lr\ntitle.color #fff\nsubtitle.color #fff",
164
+ description: "Linear Gradient (Left to Right)"
165
+ }
166
+ ]
167
+
168
+ # Create temp directory for tests
169
+ test_dir = File.dirname(__FILE__)/"banner-tests"
170
+ Dir.mkdir(test_dir) unless Dir.exist?(test_dir)
171
+
172
+ # Create individual pages for each test
173
+ pages = []
174
+ tests.each_with_index do |test, index|
175
+ page_num = index + 1
176
+ filename = "test#{page_num.to_s.rjust(2, '0')}.html"
177
+
178
+ # Write config file for this test
179
+ File.write(test_dir/"svg.txt", test[:config])
180
+
181
+ # Create banner
182
+ require_relative '../../lib/scriptorium'
183
+ Dir.chdir(test_dir) do
184
+ banner = Scriptorium::BannerSVG.new(test[:title], test[:subtitle])
185
+ banner.parse_header_svg
186
+ svg_output = banner.get_svg
187
+
188
+ # Check if this is an image background test
189
+ image_path = nil
190
+ if test[:config].include?("back.image")
191
+ image_path = test[:config].match(/back\.image\s+(.+)/)&.[](1)
192
+ # For the original image display, we need the path relative to the HTML file
193
+ # The HTML is in test/manual/banner-tests/, and images are in test/assets/images/
194
+ # Convert ../../assets/images/... to /assets/images/... (absolute from web server root)
195
+ display_path = image_path.gsub('../../assets/images/', '/assets/images/') if image_path
196
+
197
+ # Fix the SVG pattern path to use the correct absolute path
198
+ svg_output = svg_output.gsub('../../assets/images/', '/assets/images/')
199
+ end
200
+
201
+ # Create standalone HTML page
202
+ html_content = <<~HTML
203
+ <!DOCTYPE html>
204
+ <html>
205
+ <head>
206
+ <title>#{test[:title]}</title>
207
+ <style>
208
+ body { font-family: Arial, sans-serif; margin: 0; padding: 0; background: #f5f5f5; }
209
+ .banner { width: 100%; margin: 0; padding: 0; border: 3px solid #007cba; border-radius: 8px; }
210
+ .content { padding: 20px; padding-bottom: 80px; }
211
+ .description { margin: 10px 0; font-weight: bold; }
212
+ .config { background: #f0f0f0; padding: 10px; margin: 10px 0; font-family: monospace; font-size: 12px; }
213
+ .navigation {
214
+ position: fixed;
215
+ bottom: 0;
216
+ left: 0;
217
+ right: 0;
218
+ background: #e0e0e0;
219
+ padding: 15px;
220
+ text-align: center;
221
+ border-top: 2px solid #007cba;
222
+ z-index: 1000;
223
+ }
224
+ .navigation a { margin: 0 10px; padding: 8px 15px; background: #007cba; color: white; text-decoration: none; border-radius: 3px; }
225
+ .navigation a:hover { background: #005a87; }
226
+ .original-image { margin: 20px 0; padding: 20px; background: white; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
227
+ .original-image h3 { margin: 0 0 10px 0; color: #333; }
228
+ .original-image img { max-width: 100%; height: auto; border: 1px solid #ddd; }
229
+ </style>
230
+ </head>
231
+ <body>
232
+ <div class="banner" id="header">
233
+ #{svg_output}
234
+ </div>
235
+ <div class="content">
236
+ <div class="description">#{test[:description]}</div>
237
+ <div class="config">#{test[:config]}</div>
238
+ #{image_path ? "<div class='original-image'>\n <h3>Original Image (for comparison):</h3>\n <img src='#{display_path}' alt='Original image'>\n </div>" : ""}
239
+ <div class="navigation">
240
+ <a href="index.html">Back to Index</a>
241
+ </div>
242
+ </div>
243
+ </body>
244
+ </html>
245
+ HTML
246
+
247
+ File.write(filename, html_content)
248
+ end
249
+
250
+ pages << { number: page_num, title: test[:title], filename: filename }
251
+ end
252
+
253
+ # Add navigation links to each page
254
+ pages.each_with_index do |page, index|
255
+ prev_page = index > 0 ? pages[index - 1][:filename] : nil
256
+ next_page = index < pages.length - 1 ? pages[index + 1][:filename] : nil
257
+
258
+ # Read the current page
259
+ page_file = test_dir/page[:filename]
260
+ content = File.read(page_file)
261
+
262
+ # Create navigation HTML
263
+ nav_html = '<div class="navigation">'
264
+ nav_html += '<a href="index.html">Back to Index</a>'
265
+ nav_html += " <a href=\"#{prev_page}\">Previous</a>" if prev_page
266
+ nav_html += " <a href=\"#{next_page}\">Next</a>" if next_page
267
+ nav_html += '</div>'
268
+
269
+ # Replace the placeholder navigation
270
+ content.gsub!(/<div class="navigation">.*?<\/div>/m, nav_html)
271
+
272
+ # Write the updated page
273
+ File.write(page_file, content)
274
+ end
275
+
276
+ # Create index page
277
+ index_html = <<~HTML
278
+ <!DOCTYPE html>
279
+ <html>
280
+ <head>
281
+ <title>BannerSVG Feature Tests</title>
282
+ <style>
283
+ body { font-family: Arial, sans-serif; margin: 20px; background: #f5f5f5; }
284
+ .test-list { background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
285
+ .test-item { margin: 10px 0; padding: 10px; background: #f9f9f9; border-left: 4px solid #007cba; }
286
+ .test-item a { color: #007cba; text-decoration: none; font-weight: bold; }
287
+ .test-item a:hover { text-decoration: underline; }
288
+ .test-description { color: #666; font-size: 14px; margin-top: 5px; }
289
+ </style>
290
+ </head>
291
+ <body>
292
+ <h1>BannerSVG Feature Tests</h1>
293
+ <div class="test-list">
294
+ <p>Click on any test to view the banner in isolation:</p>
295
+ #{pages.map.with_index { |page, index|
296
+ "<div class='test-item'><a href='#{page[:filename]}'>#{index + 1}. #{page[:title]}</a><div class='test-description'>#{tests[index][:description]}</div></div>"
297
+ }.join("\n")}
298
+ </div>
299
+ </body>
300
+ </html>
301
+ HTML
302
+
303
+ File.write(test_dir/"index.html", index_html)
304
+
305
+ # Call the environment's examine function
306
+ examine("banner-test")
@@ -0,0 +1,115 @@
1
+ require_relative './environment'
2
+
3
+ manual_setup
4
+
5
+ # Create multiple views to test different banner integration scenarios
6
+ views = []
7
+
8
+ # Test 1: Simple banner in header
9
+ view1 = @repo.create_view("banner-simple", "Simple Banner Site", "A site with basic SVG banner in header")
10
+ File.open(view1.dir/:config/"layout.txt", "w") do |f|
11
+ f.puts "header"
12
+ f.puts "main"
13
+ end
14
+ view1.generate_empty_containers
15
+ File.open(view1.dir/:config/"header.txt", "w") do |f|
16
+ f.puts "banner svg"
17
+ end
18
+ view1.generate_front_page
19
+ views << view1
20
+
21
+ # Test 2: SVG debug test (header only)
22
+ view2 = @repo.create_view("svg-debug", "SVG Debug Test", "Testing SVG insertion")
23
+ File.open(view2.dir/:config/"layout.txt", "w") do |f|
24
+ f.puts "header"
25
+ end
26
+ view2.generate_empty_containers
27
+ File.open(view2.dir/:config/"header.txt", "w") do |f|
28
+ f.puts "banner_svg"
29
+ end
30
+ File.open(view2.dir/:config/"config.txt", "w") do |f|
31
+ f.puts "# Simple debug config"
32
+ f.puts "back.radial #FF0000 #0000FF"
33
+ f.puts "title.color #FFFFFF"
34
+ f.puts "subtitle.color #FFFF00"
35
+ f.puts "title.style bold"
36
+ f.puts "subtitle.style italic"
37
+ end
38
+ view2.generate_front_page
39
+ views << view2
40
+
41
+ # Test 3: Complex header with multiple elements
42
+ view3 = @repo.create_view("complex-header", "My Awesome Blog", "Exploring the Power of SVG Banners")
43
+ File.open(view3.dir/:config/"layout.txt", "w") do |f|
44
+ f.puts "header"
45
+ f.puts "main"
46
+ end
47
+ view3.generate_empty_containers
48
+ File.open(view3.dir/:config/"header.txt", "w") do |f|
49
+ f.puts "banner_svg"
50
+ f.puts "title"
51
+ f.puts "subtitle"
52
+ end
53
+ File.open(view3.dir/:config/"config.txt", "w") do |f|
54
+ f.puts "# Complex SVG Banner Configuration"
55
+ f.puts "# This exercises multiple features at once"
56
+ f.puts ""
57
+ f.puts "# Background: Radial gradient from purple to blue"
58
+ f.puts "back.radial #8B5CF6 #3B82F6"
59
+ f.puts ""
60
+ f.puts "# Custom aspect ratio (wider banner)"
61
+ f.puts "aspect 6.0"
62
+ f.puts ""
63
+ f.puts "# Custom font"
64
+ f.puts "text.font Georgia serif"
65
+ f.puts ""
66
+ f.puts "# Title styling: Bold, larger scale, custom color"
67
+ f.puts "title.scale 1.2"
68
+ f.puts "title.style bold"
69
+ f.puts "title.color #FFFFFF"
70
+ f.puts "title.align center"
71
+ f.puts ""
72
+ f.puts "# Subtitle styling: Italic, smaller scale, different color"
73
+ f.puts "subtitle.scale 0.6"
74
+ f.puts "subtitle.style italic"
75
+ f.puts "subtitle.color #E5E7EB"
76
+ f.puts "subtitle.align center"
77
+ f.puts ""
78
+ f.puts "# Custom positioning for both title and subtitle"
79
+ f.puts "title.xy 50% 45%"
80
+ f.puts "subtitle.xy 50% 75%"
81
+ end
82
+ view3.generate_front_page
83
+ views << view3
84
+
85
+ # Test 4: Empty header (placeholder test)
86
+ view4 = @repo.create_view("empty-header-test", "Empty Header Test", "Testing placeholder text")
87
+ File.open(view4.dir/:config/"layout.txt", "w") do |f|
88
+ f.puts "header"
89
+ f.puts "main"
90
+ end
91
+ view4.generate_empty_containers
92
+ File.open(view4.dir/:config/"header.txt", "w") do |f|
93
+ # Empty file - should trigger placeholder
94
+ end
95
+ view4.generate_front_page
96
+ views << view4
97
+
98
+ instruct <<~EOS
99
+ Banner Integration Tests
100
+
101
+ This test demonstrates different banner integration scenarios:
102
+
103
+ 1. banner-simple: Basic SVG banner in header with main content
104
+ 2. svg-debug: Header-only layout with red-to-blue radial gradient banner
105
+ 3. complex-header: Multiple header elements with sophisticated banner styling
106
+ 4. empty-header-test: Empty header to verify placeholder text behavior
107
+
108
+ Each view tests different aspects of banner integration:
109
+ - Simple banner insertion
110
+ - Header-only layouts
111
+ - Complex styling combinations
112
+ - Placeholder text handling
113
+ EOS
114
+
115
+ examine views
@@ -0,0 +1,87 @@
1
+ require_relative './environment'
2
+
3
+ manual_setup
4
+
5
+ # Create multiple views to test different radial gradient scenarios
6
+ views = []
7
+
8
+ # Test 1: Custom radial gradient with custom center and radius
9
+ view1 = @repo.create_view("radial-custom", "Custom Radial Test", "Testing custom radial gradient parameters")
10
+ File.open(view1.dir/:config/"layout.txt", "w") do |f|
11
+ f.puts "header"
12
+ end
13
+ view1.generate_empty_containers
14
+ File.open(view1.dir/:config/"header.txt", "w") do |f|
15
+ f.puts "banner_svg"
16
+ end
17
+ File.open(view1.dir/:config/"config.txt", "w") do |f|
18
+ f.puts "# Custom Radial Gradient Test"
19
+ f.puts "# Default: circular vignette (ar omitted, will use 1/aspect)"
20
+ f.puts "aspect 5.0"
21
+ f.puts "back.radial #FF6B6B #4ECDC4 75% 25% 60%"
22
+ f.puts ""
23
+ f.puts "# Custom: elliptical vignette (ar = 0.5, i.e. squished horizontally)"
24
+ f.puts "# Uncomment to test:"
25
+ f.puts "# back.radial #FF6B6B #4ECDC4 75% 25% 60% 0.5"
26
+ f.puts ""
27
+ f.puts "# Title styling"
28
+ f.puts "title.color #FFFFFF"
29
+ f.puts "title.style bold"
30
+ f.puts "title.align center"
31
+ f.puts ""
32
+ f.puts "# Subtitle styling"
33
+ f.puts "subtitle.color #FFFFFF"
34
+ f.puts "subtitle.style italic"
35
+ f.puts "subtitle.align center"
36
+ end
37
+ view1.generate_front_page
38
+ views << view1
39
+
40
+ # Test 2: Large radius radial gradient (soft vignette)
41
+ view2 = @repo.create_view("radial-large-radius", "Large Radius Radial Test", "Testing r > 100% for soft vignette")
42
+ File.open(view2.dir/:config/"layout.txt", "w") do |f|
43
+ f.puts "header"
44
+ end
45
+ view2.generate_empty_containers
46
+ File.open(view2.dir/:config/"header.txt", "w") do |f|
47
+ f.puts "banner_svg"
48
+ end
49
+ File.open(view2.dir/:config/"config.txt", "w") do |f|
50
+ f.puts "# Large Radius Radial Gradient Test"
51
+ f.puts "aspect 5.0"
52
+ f.puts "# r = 150% (soft vignette, gradient extends beyond banner)"
53
+ f.puts "back.radial #FF6B6B #4ECDC4 50% 50% 150%"
54
+ f.puts ""
55
+ f.puts "# Title styling"
56
+ f.puts "title.color #FFFFFF"
57
+ f.puts "title.style bold"
58
+ f.puts "title.align center"
59
+ f.puts ""
60
+ f.puts "# Subtitle styling"
61
+ f.puts "subtitle.color #FFFFFF"
62
+ f.puts "subtitle.style italic"
63
+ f.puts "subtitle.align center"
64
+ end
65
+ view2.generate_front_page
66
+ views << view2
67
+
68
+ instruct <<~EOS
69
+ Radial Gradient Banner Tests
70
+
71
+ This test demonstrates different radial gradient scenarios:
72
+
73
+ 1. radial-custom: Custom center position (75%, 25%) and radius (60%)
74
+ - Tests aspect-ratio compensation for circular vignettes
75
+ - Includes commented example for elliptical vignettes (ar=0.5)
76
+
77
+ 2. radial-large-radius: Large radius (150%) for soft vignette effect
78
+ - Tests gradients that extend beyond the banner boundaries
79
+ - Creates a very soft, subtle color transition
80
+
81
+ Both tests use:
82
+ - Wide aspect ratio (5.0) to test gradient behavior in non-square banners
83
+ - White text with bold title and italic subtitle
84
+ - Centered text alignment
85
+ EOS
86
+
87
+ examine views
@@ -0,0 +1,47 @@
1
+ require_relative "./environment"
2
+
3
+ manual_setup
4
+
5
+ @repo.create_view("testview", "Test View", "A test view for manual inspection")
6
+
7
+ # Post 1
8
+ draft_1_body = <<~BODY
9
+ .blurb It's sort of the William Riker of blog posts.
10
+ This is the first post.
11
+
12
+ It contains multiple paragraphs:
13
+ - Introduction to the topic.<br>
14
+ - A deep dive into the details.<br>
15
+ - Conclusion with key takeaways.<br>
16
+
17
+ This should span multiple lines in the draft.
18
+ BODY
19
+
20
+ name1 = @repo.create_draft(title: "Post number one", views: ["testview"], body: draft_1_body)
21
+ num = @repo.finish_draft(name1)
22
+ @repo.generate_post(num)
23
+
24
+ # Post 2
25
+ draft_2_body = <<~BODY
26
+ .blurb In Roman numerals, this is post II.
27
+ This is the second post.
28
+
29
+ - Discussing the second topic.<br>
30
+ - Elaborating on several points.<br>
31
+ - Wrapping up with some additional comments.<br>
32
+
33
+ It also spans multiple lines in the draft.
34
+ BODY
35
+
36
+ name2 = @repo.create_draft(title: "Post number two", views: ["testview"], body: draft_2_body)
37
+ num = @repo.finish_draft(name2)
38
+ @repo.generate_post(num)
39
+
40
+ @repo.generate_front_page("testview") # Generate the front page
41
+
42
+ instruct <<~EOS
43
+ Front page should have two posts.
44
+ Each should have a blurb.
45
+ Links should work (and back button to return).
46
+ EOS
47
+ examine("testview")
@@ -0,0 +1,40 @@
1
+ require_relative './environment'
2
+
3
+ manual_setup
4
+
5
+ srand(42) # for random posts
6
+
7
+ create_3_views
8
+ create_13_posts_manual
9
+ alter_pubdates
10
+
11
+ view = @repo.view("blog3")
12
+ File.open(view.dir/:config/"layout.txt", "w") do |f|
13
+ f.puts "header"
14
+ f.puts "main"
15
+ f.puts "right 20%"
16
+ end
17
+ view.generate_empty_containers
18
+ File.open(view.dir/:config/"right.txt", "w") do |f|
19
+ f.puts "widget links"
20
+ end
21
+
22
+ data = view.dir/:widgets/"links/list.txt"
23
+ Dir.mkdir(view.dir/:widgets/"links")
24
+ File.open(data, "w") do |f|
25
+ f.puts "https://www.google.com,Google"
26
+ f.puts "https://www.yahoo.com,Yahoo"
27
+ end
28
+ see_file data
29
+
30
+ view.generate_front_page
31
+
32
+ instruct <<~EOS
33
+ Again, 13 posts in three views
34
+ blog3 will have only header, main, right
35
+ It will have the Links widget
36
+ Click the + to expand
37
+ Links open in new tabs
38
+ EOS
39
+
40
+ examine view
@@ -0,0 +1,24 @@
1
+ require_relative './environment'
2
+
3
+ manual_setup
4
+
5
+ srand(42) # for random posts
6
+
7
+ view = @repo.create_view("testview", "Another Test View", "testing pagination for post index")
8
+
9
+ 35.times do |i|
10
+ post = @repo.create_post(title: pseudowords(5, "Post #{i}"), body: pseudolines(10))
11
+ post.set_pubdate_with_seconds("2025-07-26", i) # Set seconds to 00, 01, 02, etc.
12
+ @repo.generate_post(post.id)
13
+ end
14
+
15
+ view.generate_front_page
16
+
17
+ instruct <<~EOS
18
+ Creates 35 posts (now instant!)
19
+ Posts have timestamps 12:00:00, 12:00:01, 12:00:02, etc.
20
+ Confirm they are in "recent first" order -- 35 down to 1
21
+ Confirm pagination works
22
+ EOS
23
+
24
+ examine view
@@ -0,0 +1,38 @@
1
+ require_relative './environment'
2
+
3
+ # Handle --automated flag at the end
4
+ automated_mode = ARGV.last == '--automated'
5
+ if automated_mode
6
+ ARGV.pop # Remove --automated from ARGV
7
+ end
8
+
9
+ abort "Need a view name (blog1 blog2 blog3)" unless ARGV.size == 1
10
+
11
+ view = ARGV.first
12
+
13
+ # Restore --automated flag for the examine function
14
+ ARGV << '--automated' if automated_mode
15
+
16
+ manual_setup
17
+
18
+ srand(42) # for random posts
19
+
20
+ create_3_views
21
+ create_13_posts_manual
22
+ alter_pubdates
23
+
24
+ view = @repo.lookup_view(view)
25
+
26
+ instruct <<~EOS
27
+ Three blogs created: blog1 blog2 blog3
28
+ Browser goes to whichever you put on command line: #{view.name}
29
+ You can also navigate to the others.
30
+ Total of 13 posts
31
+ Each post may be in only one view or two or all three
32
+ EOS
33
+
34
+ %w[blog1 blog2 blog3].each do |v|
35
+ @repo.generate_front_page(v)
36
+ end
37
+
38
+ examine view