scriptorium 0.0.3 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) 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/back-icon.png +0 -0
  7. data/assets/icons/facebook.svg +1 -0
  8. data/assets/icons/github.svg +1 -0
  9. data/assets/icons/instagram.svg +1 -0
  10. data/assets/icons/reddit.svg +1 -0
  11. data/assets/icons/ui/.DS_Store +0 -0
  12. data/assets/icons/ui/back.png +0 -0
  13. data/assets/icons/ui/copy.png +0 -0
  14. data/assets/icons/ui/down.png +0 -0
  15. data/assets/icons/ui/end.png +0 -0
  16. data/assets/icons/ui/exit.png +0 -0
  17. data/assets/icons/ui/foo +10 -0
  18. data/assets/icons/ui/home.png +0 -0
  19. data/assets/icons/ui/left.png +0 -0
  20. data/assets/icons/ui/next.png +0 -0
  21. data/assets/icons/ui/right.png +0 -0
  22. data/assets/icons/ui/start.png +0 -0
  23. data/assets/icons/ui/up.png +0 -0
  24. data/assets/icons/x.svg +1 -0
  25. data/assets/icons/youtube.svg +1 -0
  26. data/assets/samples/placeholder.svg +9 -0
  27. data/assets/themes/standard/favicon.svg +6 -0
  28. data/bin/scriptorium +1511 -0
  29. data/doc/README.txt +6 -0
  30. data/doc/anti-amnesia/20250727-054000-scriptorium-overview.md +95 -0
  31. data/doc/anti-amnesia/20250727-060000-api-design-tui-planning.md +34 -0
  32. data/doc/anti-amnesia/20250727-061000-runeblog-tui-analysis.md +50 -0
  33. data/doc/anti-amnesia/20250727-123000-anti-amnesia-conventions.md +31 -0
  34. data/doc/anti-amnesia/20250727-154000-livetext-plugin-file-stats.md +73 -0
  35. data/doc/anti-amnesia/20250727-172600-cursor-rbenv-ruby-version-mystery.md +64 -0
  36. data/doc/anti-amnesia/20250727-172600-unified-minitest-framework.md +70 -0
  37. data/doc/anti-amnesia/20250727-172900-ai-cognitive-assessment-capabilities.md +40 -0
  38. data/doc/anti-amnesia/20250727-173000-widget-testing-achievement.md +110 -0
  39. data/doc/anti-amnesia/20250727-180000-post-id-num-refactoring.md +73 -0
  40. data/doc/anti-amnesia/20250728-124243-aaa-syntax-clarification.md +46 -0
  41. data/doc/anti-amnesia/20250728-124421-conversation-summary-concise.md +124 -0
  42. data/doc/anti-amnesia/20250729-190000-scriptorium-tui-testing-complete.md +46 -0
  43. data/doc/anti-amnesia/20250729-200000-scriptorium-tui-testing-edit-file-workflow.md +97 -0
  44. data/doc/anti-amnesia/20250729-210000-reddit-autopost-integration-complete.md +158 -0
  45. data/doc/anti-amnesia/20250729-211500-dependency-management-system.md +211 -0
  46. data/doc/anti-amnesia/20250729-213000-python-virtual-environment-setup.md +141 -0
  47. data/doc/anti-amnesia/20250729-214500-theme-management-commands.md +211 -0
  48. data/doc/anti-amnesia/20250729-215000-version-update-to-0.6.0.md +134 -0
  49. data/doc/anti-amnesia/20250729-220000-user-guide-complete.md +41 -0
  50. data/doc/anti-amnesia/20250804-190500-cognitive-loop-bug.md +45 -0
  51. data/doc/anti-amnesia/20250804-190700-anti-amnesia-timestamping-fix.md +30 -0
  52. data/doc/anti-amnesia/20250804-213700-publishing-test-fix.md +49 -0
  53. data/doc/anti-amnesia/20250804-214400-additional-test-fixes.md +46 -0
  54. data/doc/anti-amnesia/20250804-220000-asset-function-logic-clarification.md +41 -0
  55. data/doc/anti-amnesia/20250806-202032-asset-function-logic-clarification.md +41 -0
  56. data/doc/anti-amnesia/20250807-213025.md +116 -0
  57. data/doc/anti-amnesia/20250813-082428-syntax-highlighting-and-navigation-improvements.md +256 -0
  58. data/doc/banner_svg_config.md +114 -0
  59. data/doc/contrib.lt3 +8 -0
  60. data/doc/dependencies.md +281 -0
  61. data/doc/hacker.lt3 +5 -0
  62. data/doc/reddit_credentials_template.json +8 -0
  63. data/doc/reddit_integration.md +207 -0
  64. data/doc/user.lt3 +38 -0
  65. data/doc/user_guide_section_1.md +137 -0
  66. data/doc/user_guide_section_10.md +515 -0
  67. data/doc/user_guide_section_11.md +708 -0
  68. data/doc/user_guide_section_2.md +233 -0
  69. data/doc/user_guide_section_3.md +5 -0
  70. data/doc/user_guide_section_4.md +221 -0
  71. data/doc/user_guide_section_5.md +243 -0
  72. data/doc/user_guide_section_6.md +147 -0
  73. data/doc/user_guide_section_7.md +311 -0
  74. data/doc/user_guide_section_8.md +224 -0
  75. data/doc/user_guide_section_9.md +375 -0
  76. data/doc/userdoc-toc.txt +88 -0
  77. data/lib/rouge/lexers/livetext.rb +74 -0
  78. data/lib/scriptorium/api.rb +640 -0
  79. data/lib/scriptorium/banner_svg.rb +742 -0
  80. data/lib/scriptorium/contract.rb +33 -0
  81. data/lib/scriptorium/exceptions.rb +170 -1
  82. data/lib/scriptorium/helpers.rb +475 -0
  83. data/lib/scriptorium/post.rb +195 -0
  84. data/lib/scriptorium/reddit.rb +83 -0
  85. data/lib/scriptorium/repo.rb +624 -0
  86. data/lib/scriptorium/standard_files.rb +515 -0
  87. data/lib/scriptorium/syntax_highlighter.rb +234 -0
  88. data/lib/scriptorium/theme.rb +179 -0
  89. data/lib/scriptorium/version.rb +2 -2
  90. data/lib/scriptorium/view.rb +976 -0
  91. data/lib/scriptorium/widgets/featured_posts.rb +149 -0
  92. data/lib/scriptorium/widgets/links.rb +112 -0
  93. data/lib/scriptorium/widgets/pages.rb +133 -0
  94. data/lib/scriptorium/widgets/widget.rb +133 -0
  95. data/lib/scriptorium.rb +21 -40
  96. data/lib/skeleton.rb +8 -2
  97. data/scriptorium.gemspec +15 -4
  98. data/test/README.md +69 -0
  99. data/test/all +43 -0
  100. data/test/api_demo.rb +99 -0
  101. data/test/assets/imagenotfound.jpg +0 -0
  102. data/test/assets/images/.DS_Store +0 -0
  103. data/test/assets/images/README.md +27 -0
  104. data/test/assets/images/odd_aspect.png +0 -0
  105. data/test/assets/images/perfect.png +0 -0
  106. data/test/assets/images/small.png +0 -0
  107. data/test/assets/images/tall.png +0 -0
  108. data/test/assets/images/very_tall.png +0 -0
  109. data/test/assets/images/very_wide.png +0 -0
  110. data/test/assets/images/wide.png +0 -0
  111. data/test/assets/testbanner.jpg +0 -0
  112. data/test/banner_svg/simple_helpers.rb +13 -0
  113. data/test/banner_svg/unit.rb +768 -0
  114. data/test/ed_test.rb +204 -0
  115. data/test/integration/cursor_banner_combinations.rb +193 -0
  116. data/test/integration/cursor_banner_features.rb +374 -0
  117. data/test/integration/integration_test.rb +326 -0
  118. data/test/livetext_plugin_test.rb +229 -0
  119. data/test/manual/asset_mgmt.rb +67 -0
  120. data/test/manual/banner-tests/config.txt +3 -0
  121. data/test/manual/banner-tests/index.html +45 -0
  122. data/test/manual/banner-tests/test01.html +58 -0
  123. data/test/manual/banner-tests/test02.html +58 -0
  124. data/test/manual/banner-tests/test03.html +58 -0
  125. data/test/manual/banner-tests/test04.html +65 -0
  126. data/test/manual/banner-tests/test05.html +65 -0
  127. data/test/manual/banner-tests/test06.html +65 -0
  128. data/test/manual/banner-tests/test07.html +65 -0
  129. data/test/manual/banner-tests/test08.html +59 -0
  130. data/test/manual/banner-tests/test09.html +59 -0
  131. data/test/manual/banner-tests/test10.html +59 -0
  132. data/test/manual/banner-tests/test11.html +59 -0
  133. data/test/manual/banner-tests/test12.html +59 -0
  134. data/test/manual/banner-tests/test13.html +59 -0
  135. data/test/manual/banner-tests/test14.html +59 -0
  136. data/test/manual/banner-tests/test15.html +58 -0
  137. data/test/manual/banner-tests/test16.html +58 -0
  138. data/test/manual/banner-tests/test17.html +58 -0
  139. data/test/manual/banner-tests/test18.html +68 -0
  140. data/test/manual/banner-tests/test19.html +68 -0
  141. data/test/manual/banner-tests/test20.html +68 -0
  142. data/test/manual/banner-tests/test21.html +68 -0
  143. data/test/manual/banner-tests/test22.html +68 -0
  144. data/test/manual/banner-tests/test23.html +68 -0
  145. data/test/manual/banner-tests/test24.html +68 -0
  146. data/test/manual/banner-tests/test25.html +67 -0
  147. data/test/manual/banner_environment.rb +192 -0
  148. data/test/manual/deploy_symlink_demo.rb +142 -0
  149. data/test/manual/environment.rb +67 -0
  150. data/test/manual/make_banner.rb +153 -0
  151. data/test/manual/sample_banner_config.txt +12 -0
  152. data/test/manual/symlink_demo.rb +117 -0
  153. data/test/manual/test1.rb +47 -0
  154. data/test/manual/test2.rb +12 -0
  155. data/test/manual/test3.rb +38 -0
  156. data/test/manual/test4.rb +40 -0
  157. data/test/manual/test5.rb +24 -0
  158. data/test/manual/test6.rb +73 -0
  159. data/test/manual/test_banner_combinations.rb +120 -0
  160. data/test/manual/test_banner_features.rb +306 -0
  161. data/test/manual/test_banner_from_file.rb +150 -0
  162. data/test/manual/test_banner_in_header.rb +35 -0
  163. data/test/manual/test_code_highlighting.rb +68 -0
  164. data/test/manual/test_complex_header.rb +74 -0
  165. data/test/manual/test_empty_header.rb +32 -0
  166. data/test/manual/test_radial_custom.rb +58 -0
  167. data/test/manual/test_radial_large_radius.rb +52 -0
  168. data/test/manual/test_svg_debug.rb +47 -0
  169. data/test/manual/test_syntax_highlighting.rb +147 -0
  170. data/test/pages-demo/config/currentview.txt +1 -0
  171. data/test/pages-demo/views/demo/config/bootstrap_css.txt +5 -0
  172. data/test/pages-demo/views/demo/config/bootstrap_js.txt +4 -0
  173. data/test/pages-demo/views/demo/config/common.js +57 -0
  174. data/test/pages-demo/views/demo/config/footer.txt +1 -0
  175. data/test/pages-demo/views/demo/config/global-head.txt +8 -0
  176. data/test/pages-demo/views/demo/config/header.txt +1 -0
  177. data/test/pages-demo/views/demo/config/layout.txt +1 -0
  178. data/test/pages-demo/views/demo/config/left.txt +1 -0
  179. data/test/pages-demo/views/demo/config/main.txt +1 -0
  180. data/test/pages-demo/views/demo/config/right.txt +1 -0
  181. data/test/pages-demo/views/demo/config.txt +3 -0
  182. data/test/pages-demo/views/demo/output/panes/footer.html +1 -0
  183. data/test/pages-demo/views/demo/output/panes/header.html +1 -0
  184. data/test/pages-demo/views/demo/output/panes/left.html +1 -0
  185. data/test/pages-demo/views/demo/output/panes/main.html +1 -0
  186. data/test/pages-demo/views/demo/output/panes/right.html +1 -0
  187. data/test/rubytext/rubytext_comprehensive_test.rb +307 -0
  188. data/test/rubytext/rubytext_demo_test.rb +42 -0
  189. data/test/rubytext/rubytext_testing_guide.md +277 -0
  190. data/test/run_automated_tests.rb +45 -0
  191. data/test/scriptorium-TEST-1754622690-146/config/bootstrap_css.txt +5 -0
  192. data/test/scriptorium-TEST-1754622690-146/config/bootstrap_js.txt +4 -0
  193. data/test/scriptorium-TEST-1754622690-146/config/common.js +57 -0
  194. data/test/scriptorium-TEST-1754622690-146/config/currentview.txt +1 -0
  195. data/test/scriptorium-TEST-1754622690-146/config/global-head.txt +9 -0
  196. data/test/scriptorium-TEST-1754622690-146/config/last_post_num.txt +1 -0
  197. data/test/scriptorium-TEST-1754622690-146/config/os_helpers.rb +4 -0
  198. data/test/scriptorium-TEST-1754622690-146/config/widgets.txt +3 -0
  199. data/test/scriptorium-TEST-1754622690-146/posts/0001/meta.txt +8 -0
  200. data/test/scriptorium-TEST-1754622690-146/posts/0001/source.lt3 +6 -0
  201. data/test/scriptorium-TEST-1754622690-146/themes/standard/README.txt +1 -0
  202. data/test/scriptorium-TEST-1754622690-146/themes/standard/config.txt +1 -0
  203. data/test/scriptorium-TEST-1754622690-146/themes/standard/initial/post.lt3 +12 -0
  204. data/test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/footer.txt +2 -0
  205. data/test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/header.txt +4 -0
  206. data/test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/left.txt +3 -0
  207. data/test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/main.txt +5 -0
  208. data/test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/right.txt +3 -0
  209. data/test/scriptorium-TEST-1754622690-146/themes/standard/layout/gen/text.css +1 -0
  210. data/test/scriptorium-TEST-1754622690-146/themes/standard/layout/layout.txt +5 -0
  211. data/test/scriptorium-TEST-1754622690-146/themes/standard/templates/index.lt3 +1 -0
  212. data/test/scriptorium-TEST-1754622690-146/themes/standard/templates/index_entry.lt3 +14 -0
  213. data/test/scriptorium-TEST-1754622690-146/themes/standard/templates/post.lt3 +13 -0
  214. data/test/scriptorium-TEST-1754622690-146/themes/standard/templates/widget.lt3 +1 -0
  215. data/test/scriptorium-TEST-1754622690-146/views/sample/config/bootstrap_css.txt +5 -0
  216. data/test/scriptorium-TEST-1754622690-146/views/sample/config/bootstrap_js.txt +4 -0
  217. data/test/scriptorium-TEST-1754622690-146/views/sample/config/common.js +57 -0
  218. data/test/scriptorium-TEST-1754622690-146/views/sample/config/deploy.txt +5 -0
  219. data/test/scriptorium-TEST-1754622690-146/views/sample/config/footer.txt +2 -0
  220. data/test/scriptorium-TEST-1754622690-146/views/sample/config/global-head.txt +9 -0
  221. data/test/scriptorium-TEST-1754622690-146/views/sample/config/header.txt +4 -0
  222. data/test/scriptorium-TEST-1754622690-146/views/sample/config/layout.txt +5 -0
  223. data/test/scriptorium-TEST-1754622690-146/views/sample/config/left.txt +3 -0
  224. data/test/scriptorium-TEST-1754622690-146/views/sample/config/main.txt +5 -0
  225. data/test/scriptorium-TEST-1754622690-146/views/sample/config/reddit.txt +10 -0
  226. data/test/scriptorium-TEST-1754622690-146/views/sample/config/right.txt +3 -0
  227. data/test/scriptorium-TEST-1754622690-146/views/sample/config/social.txt +7 -0
  228. data/test/scriptorium-TEST-1754622690-146/views/sample/config/status.txt +7 -0
  229. data/test/scriptorium-TEST-1754622690-146/views/sample/config.txt +3 -0
  230. data/test/scriptorium-TEST-1754622690-146/views/sample/layout/footer.html +3 -0
  231. data/test/scriptorium-TEST-1754622690-146/views/sample/layout/header.html +3 -0
  232. data/test/scriptorium-TEST-1754622690-146/views/sample/layout/left.html +3 -0
  233. data/test/scriptorium-TEST-1754622690-146/views/sample/layout/main.html +3 -0
  234. data/test/scriptorium-TEST-1754622690-146/views/sample/layout/right.html +3 -0
  235. data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/footer.html +1 -0
  236. data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/header.html +1 -0
  237. data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/left.html +1 -0
  238. data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/main.html +1 -0
  239. data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/right.html +1 -0
  240. data/test/staging/.DS_Store +0 -0
  241. data/test/syntax_highlighting_test.lt3 +124 -0
  242. data/test/test_helpers.rb +230 -0
  243. data/test/tui_editor_integration_test.rb +296 -0
  244. data/test/tui_integration_test.rb +637 -0
  245. data/test/unit/api.rb +1056 -0
  246. data/test/unit/asset_management.rb +245 -0
  247. data/test/unit/clipboard_test.rb +60 -0
  248. data/test/unit/contract_test.rb +91 -0
  249. data/test/unit/core.rb +857 -0
  250. data/test/unit/deploy_test.rb +187 -0
  251. data/test/unit/gem_asset_management.rb +189 -0
  252. data/test/unit/livetext_basic.rb +69 -0
  253. data/test/unit/livetext_compatibility.rb +89 -0
  254. data/test/unit/post.rb +244 -0
  255. data/test/unit/read_commented_file_test.rb +276 -0
  256. data/test/unit/reddit_test.rb +235 -0
  257. data/test/unit/repo.rb +548 -0
  258. data/test/unit/social_test.rb +369 -0
  259. data/test/unit/symlink_test.rb +213 -0
  260. data/test/unit/view.rb +431 -0
  261. data/test/unit/widgets.rb +669 -0
  262. data/test/wizard_test.rb +123 -0
  263. data/ui/README.md +67 -0
  264. data/ui/common/lib/ui_common.rb +8 -0
  265. data/ui/rubytext/README.md +191 -0
  266. data/ui/rubytext/bin/scriptorium-rubytext +402 -0
  267. data/ui/rubytext/lib/rubytext_ui.rb +300 -0
  268. data/ui/tui/bin/scriptorium +1420 -0
  269. data/ui/tui/test/tui_test.rb +23 -0
  270. data/ui/web/app/app.rb +1378 -0
  271. data/ui/web/app/error_helpers.rb +150 -0
  272. data/ui/web/app/views/advanced_config.erb +190 -0
  273. data/ui/web/app/views/asset_management.erb +589 -0
  274. data/ui/web/app/views/banner_config.erb +200 -0
  275. data/ui/web/app/views/configure_view.erb +401 -0
  276. data/ui/web/app/views/dashboard.erb +162 -0
  277. data/ui/web/app/views/deploy_config.erb +146 -0
  278. data/ui/web/app/views/edit_pages.erb +195 -0
  279. data/ui/web/app/views/edit_post.erb +54 -0
  280. data/ui/web/app/views/error_page.erb +29 -0
  281. data/ui/web/app/views/header_config.erb +155 -0
  282. data/ui/web/app/views/layout_config.erb +147 -0
  283. data/ui/web/app/views/navbar_config.erb +411 -0
  284. data/ui/web/app/views/view_dashboard.erb +138 -0
  285. data/ui/web/bin/scriptorium-web +153 -0
  286. data/ui/web/test/web_basic_test.rb +38 -0
  287. data/ui/web/test_navbar.txt +7 -0
  288. data/ui/web/tmp/web_server.log +5 -0
  289. data/ui/web/tmp/web_server.pid +1 -0
  290. metadata +359 -7
  291. data/lib/scriptorium/engine.rb +0 -22
  292. 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
