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
data/test/README.md ADDED
@@ -0,0 +1,69 @@
1
+ # Scriptorium Test Suite
2
+
3
+ ## Quick Start
4
+
5
+ ### Run All Tests (Unit + Automated Manual Tests)
6
+ ```bash
7
+ ruby test/run_automated_tests.rb
8
+ ```
9
+
10
+ ### Run Unit Tests Only
11
+ ```bash
12
+ ruby test/all
13
+ ```
14
+
15
+ ### Run Individual Manual Tests
16
+ ```bash
17
+ # Interactive mode (opens browser)
18
+ ruby test/manual/test1.rb
19
+
20
+ # Automated mode (no browser, just validation)
21
+ ruby test/manual/test1.rb --automated
22
+ ```
23
+
24
+ ## Test Types
25
+
26
+ ### Unit Tests (`test/unit/`)
27
+ - **Core functionality tests** - Basic helper methods, file operations
28
+ - **Repo tests** - Repository creation, management, post handling
29
+ - **Post tests** - Individual post functionality
30
+ - **View tests** - View generation and management
31
+ - **Banner SVG tests** - SVG banner generation and validation
32
+
33
+ ### Manual Tests (`test/manual/`)
34
+ - **Integration tests** - End-to-end workflows
35
+ - **Banner feature tests** - Visual verification of SVG banners
36
+ - **Widget tests** - Sidebar widgets and functionality
37
+ - **Layout tests** - Page layout and styling
38
+
39
+ ## Automated Testing
40
+
41
+ All manual tests support `--automated` mode for CI/CD:
42
+ - No browser interaction required
43
+ - Validates file generation
44
+ - Returns exit codes for automation
45
+ - Use `--automated` as the **last** parameter
46
+
47
+ ## Environment Setup
48
+
49
+ The test environment is automatically configured:
50
+ - PATH is set to include rbenv shims
51
+ - Test repositories are created in `test/scriptorium-TEST/`
52
+ - Webrick server starts on port 8000 for manual tests
53
+ - Cleanup happens automatically
54
+
55
+ ## Examples
56
+
57
+ ```bash
58
+ # Run all tests
59
+ ruby test/run_automated_tests.rb
60
+
61
+ # Run specific manual test interactively
62
+ ruby test/manual/test_banner_combinations.rb
63
+
64
+ # Run specific manual test in automated mode
65
+ ruby test/manual/test_banner_combinations.rb --automated
66
+
67
+ # Run test3 with specific view
68
+ ruby test/manual/test3.rb blog1 --automated
69
+ ```
@@ -0,0 +1,196 @@
1
+ # Web Integration Test Framework
2
+
3
+ This directory contains a comprehensive web integration testing framework for the Scriptorium web application, based on the existing TUI integration test patterns.
4
+
5
+ ## Overview
6
+
7
+ The web integration tests verify that the web application works correctly in test mode, including:
8
+ - Server startup/shutdown in test mode
9
+ - HTTP endpoint functionality
10
+ - Form submission and redirects
11
+ - Test repository isolation
12
+ - Complete workflow testing
13
+
14
+ ## Test Files
15
+
16
+ ### 1. `web_test_helper.rb`
17
+ **Shared helper module** containing common web testing functionality:
18
+ - Web server management (start/stop)
19
+ - HTTP request methods (GET, POST, PUT, DELETE)
20
+ - Response assertions (success, redirect, not found)
21
+ - Test environment setup
22
+ - Repository cleanup
23
+
24
+ ### 2. `web_integration_test.rb`
25
+ **Basic integration tests** for core web functionality:
26
+ - `test_001_basic_web_interaction` - Verifies web app starts and responds
27
+ - `test_002_view_creation_workflow` - Tests dashboard and repository creation
28
+ - `test_003_asset_management_web` - Tests asset management access
29
+ - `test_004_view_configuration_web` - Tests view configuration access
30
+ - `test_005_deployment_configuration_web` - Tests deployment configuration access
31
+
32
+ ### 3. `web_workflow_test.rb`
33
+ **Comprehensive workflow tests** that mirror TUI functionality:
34
+ - `test_001_complete_repository_setup` - Full repository creation workflow
35
+ - `test_002_view_creation_workflow` - View creation via web forms
36
+ - `test_003_post_creation_workflow` - Post creation via web forms
37
+ - `test_004_asset_management_workflow` - Asset management workflow
38
+ - `test_005_view_configuration_workflow` - View configuration workflow
39
+ - `test_006_deployment_workflow` - Deployment configuration workflow
40
+ - `test_007_error_handling` - Error handling and edge cases
41
+
42
+ ## Key Features
43
+
44
+ ### Test Mode Support
45
+ - All tests run with `--test` flag
46
+ - Uses `ui/web/scriptorium-TEST` repository
47
+ - Completely isolated from production data
48
+ - Verifies test mode is active
49
+
50
+ ### HTTP Testing
51
+ - Tests actual HTTP requests/responses
52
+ - Handles redirects (302/303) properly
53
+ - Tests form submissions and validations
54
+ - Verifies response codes and content
55
+
56
+ ### Workflow Testing
57
+ - Tests complete user workflows
58
+ - Sets up test environment (repo + view) as needed
59
+ - Verifies state changes after operations
60
+ - Tests error conditions and edge cases
61
+
62
+ ### Server Management
63
+ - Automatic web server startup/shutdown
64
+ - Waits for server to be ready
65
+ - Cleans up test repositories
66
+ - Handles server process management
67
+
68
+ ## Usage
69
+
70
+ ### Running Individual Tests
71
+ ```bash
72
+ # Run basic integration tests
73
+ ruby test/web_integration_test.rb
74
+
75
+ # Run workflow tests
76
+ ruby test/web_workflow_test.rb
77
+
78
+ # Run specific test
79
+ ruby test/web_integration_test.rb -n test_001_basic_web_interaction
80
+ ```
81
+
82
+ ### Running All Web Tests
83
+ ```bash
84
+ # Run all web-related tests
85
+ ruby test/web_integration_test.rb
86
+ ruby test/web_workflow_test.rb
87
+ ```
88
+
89
+ ## Test Patterns
90
+
91
+ ### Setup/Teardown
92
+ ```ruby
93
+ def setup
94
+ cleanup_test_repo
95
+ ENV['DBC_DISABLED'] = 'true'
96
+ # rbenv hack for correct Ruby version
97
+ end
98
+
99
+ def teardown
100
+ cleanup_test_repo
101
+ stop_web_server
102
+ end
103
+ ```
104
+
105
+ ### HTTP Requests
106
+ ```ruby
107
+ # GET request
108
+ response = get("/status")
109
+
110
+ # POST request with form data
111
+ response = post("/create_view", {
112
+ name: "test-view",
113
+ title: "Test View"
114
+ })
115
+ ```
116
+
117
+ ### Assertions
118
+ ```ruby
119
+ # Success response
120
+ assert_response_success(response, "Should succeed")
121
+
122
+ # Redirect response
123
+ assert_response_redirect(response, "Should redirect")
124
+
125
+ # Content verification
126
+ assert_includes response.body, "Expected text"
127
+ ```
128
+
129
+ ### Test Environment Setup
130
+ ```ruby
131
+ # Setup basic test environment (repo + view)
132
+ setup_test_environment
133
+
134
+ # Or manually
135
+ post("/create_repo", {})
136
+ post("/create_view", { name: "test-view", title: "Test" })
137
+ ```
138
+
139
+ ## Architecture
140
+
141
+ ### Helper Module Design
142
+ - **WebTestHelper** - Shared functionality across all web tests
143
+ - **HTTP Methods** - GET, POST, PUT, DELETE with error handling
144
+ - **Assertions** - Response code and content verification
145
+ - **Server Management** - Start, stop, wait, cleanup
146
+
147
+ ### Test Class Structure
148
+ - **Include Helpers** - `Scriptorium::Helpers` and `WebTestHelper`
149
+ - **Setup/Teardown** - Repository cleanup and server management
150
+ - **Test Methods** - Individual workflow tests
151
+ - **Private Methods** - Test-specific helper methods
152
+
153
+ ### Test Isolation
154
+ - Each test starts with clean state
155
+ - Test repository is created/destroyed per test
156
+ - Web server is started/stopped per test
157
+ - No cross-test contamination
158
+
159
+ ## Comparison with TUI Tests
160
+
161
+ | Aspect | TUI Tests | Web Tests |
162
+ |--------|-----------|-----------|
163
+ | **Interface** | PTY/terminal | HTTP endpoints |
164
+ | **Input** | `send_and_expect` | HTTP requests |
165
+ | **Output** | Terminal output | HTTP responses |
166
+ | **Setup** | Create test repo | Create test repo + start web server |
167
+ | **Isolation** | `--test` flag | `--test` flag |
168
+ | **Speed** | Fast | Medium (HTTP overhead) |
169
+ | **Realism** | Terminal interaction | Web browser interaction |
170
+
171
+ ## Benefits
172
+
173
+ 1. **Real HTTP Testing** - Tests actual web requests/responses
174
+ 2. **End-to-End Validation** - Tests complete web stack
175
+ 3. **Browser-Like Behavior** - Simulates real user interactions
176
+ 4. **Test Mode Verification** - Ensures test isolation works
177
+ 5. **Workflow Coverage** - Tests complete user journeys
178
+ 6. **Error Handling** - Verifies proper error responses
179
+ 7. **Integration Testing** - Tests web app + API working together
180
+
181
+ ## Future Enhancements
182
+
183
+ - **File Upload Testing** - Test asset upload functionality
184
+ - **Session Management** - Test user sessions and authentication
185
+ - **AJAX Testing** - Test dynamic content loading
186
+ - **Performance Testing** - Response time and load testing
187
+ - **Browser Testing** - Integration with headless browsers
188
+ - **API Testing** - Direct API endpoint testing
189
+
190
+ ## Dependencies
191
+
192
+ - **Minitest** - Testing framework
193
+ - **Net::HTTP** - HTTP client for testing
194
+ - **JSON** - Response parsing
195
+ - **FileUtils** - File system operations
196
+ - **Scriptorium::Helpers** - Project helper functions
data/test/all ADDED
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Set up environment
4
+ ENV['PATH'] = "#{ENV['HOME']}/.rbenv/shims:#{ENV['PATH']}"
5
+
6
+ def delete(path)
7
+ if Dir.exist?(path)
8
+ puts "Deleting: #{path}"
9
+ system("rm -rf #{path}")
10
+ end
11
+ end
12
+
13
+ t0 = Time.now
14
+ puts "Starting at: #{t0}"
15
+ t1 = t0 + 500
16
+ puts "Finish ETA : #{t1}"
17
+
18
+ puts
19
+ puts "Killing server..."
20
+
21
+ system("lsof -ti:4567 | xargs kill -9")
22
+
23
+ puts
24
+
25
+ test_repos = %w[scriptorium-TEST test/scriptorium-TEST ui/web/scriptorium-TEST]
26
+
27
+ test_repos.each {|repo| delete(repo) }
28
+
29
+ require 'minitest/autorun'
30
+
31
+ puts "\n" + "="*60
32
+ puts "Running all Scriptorium tests..."
33
+ puts "="*60
34
+
35
+ # Initialize global to track which test files have printed their name
36
+ $printed_files = []
37
+
38
+ # Automatically find and load all test files
39
+ test_files = %w[
40
+ unit/api.rb
41
+ unit/post.rb
42
+ unit/repo.rb
43
+ unit/view.rb
44
+ unit/widgets.rb
45
+ unit/read_commented_file_test.rb
46
+ unit/asset_management.rb
47
+ unit/gem_asset_management.rb
48
+ unit/reddit_test.rb
49
+ unit/clipboard_test.rb
50
+ unit/deploy_test.rb
51
+ unit/deploy_config_test.rb
52
+ unit/permalink_copy_test.rb
53
+ unit/post_state_helpers_test.rb
54
+ unit/edit_post_test.rb
55
+ unit/contract_test.rb
56
+ unit/social_test.rb
57
+ unit/livetext_compatibility.rb
58
+ unit/livetext_basic.rb
59
+ unit/syntax_highlighting.rb
60
+ banner_svg/simple_helpers.rb
61
+ banner_svg/unit.rb
62
+ integration/integration_test.rb
63
+ integration/preview_flow_test.rb
64
+ livetext_plugin_test.rb
65
+ unit/core.rb
66
+ unit/post_index_config_test.rb
67
+ unit/parse_cmd_test.rb
68
+ unit/backup_test.rb
69
+ unit/theme_management_test.rb
70
+ ed_test.rb
71
+ tui_integration_test.rb
72
+ tui_editor_integration_test.rb
73
+ web_integration_test.rb
74
+ web_workflow_test.rb
75
+ ]
76
+
77
+
78
+ # Load all test files
79
+ test_files.each do |file|
80
+ require_relative file
81
+ rescue => e
82
+ puts "Error loading #{file}: #{e.message}"
83
+ end
data/test/api_demo.rb ADDED
@@ -0,0 +1,99 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/scriptorium'
4
+
5
+ # Demo of select_posts and search_posts methods
6
+ puts "=== Scriptorium API Demo: Post Selection and Search ===\n"
7
+
8
+ api = Scriptorium::API.new(true)
9
+
10
+ # Create some test data
11
+ api.create_view_and_use("blog", "My Blog")
12
+ api.create_view("tech", "Tech Posts")
13
+
14
+ # Create posts with different content
15
+ api.create_post("Ruby Programming Guide", "Learn Ruby basics and advanced features", tags: "ruby, programming, tutorial")
16
+ api.create_post("Python vs Ruby", "Comparing Python and Ruby for web development", tags: "python, ruby, comparison")
17
+ api.create_post("Scriptorium API Documentation", "Complete guide to the Scriptorium API", tags: "api, documentation, scriptorium")
18
+ api.create_post("Web Development Tips", "Best practices for modern web development", tags: "web, tips, development")
19
+
20
+ puts "Created 4 posts with various content\n"
21
+
22
+ # Demo select_posts with block filtering
23
+ puts "\n=== select_posts Examples ==="
24
+
25
+ # Filter posts by title containing "Ruby"
26
+ ruby_posts = api.select_posts { |post| post.title.include?("Ruby") }
27
+ puts "Posts with 'Ruby' in title: #{ruby_posts.map(&:title).join(', ')}"
28
+
29
+ # Filter posts by tags containing "api"
30
+ api_posts = api.select_posts { |post| post.tags.include?("api") }
31
+ puts "Posts tagged with 'api': #{api_posts.map(&:title).join(', ')}"
32
+
33
+ # Filter posts by title length
34
+ long_title_posts = api.select_posts { |post| post.title.length > 20 }
35
+ puts "Posts with long titles: #{long_title_posts.map(&:title).join(', ')}"
36
+
37
+ # Demo search_posts with keyword criteria
38
+ puts "\n=== search_posts Examples ==="
39
+
40
+ # Search by title with regex
41
+ ruby_title_posts = api.search_posts(title: /Ruby/)
42
+ puts "Posts with 'Ruby' in title (regex): #{ruby_title_posts.map(&:title).join(', ')}"
43
+
44
+ # Search by body content
45
+ body_posts = api.search_posts(body: "development")
46
+ puts "Posts with 'development' in body: #{body_posts.map(&:title).join(', ')}"
47
+
48
+ # Search by tags
49
+ tagged_posts = api.search_posts(tags: "programming")
50
+ puts "Posts tagged with 'programming': #{tagged_posts.map(&:title).join(', ')}"
51
+
52
+ # Multiple criteria (AND)
53
+ multi_posts = api.search_posts(title: /Ruby/, body: "basics")
54
+ puts "Posts with 'Ruby' in title AND 'basics' in body: #{multi_posts.map(&:title).join(', ')}"
55
+
56
+ # Demo with blurb (create a post with blurb)
57
+ puts "\n=== search_posts with Blurb ==="
58
+ api.create_post("Ruby Deep Dive", "Advanced Ruby concepts", blurb: "This is a comprehensive guide to Ruby programming.")
59
+
60
+ blurb_posts = api.search_posts(blurb: "comprehensive")
61
+ puts "Posts with 'comprehensive' in blurb: #{blurb_posts.map(&:title).join(', ')}"
62
+
63
+ # Demo draft management
64
+ puts "\n=== Draft Management ==="
65
+ draft_path = api.draft(title: "Temporary Draft", body: "This will be deleted")
66
+ puts "Created draft: #{draft_path}"
67
+
68
+ drafts = api.drafts
69
+ puts "Drafts before deletion: #{drafts.length}"
70
+
71
+ api.delete_draft(draft_path)
72
+ drafts = api.drafts
73
+ puts "Drafts after deletion: #{drafts.length}"
74
+
75
+ # Demo generate_view
76
+ puts "\n=== Generate View ==="
77
+ result = api.generate_view
78
+ puts "Generated view content: #{result}"
79
+
80
+ # Demo widget generation
81
+ puts "\n=== Widget Generation ==="
82
+
83
+ # Create widget directory and sample data in the current view
84
+ widget_dir = api.repo.root/:views/api.current_view.name/:widgets/"links"
85
+ FileUtils.mkdir_p(widget_dir)
86
+ File.write(widget_dir/"list.txt", "https://ruby-lang.org, Ruby Language\nhttps://github.com, GitHub")
87
+
88
+ result = api.generate_widget("links")
89
+ puts "Generated links widget: #{result}"
90
+
91
+ # Check if widget files were created
92
+ if File.exist?(widget_dir/"links-card.html")
93
+ puts "Widget card file created successfully"
94
+ else
95
+ puts "Widget card file not found"
96
+ end
97
+
98
+ puts "\n=== Demo Complete ==="
99
+ api.destroy
Binary file
Binary file
@@ -0,0 +1,27 @@
1
+ # Test Images for BannerSVG
2
+
3
+ This directory contains test images for verifying image background functionality in BannerSVG.
4
+
5
+ ## Expected Images
6
+
7
+ | Filename | Size | Aspect | Purpose |
8
+ |----------|------|--------|---------|
9
+ | `perfect.png` | 800x100 | 8:1 | Ideal case - matches default banner aspect |
10
+ | `wide.png` | 800x50 | 16:1 | Tests left/right cropping |
11
+ | `tall.png` | 100x100 | 1:1 | Tests top/bottom cropping |
12
+ | `very_tall.png` | 100x400 | 1:4 | Tests extreme vertical cropping |
13
+ | `very_wide.png` | 1600x100 | 16:1 | Tests extreme horizontal cropping |
14
+ | `small.png` | 200x25 | 8:1 | Tests scaling up of small images |
15
+ | `odd_aspect.png` | 500x123 | ~4:1 | Tests non-integer aspect ratios |
16
+
17
+ ## Expected Behavior
18
+
19
+ - **Perfect match**: Image should display without cropping
20
+ - **Wide images**: Should crop left/right, center the image
21
+ - **Tall images**: Should crop top/bottom, center the image
22
+ - **Small images**: Should scale up to fill the banner
23
+ - **All images**: Should use `preserveAspectRatio="xMidYMid slice"` for cropping
24
+
25
+ ## Manual Testing
26
+
27
+ Run `ruby test/manual/test_banner_features.rb` to see these images in action with different banner configurations.
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,13 @@
1
+ module SimpleTestHelpers
2
+ def assert_present(str, *targets)
3
+ result = true
4
+ missing = []
5
+ targets.each do |t|
6
+ if ! str.include?(t)
7
+ result = false
8
+ missing << t
9
+ end
10
+ end
11
+ assert result, "Targets missing: #{missing.join(", ").inspect}"
12
+ end
13
+ end