+ ```
data/test/all ADDED
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Set up environment
4
+ ENV['PATH'] = "#{ENV['HOME']}/.rbenv/shims:#{ENV['PATH']}"
5
+
6
+ require 'minitest/autorun'
7
+
8
+ puts "\n" + "="*60
9
+ puts "Running all Scriptorium tests..."
10
+ puts "="*60
11
+
12
+ # Initialize global to track which test files have printed their name
13
+ $printed_files = []
14
+
15
+ # Automatically find and load all test files
16
+ test_files = %w[
17
+ unit/api.rb
18
+ unit/post.rb
19
+ unit/repo.rb
20
+ unit/view.rb
21
+ unit/widgets.rb
22
+ unit/read_commented_file_test.rb
23
+ unit/asset_management.rb
24
+ unit/gem_asset_management.rb
25
+ unit/reddit_test.rb
26
+ unit/clipboard_test.rb
27
+ banner_svg/simple_helpers.rb
28
+ banner_svg/unit.rb
29
+ integration/integration_test.rb
30
+ livetext_plugin_test.rb
31
+ unit/core.rb
32
+ ed_test.rb
33
+ tui_integration_test.rb
34
+ tui_editor_integration_test.rb
35
+ ]
36
+
37
+
38
+ # Load all test files
39
+ test_files.each do |file|
40
+ require_relative file
41
+ rescue => e
42
+ puts "Error loading #{file}: #{e.message}"
43
+ 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