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.
- checksums.yaml +4 -4
- data/README.lt3 +324 -0
- data/README.md +3155 -1
- data/assets/.DS_Store +0 -0
- data/assets/README.md +44 -0
- data/assets/icons/social/reddit.png +0 -0
- data/assets/icons/social/x-logo.png +0 -0
- data/assets/icons/ui/.DS_Store +0 -0
- data/assets/icons/ui/back.png +0 -0
- data/assets/icons/ui/copy.png +0 -0
- data/assets/icons/ui/down.png +0 -0
- data/assets/icons/ui/end.png +0 -0
- data/assets/icons/ui/exit.png +0 -0
- data/assets/icons/ui/foo +10 -0
- data/assets/icons/ui/home.png +0 -0
- data/assets/icons/ui/left.png +0 -0
- data/assets/icons/ui/next.png +0 -0
- data/assets/icons/ui/right.png +0 -0
- data/assets/icons/ui/start.png +0 -0
- data/assets/icons/ui/up.png +0 -0
- data/assets/imagenotfound.jpg +0 -0
- data/assets/samples/placeholder.svg +9 -0
- data/assets/themes/standard/favicon.svg +6 -0
- data/bin/sblog +84 -5
- data/bin/scriptorium +1 -0
- data/doc/README.txt +6 -0
- data/doc/anti-amnesia/20250727-054000-scriptorium-overview.md +94 -0
- data/doc/anti-amnesia/20250727-123000-anti-amnesia-conventions.md +2 -0
- data/doc/anti-amnesia/20250727-172600-cursor-rbenv-ruby-version-mystery.md +45 -0
- data/doc/anti-amnesia/20250727-172900-ai-cognitive-assessment-capabilities.md +40 -0
- data/doc/anti-amnesia/20250728-124243-aaa-syntax-clarification.md +46 -0
- data/doc/anti-amnesia/20250729-210000-reddit-autopost-integration-complete.md +158 -0
- data/doc/anti-amnesia/20250804-190500-cognitive-loop-bug.md +35 -0
- data/doc/anti-amnesia/20250804-190700-anti-amnesia-timestamping-fix.md +27 -0
- data/doc/anti-amnesia/20250807-213025.md +116 -0
- data/doc/anti-amnesia/20250901-211714-codemirror-integration-and-web-tests.md +172 -0
- data/doc/anti-amnesia/20250902-002402-backup-restore-system.md +126 -0
- data/doc/anti-amnesia/20250907-203339-backup-metadata-implementation.md +66 -0
- data/doc/banner_svg_config.md +114 -0
- data/doc/contrib.lt3 +8 -0
- data/doc/dependencies.md +281 -0
- data/doc/hacker.lt3 +5 -0
- data/doc/imported/0001-elixir-conf-2014/metadata.txt +7 -0
- data/doc/imported/0001-elixir-conf-2014/post.html +37 -0
- data/doc/imported/0001-elixir-conf-2014/source.lt3 +22 -0
- data/doc/imported/0002-programmers-and-word-processing/metadata.txt +7 -0
- data/doc/imported/0002-programmers-and-word-processing/post.html +192 -0
- data/doc/imported/0002-programmers-and-word-processing/source.lt3 +146 -0
- data/doc/imported/0003-how-to-turn-your-brain-sideways/metadata.txt +7 -0
- data/doc/imported/0003-how-to-turn-your-brain-sideways/post.html +60 -0
- data/doc/imported/0003-how-to-turn-your-brain-sideways/source.lt3 +40 -0
- data/doc/imported/0004-upcoming-lone-star-ruby-conference/metadata.txt +7 -0
- data/doc/imported/0004-upcoming-lone-star-ruby-conference/post.html +42 -0
- data/doc/imported/0004-upcoming-lone-star-ruby-conference/source.lt3 +24 -0
- data/doc/imported/0005-elixir-conf-2015-announced/metadata.txt +7 -0
- data/doc/imported/0005-elixir-conf-2015-announced/post.html +30 -0
- data/doc/imported/0005-elixir-conf-2015-announced/source.lt3 +16 -0
- data/doc/imported/0006-ruby-for-dinosaurs/metadata.txt +7 -0
- data/doc/imported/0006-ruby-for-dinosaurs/post.html +43 -0
- data/doc/imported/0006-ruby-for-dinosaurs/source.lt3 +27 -0
- data/doc/imported/0007-phoenix-isnt-rails/metadata.txt +7 -0
- data/doc/imported/0007-phoenix-isnt-rails/post.html +116 -0
- data/doc/imported/0007-phoenix-isnt-rails/source.lt3 +87 -0
- data/doc/imported/0008-concerning-the-term-monkeypatching/metadata.txt +7 -0
- data/doc/imported/0008-concerning-the-term-monkeypatching/post.html +129 -0
- data/doc/imported/0008-concerning-the-term-monkeypatching/source.lt3 +92 -0
- data/doc/imported/0009-announcement-coming-soon/metadata.txt +7 -0
- data/doc/imported/0009-announcement-coming-soon/post.html +33 -0
- data/doc/imported/0009-announcement-coming-soon/source.lt3 +19 -0
- data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/metadata.txt +7 -0
- data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/post.html +175 -0
- data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/source.lt3 +139 -0
- data/doc/imported/0011-computer-science-as-a-lost-art/metadata.txt +7 -0
- data/doc/imported/0011-computer-science-as-a-lost-art/post.html +139 -0
- data/doc/imported/0011-computer-science-as-a-lost-art/source.lt3 +104 -0
- data/doc/imported/0012-ruby-day-in-turin-italy/metadata.txt +7 -0
- data/doc/imported/0012-ruby-day-in-turin-italy/post.html +42 -0
- data/doc/imported/0012-ruby-day-in-turin-italy/source.lt3 +24 -0
- data/doc/imported/0013-rubyday-was-a-success/metadata.txt +7 -0
- data/doc/imported/0013-rubyday-was-a-success/post.html +44 -0
- data/doc/imported/0013-rubyday-was-a-success/source.lt3 +27 -0
- data/doc/imported/0014-working-on-the-blogging-software/metadata.txt +7 -0
- data/doc/imported/0014-working-on-the-blogging-software/post.html +63 -0
- data/doc/imported/0014-working-on-the-blogging-software/source.lt3 +41 -0
- data/doc/imported/0015-ok-its-not-really-a-lost-art/metadata.txt +7 -0
- data/doc/imported/0015-ok-its-not-really-a-lost-art/post.html +172 -0
- data/doc/imported/0015-ok-its-not-really-a-lost-art/source.lt3 +134 -0
- data/doc/imported/0016-an-in-operator-for-ruby/metadata.txt +7 -0
- data/doc/imported/0016-an-in-operator-for-ruby/post.html +155 -0
- data/doc/imported/0016-an-in-operator-for-ruby/source.lt3 +106 -0
- data/doc/imported/0017-the-forgotten-mathematician/metadata.txt +7 -0
- data/doc/imported/0017-the-forgotten-mathematician/post.html +161 -0
- data/doc/imported/0017-the-forgotten-mathematician/source.lt3 +119 -0
- data/doc/imported/0018-ruby-puns/metadata.txt +7 -0
- data/doc/imported/0018-ruby-puns/post.html +46 -0
- data/doc/imported/0018-ruby-puns/source.lt3 +28 -0
- data/doc/imported/0019-custom-exceptions-via-metaprogramming/metadata.txt +7 -0
- data/doc/imported/0019-custom-exceptions-via-metaprogramming/post.html +138 -0
- data/doc/imported/0019-custom-exceptions-via-metaprogramming/source.lt3 +101 -0
- data/doc/imported/0020-fffff/metadata.txt +7 -0
- data/doc/imported/0020-fffff/post.html +24 -0
- data/doc/imported/0020-fffff/source.lt3 +12 -0
- data/doc/imported/0021-trying-ror-yet-again/metadata.txt +7 -0
- data/doc/imported/0021-trying-ror-yet-again/post.html +26 -0
- data/doc/imported/0021-trying-ror-yet-again/source.lt3 +12 -0
- data/doc/imported/0023-doctor-sleep/metadata.txt +7 -0
- data/doc/imported/0023-doctor-sleep/post.html +63 -0
- data/doc/imported/0023-doctor-sleep/source.lt3 +44 -0
- data/doc/imported/0024-just-a-test/metadata.txt +7 -0
- data/doc/imported/0024-just-a-test/post.html +24 -0
- data/doc/imported/0024-just-a-test/source.lt3 +12 -0
- data/doc/imported/import_summary.txt +98 -0
- data/doc/livetext-informal-spec.txt +65 -0
- data/doc/myuserdoc/ch-0.lt3 +31 -0
- data/doc/myuserdoc/ch-1.lt3 +37 -0
- data/doc/myuserdoc/ch-10.lt3 +22 -0
- data/doc/myuserdoc/ch-2.lt3 +37 -0
- data/doc/myuserdoc/ch-3.lt3 +19 -0
- data/doc/myuserdoc/ch-4.lt3 +43 -0
- data/doc/myuserdoc/ch-5.lt3 +22 -0
- data/doc/myuserdoc/ch-6.lt3 +19 -0
- data/doc/myuserdoc/ch-7.lt3 +16 -0
- data/doc/myuserdoc/ch-8.lt3 +13 -0
- data/doc/myuserdoc/ch-9.lt3 +19 -0
- data/doc/myuserdoc/tweak.rb +18 -0
- data/doc/myuserdoc/userdoc-toc.txt +88 -0
- data/doc/old-posts/0001-elixir-conf-2014.lt3 +24 -0
- data/doc/old-posts/0002-programmers-and-word-processing.lt3 +150 -0
- data/doc/old-posts/0003-how-to-turn-your-brain-sideways.lt3 +43 -0
- data/doc/old-posts/0004-upcoming-lone-star-ruby-conference.lt3 +26 -0
- data/doc/old-posts/0005-elixir-conf-2015-announced.lt3 +17 -0
- data/doc/old-posts/0006-ruby-for-dinosaurs.lt3 +30 -0
- data/doc/old-posts/0007-phoenix-isnt-rails.lt3 +90 -0
- data/doc/old-posts/0008-concerning-the-term-monkeypatching.lt3 +105 -0
- data/doc/old-posts/0009-announcement-coming-soon.lt3 +20 -0
- data/doc/old-posts/0010-immutable-data-ditching-the-wax-tablet.lt3 +142 -0
- data/doc/old-posts/0011-computer-science-as-a-lost-art.lt3 +117 -0
- data/doc/old-posts/0012-ruby-day-in-turin-italy.lt3 +26 -0
- data/doc/old-posts/0013-rubyday-was-a-success.lt3 +28 -0
- data/doc/old-posts/0014-working-on-the-blogging-software.lt3 +42 -0
- data/doc/old-posts/0015-ok-its-not-really-a-lost-art.lt3 +137 -0
- data/doc/old-posts/0016-an-in-operator-for-ruby.lt3 +142 -0
- data/doc/old-posts/0017-the-forgotten-mathematician.lt3 +129 -0
- data/doc/old-posts/0018-ruby-puns.lt3 +31 -0
- data/doc/old-posts/0019-custom-exceptions-via-metaprogramming.lt3 +116 -0
- data/doc/old-posts/0021-trying-ror-yet-again.lt3 +35 -0
- data/doc/old-posts/0023-doctor-sleep.lt3 +43 -0
- data/doc/old-posts/0024-just-a-test.lt3 +12 -0
- data/doc/old-posts/0025-trying-another-post.lt3 +12 -0
- data/doc/old-repo +1 -0
- data/doc/reddit_credentials_template.json +8 -0
- data/doc/reddit_integration.md +207 -0
- data/doc/user.lt3 +35 -0
- data/doc/user_guide_section_1.md +137 -0
- data/doc/user_guide_section_10.md +515 -0
- data/doc/user_guide_section_11.md +708 -0
- data/doc/user_guide_section_2.md +233 -0
- data/doc/user_guide_section_3.md +5 -0
- data/doc/user_guide_section_4.md +221 -0
- data/doc/user_guide_section_5.md +243 -0
- data/doc/user_guide_section_6.md +147 -0
- data/doc/user_guide_section_7.md +311 -0
- data/doc/user_guide_section_8.md +224 -0
- data/doc/user_guide_section_9.md +375 -0
- data/lib/rouge/lexers/livetext.rb +74 -0
- data/lib/scriptorium/api.rb +2373 -0
- data/lib/scriptorium/banner_svg.rb +729 -0
- data/lib/scriptorium/contract.rb +34 -0
- data/lib/scriptorium/exceptions.rb +201 -1
- data/lib/scriptorium/helpers.rb +675 -0
- data/lib/scriptorium/post.rb +259 -0
- data/lib/scriptorium/reddit.rb +83 -0
- data/lib/scriptorium/repo.rb +938 -0
- data/lib/scriptorium/standard_files.rb +149 -0
- data/lib/scriptorium/support/bootstrap/css.txt +5 -0
- data/lib/scriptorium/support/bootstrap/js.txt +4 -0
- data/lib/scriptorium/support/common_js/clipboard.js +35 -0
- data/lib/scriptorium/support/common_js/content-loader.js +187 -0
- data/lib/scriptorium/support/common_js/navigation.js +52 -0
- data/lib/scriptorium/support/common_js/syntax-highlighting.js +27 -0
- data/lib/scriptorium/support/config/reddit.txt +10 -0
- data/lib/scriptorium/support/config/reddit_template.txt +17 -0
- data/lib/scriptorium/support/config/social.txt +8 -0
- data/lib/scriptorium/support/highlight/css.txt +2 -0
- data/lib/scriptorium/support/highlight/custom.css +119 -0
- data/lib/scriptorium/support/highlight/js.txt +1 -0
- data/lib/scriptorium/support/post_index/config.txt +15 -0
- data/lib/scriptorium/support/post_index/style.css +55 -0
- data/lib/scriptorium/support/templates/index_entry.lt3 +16 -0
- data/lib/scriptorium/support/templates/initial_post.lt3 +12 -0
- data/lib/scriptorium/support/templates/layout.txt +5 -0
- data/lib/scriptorium/support/templates/post.lt3 +104 -0
- data/lib/scriptorium/support/theme/footer.lt3 +2 -0
- data/lib/scriptorium/support/theme/header.lt3 +4 -0
- data/lib/scriptorium/support/theme/left.lt3 +3 -0
- data/lib/scriptorium/support/theme/main.lt3 +5 -0
- data/lib/scriptorium/support/theme/right.lt3 +3 -0
- data/lib/scriptorium/theme.rb +192 -0
- data/lib/scriptorium/version.rb +1 -1
- data/lib/scriptorium/view.rb +1021 -0
- data/lib/scriptorium/widgets/featured_posts.rb +149 -0
- data/lib/scriptorium/widgets/links.rb +112 -0
- data/lib/scriptorium/widgets/pages.rb +133 -0
- data/lib/scriptorium/widgets/widget.rb +133 -0
- data/lib/scriptorium.rb +38 -34
- data/lib/skeleton.rb +10 -1
- data/scriptorium.gemspec +17 -5
- data/test/README.md +69 -0
- data/test/WEB_INTEGRATION_README.md +196 -0
- data/test/all +83 -0
- data/test/api_demo.rb +99 -0
- data/test/assets/imagenotfound.jpg +0 -0
- data/test/assets/images/.DS_Store +0 -0
- data/test/assets/images/README.md +27 -0
- data/test/assets/images/odd_aspect.png +0 -0
- data/test/assets/images/perfect.png +0 -0
- data/test/assets/images/small.png +0 -0
- data/test/assets/images/tall.png +0 -0
- data/test/assets/images/very_tall.png +0 -0
- data/test/assets/images/very_wide.png +0 -0
- data/test/assets/images/wide.png +0 -0
- data/test/assets/testbanner.jpg +0 -0
- data/test/banner_svg/simple_helpers.rb +13 -0
- data/test/banner_svg/unit.rb +1000 -0
- data/test/config/deployment.txt +5 -0
- data/test/ed_test.rb +204 -0
- data/test/integration/cursor_banner_combinations.rb +193 -0
- data/test/integration/cursor_banner_features.rb +374 -0
- data/test/integration/integration_test.rb +326 -0
- data/test/integration/preview_flow_test.rb +94 -0
- data/test/livetext_plugin_test.rb +500 -0
- data/test/manual/asset_mgmt.rb +67 -0
- data/test/manual/banner-tests/index.html +45 -0
- data/test/manual/banner-tests/svg.txt +3 -0
- data/test/manual/banner-tests/test01.html +122 -0
- data/test/manual/banner-tests/test02.html +122 -0
- data/test/manual/banner-tests/test03.html +122 -0
- data/test/manual/banner-tests/test04.html +129 -0
- data/test/manual/banner-tests/test05.html +129 -0
- data/test/manual/banner-tests/test06.html +129 -0
- data/test/manual/banner-tests/test07.html +129 -0
- data/test/manual/banner-tests/test08.html +123 -0
- data/test/manual/banner-tests/test09.html +123 -0
- data/test/manual/banner-tests/test10.html +123 -0
- data/test/manual/banner-tests/test11.html +123 -0
- data/test/manual/banner-tests/test12.html +123 -0
- data/test/manual/banner-tests/test13.html +123 -0
- data/test/manual/banner-tests/test14.html +123 -0
- data/test/manual/banner-tests/test15.html +122 -0
- data/test/manual/banner-tests/test16.html +122 -0
- data/test/manual/banner-tests/test17.html +122 -0
- data/test/manual/banner-tests/test18.html +132 -0
- data/test/manual/banner-tests/test19.html +132 -0
- data/test/manual/banner-tests/test20.html +132 -0
- data/test/manual/banner-tests/test21.html +132 -0
- data/test/manual/banner-tests/test22.html +132 -0
- data/test/manual/banner-tests/test23.html +132 -0
- data/test/manual/banner-tests/test24.html +132 -0
- data/test/manual/banner-tests/test25.html +131 -0
- data/test/manual/banner_environment.rb +205 -0
- data/test/manual/codemirror_demo.html +773 -0
- data/test/manual/create_posts_for_web.rb +114 -0
- data/test/manual/environment.rb +67 -0
- data/test/manual/make_banner.rb +153 -0
- data/test/manual/preview_manual_test.rb +129 -0
- data/test/manual/sample_banner_config.txt +12 -0
- data/test/manual/test_advanced_widgets.rb +73 -0
- data/test/manual/test_banner_combinations.rb +120 -0
- data/test/manual/test_banner_features.rb +306 -0
- data/test/manual/test_banner_integration.rb +115 -0
- data/test/manual/test_banner_radial.rb +87 -0
- data/test/manual/test_basic_posts.rb +47 -0
- data/test/manual/test_layout_widgets.rb +40 -0
- data/test/manual/test_pagination.rb +24 -0
- data/test/manual/test_random_posts.rb +38 -0
- data/test/manual/test_syntax_highlighting.rb +167 -0
- data/test/rubytext/rubytext_comprehensive_test.rb +307 -0
- data/test/rubytext/rubytext_demo_test.rb +42 -0
- data/test/rubytext/rubytext_testing_guide.md +277 -0
- data/test/run_automated_tests.rb +45 -0
- data/test/staging/.DS_Store +0 -0
- data/test/support/preview_utils.rb +88 -0
- data/test/syntax_highlighting_test.lt3 +124 -0
- data/test/test_gem_assets.rb +48 -0
- data/test/test_helpers.rb +240 -0
- data/test/tui_editor_integration_test.rb +296 -0
- data/test/tui_integration_test.rb +883 -0
- data/test/unit/api.rb +1776 -0
- data/test/unit/asset_management.rb +219 -0
- data/test/unit/backup_test.rb +451 -0
- data/test/unit/clipboard_test.rb +60 -0
- data/test/unit/contract_test.rb +69 -0
- data/test/unit/core.rb +1211 -0
- data/test/unit/deploy_config_test.rb +248 -0
- data/test/unit/deploy_test.rb +478 -0
- data/test/unit/edit_post_test.rb +168 -0
- data/test/unit/gem_asset_management.rb +183 -0
- data/test/unit/livetext_basic.rb +57 -0
- data/test/unit/livetext_compatibility.rb +82 -0
- data/test/unit/parse_cmd_test.rb +260 -0
- data/test/unit/permalink_copy_test.rb +211 -0
- data/test/unit/post.rb +309 -0
- data/test/unit/post_index_config_test.rb +258 -0
- data/test/unit/post_state_helpers_test.rb +137 -0
- data/test/unit/read_commented_file_test.rb +278 -0
- data/test/unit/reddit_test.rb +235 -0
- data/test/unit/repo.rb +569 -0
- data/test/unit/social_test.rb +366 -0
- data/test/unit/syntax_highlighting.rb +70 -0
- data/test/unit/theme_management_test.rb +91 -0
- data/test/unit/view.rb +498 -0
- data/test/unit/widgets.rb +669 -0
- data/test/web_integration_test.rb +231 -0
- data/test/web_test_helper.rb +218 -0
- data/test/web_workflow_test.rb +527 -0
- data/test/wizard_test.rb +123 -0
- data/ui/README.md +67 -0
- data/ui/common/lib/ui_common.rb +8 -0
- data/ui/rubytext/README.md +191 -0
- data/ui/rubytext/bin/scriptorium-rubytext +402 -0
- data/ui/rubytext/lib/rubytext_ui.rb +300 -0
- data/ui/tui/bin/scriptorium +1890 -0
- data/ui/tui/test/tui_test.rb +23 -0
- data/ui/web/app/app.rb +2600 -0
- data/ui/web/app/assets/livetext_mode.js +244 -0
- data/ui/web/app/error_helpers.rb +150 -0
- data/ui/web/app/views/advanced_config.erb +196 -0
- data/ui/web/app/views/asset_management.erb +645 -0
- data/ui/web/app/views/backup_management.erb +238 -0
- data/ui/web/app/views/banner_config.erb +200 -0
- data/ui/web/app/views/config_widget.erb +232 -0
- data/ui/web/app/views/configure_view.erb +401 -0
- data/ui/web/app/views/dashboard.erb +154 -0
- data/ui/web/app/views/deploy_config.erb +149 -0
- data/ui/web/app/views/edit_pages.erb +363 -0
- data/ui/web/app/views/edit_post.erb +175 -0
- data/ui/web/app/views/edit_theme.erb +73 -0
- data/ui/web/app/views/edit_theme_file.erb +74 -0
- data/ui/web/app/views/error_page.erb +29 -0
- data/ui/web/app/views/header_config.erb +155 -0
- data/ui/web/app/views/layout_config.erb +147 -0
- data/ui/web/app/views/navbar_config.erb +411 -0
- data/ui/web/app/views/theme_management.erb +130 -0
- data/ui/web/app/views/view_dashboard.erb +779 -0
- data/ui/web/app/views/widgets.erb +249 -0
- data/ui/web/bin/scriptorium-web +164 -0
- data/ui/web/test/web_basic_test.rb +38 -0
- data/ui/web/test_navbar.txt +7 -0
- data/ui/web/tmp/timing.log +17 -0
- data/ui/web/tmp/web_server.log +0 -0
- metadata +434 -8
- data/lib/scriptorium/engine.rb +0 -22
- data/test/engine/unit.rb +0 -44
@@ -0,0 +1,248 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'minitest/autorun'
|
4
|
+
|
5
|
+
require_relative '../../lib/scriptorium'
|
6
|
+
require_relative '../test_helpers'
|
7
|
+
|
8
|
+
class TestDeployConfig < Minitest::Test
|
9
|
+
include Scriptorium::Exceptions
|
10
|
+
include Scriptorium::Helpers
|
11
|
+
include TestHelpers
|
12
|
+
|
13
|
+
def setup
|
14
|
+
# Clean up any existing test directory first
|
15
|
+
test_dir = "test/scriptorium-TEST"
|
16
|
+
FileUtils.rm_rf(test_dir) if Dir.exist?(test_dir)
|
17
|
+
|
18
|
+
@repo = Scriptorium::Repo.create(test_dir, testmode: true)
|
19
|
+
@view = @repo.create_view("testview", "Test View", "Test Subtitle")
|
20
|
+
@api = Scriptorium::API.new(testmode: true)
|
21
|
+
@api.open_repo(@repo.root)
|
22
|
+
|
23
|
+
# Set up deployment configuration for tests
|
24
|
+
setup_deployment_config
|
25
|
+
end
|
26
|
+
|
27
|
+
def teardown
|
28
|
+
# Clean up any test directories that were created
|
29
|
+
Dir.glob("test/scriptorium-TEST*").each do |dir|
|
30
|
+
system("rm -rf #{dir}")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def set_deploy_status(status = "y")
|
35
|
+
status_file = @view.dir/:config/"status.txt"
|
36
|
+
status_content = read_file(status_file)
|
37
|
+
status_content = status_content.gsub(/deploy\s+n/, "deploy #{status}")
|
38
|
+
write_file(status_file, status_content)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_001_deploy_config_availability
|
42
|
+
@view = @api.current_view
|
43
|
+
set_deploy_status
|
44
|
+
# Test that deployment tests can check for configuration availability
|
45
|
+
unless @api.testing
|
46
|
+
skip "Deployment tests require test mode"
|
47
|
+
return
|
48
|
+
end
|
49
|
+
|
50
|
+
# Check if deployment config exists
|
51
|
+
config_file = "test/config/deployment.txt"
|
52
|
+
unless File.exist?(config_file)
|
53
|
+
skip "Deployment not configured - add deployment.txt to test/config/"
|
54
|
+
return
|
55
|
+
end
|
56
|
+
|
57
|
+
# If we get here, config exists and we can run deployment tests
|
58
|
+
# This test just verifies the configuration is available
|
59
|
+
assert File.exist?(config_file), "Deployment config should exist for testing"
|
60
|
+
|
61
|
+
# Parse the config to make sure it's valid
|
62
|
+
config_content = read_file(config_file)
|
63
|
+
config = @api.parse_deploy_config(config_content)
|
64
|
+
|
65
|
+
# Verify required fields are present
|
66
|
+
required_fields = %w[user server docroot path]
|
67
|
+
required_fields.each do |field|
|
68
|
+
assert config.key?(field), "Deployment config missing required field: #{field}"
|
69
|
+
assert !config[field].to_s.empty?, "Deployment config field #{field} cannot be empty"
|
70
|
+
end
|
71
|
+
|
72
|
+
# Verify we can build a valid rsync destination
|
73
|
+
destination = @api.build_rsync_destination(config)
|
74
|
+
assert destination, "Should be able to build rsync destination from valid config"
|
75
|
+
assert destination.match(/^.+@.+:.+$/), "Rsync destination should match user@server:path format"
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_002_deploy_config_format_validation
|
79
|
+
@view = @api.current_view
|
80
|
+
set_deploy_status
|
81
|
+
# Test that deployment config follows expected format
|
82
|
+
unless @api.testing
|
83
|
+
skip "Deployment tests require test mode"
|
84
|
+
return
|
85
|
+
end
|
86
|
+
|
87
|
+
config_file = "test/config/deployment.txt"
|
88
|
+
unless File.exist?(config_file)
|
89
|
+
skip "Deployment not configured - add deployment.txt to test/config/"
|
90
|
+
return
|
91
|
+
end
|
92
|
+
|
93
|
+
# Test various config formats
|
94
|
+
config_content = read_file(config_file)
|
95
|
+
config = @api.parse_deploy_config(config_content)
|
96
|
+
|
97
|
+
# Test that user field doesn't contain @ (should be separate from server)
|
98
|
+
user = config["user"]
|
99
|
+
assert !user.include?("@"), "User field should not contain @ symbol"
|
100
|
+
|
101
|
+
# Test that server field is a valid hostname/IP
|
102
|
+
server = config["server"]
|
103
|
+
assert server, "Server field should be present"
|
104
|
+
assert server.length > 0, "Server field should not be empty"
|
105
|
+
|
106
|
+
# Test that docroot field is a valid Unix path
|
107
|
+
docroot = config["docroot"]
|
108
|
+
assert docroot, "Docroot field should be present"
|
109
|
+
assert docroot.start_with?("/"), "Docroot should be absolute (start with /)"
|
110
|
+
|
111
|
+
# Test that path field is present (can be relative)
|
112
|
+
path = config["path"]
|
113
|
+
assert path, "Path field should be present"
|
114
|
+
assert !path.empty?, "Path field should not be empty"
|
115
|
+
end
|
116
|
+
|
117
|
+
def test_003_real_deployment_workflow
|
118
|
+
@view = @api.current_view
|
119
|
+
set_deploy_status
|
120
|
+
# Skip if not in test mode or no deployment config
|
121
|
+
unless @api.testing
|
122
|
+
skip "Deployment tests require test mode"
|
123
|
+
return
|
124
|
+
end
|
125
|
+
|
126
|
+
config_file = "test/config/deployment.txt"
|
127
|
+
unless File.exist?(config_file)
|
128
|
+
skip "Deployment not configured - add deployment.txt to test/config/"
|
129
|
+
return
|
130
|
+
end
|
131
|
+
|
132
|
+
# Create some test content
|
133
|
+
@api.create_post("Test Post 1", "Test content here", blurb: "This is a test post for deployment")
|
134
|
+
@api.create_post("Test Post 2", "More test content", blurb: "Another test post")
|
135
|
+
# Generate the view
|
136
|
+
@api.generate_view(@view.name)
|
137
|
+
# Verify output was created
|
138
|
+
output_dir = @view.dir/:output
|
139
|
+
assert Dir.exist?(output_dir), "Output directory should exist"
|
140
|
+
assert File.exist?(output_dir/"index.html"), "Index should be generated"
|
141
|
+
assert Dir.exist?(output_dir/:posts), "Posts directory should exist"
|
142
|
+
# Test deployment (this will actually try to deploy)
|
143
|
+
deploy_config = @api.parse_deploy_config(read_file(config_file))
|
144
|
+
assert deploy_config, "Should be able to parse deployment config"
|
145
|
+
# Verify we can build deployment destination
|
146
|
+
destination = @api.build_rsync_destination(deploy_config)
|
147
|
+
assert destination, "Should be able to build rsync destination"
|
148
|
+
# Test actual deployment
|
149
|
+
result = @api.deploy(@view.name)
|
150
|
+
assert result, "Deployment should succeed"
|
151
|
+
end
|
152
|
+
|
153
|
+
def test_004_deployment_with_assets
|
154
|
+
@view = @api.current_view
|
155
|
+
set_deploy_status
|
156
|
+
# Skip if not configured
|
157
|
+
unless @api.testing && File.exist?("test/config/deployment.txt")
|
158
|
+
skip "Deployment not configured"
|
159
|
+
return
|
160
|
+
end
|
161
|
+
|
162
|
+
# Create post with assets
|
163
|
+
post = @api.create_post("Asset Test Post", "Content with assets", blurb: "Testing asset deployment")
|
164
|
+
|
165
|
+
# Add some test assets
|
166
|
+
assets_dir = post.dir/:assets
|
167
|
+
make_dir(assets_dir)
|
168
|
+
write_file(assets_dir/"test-image.jpg", "fake image data")
|
169
|
+
write_file(assets_dir/"test.css", "body { color: red; }")
|
170
|
+
|
171
|
+
# Generate and deploy
|
172
|
+
@api.generate_view(@view.name)
|
173
|
+
result = @api.deploy(@view.name)
|
174
|
+
|
175
|
+
assert result, "Deployment with assets should succeed"
|
176
|
+
end
|
177
|
+
|
178
|
+
def test_005_deployment_verification
|
179
|
+
@view = @api.current_view
|
180
|
+
set_deploy_status
|
181
|
+
# Skip if not configured
|
182
|
+
unless @api.testing && File.exist?("test/config/deployment.txt")
|
183
|
+
skip "Deployment not configured"
|
184
|
+
return
|
185
|
+
end
|
186
|
+
|
187
|
+
# Create and deploy content
|
188
|
+
@api.create_post("Verification Post", "Content to verify", blurb: "Testing deployment verification")
|
189
|
+
@api.generate_view(@view.name)
|
190
|
+
result = @api.deploy(@view.name)
|
191
|
+
|
192
|
+
# Verify deployment succeeded
|
193
|
+
assert result, "Deployment should succeed"
|
194
|
+
|
195
|
+
# Verify deployed content via HTTP
|
196
|
+
# Get deployment config for domain construction
|
197
|
+
config = @api.parse_deploy_config(read_file("test/config/deployment.txt"))
|
198
|
+
domain = config["proto"] + "://" + config["server"]
|
199
|
+
base_url = "#{domain}/#{config["path"]}"
|
200
|
+
|
201
|
+
# Test main page
|
202
|
+
main_page = `curl -s #{base_url}/`
|
203
|
+
assert main_page.include?("Test View"), "Main page should contain view title"
|
204
|
+
assert main_page.include?("Test Subtitle"), "Main page should contain view subtitle"
|
205
|
+
assert main_page.include?("Verification Post"), "Main page should contain deployed post title"
|
206
|
+
# assert main_page.include?("Testing deployment verification"), "Main page should contain post blurb" # May not be on main page
|
207
|
+
|
208
|
+
# Test post page - posts are numbered, so try 0001
|
209
|
+
post_url = "#{base_url}/posts/0001-verification-post.html"
|
210
|
+
post_page = `curl -s #{post_url} 2>/dev/null`
|
211
|
+
assert post_page.include?("Verification Post"), "Post page should contain post title"
|
212
|
+
assert post_page.include?("Content to verify"), "Post page should contain post body"
|
213
|
+
|
214
|
+
# Test clean permalink URL (should work now with copying instead of symlinking)
|
215
|
+
clean_post_url = "#{base_url}/permalink/verification-post.html"
|
216
|
+
clean_post_page = `curl -s #{clean_post_url} 2>/dev/null`
|
217
|
+
assert clean_post_page.include?("Verification Post"), "Clean permalink should contain post title"
|
218
|
+
assert clean_post_page.include?("Content to verify"), "Clean permalink should contain post body"
|
219
|
+
|
220
|
+
# Test basic structure elements that are likely to be present
|
221
|
+
# assert post_page.include?("<html"), "Post page should have HTML structure" # May be fragment
|
222
|
+
# assert post_page.include?("<head"), "Post page should have head section" # May be fragment
|
223
|
+
# assert post_page.include?("<body"), "Post page should have body section" # May be fragment
|
224
|
+
|
225
|
+
# Test navigation elements on main page
|
226
|
+
# assert main_page.include?("permalink"), "Main page should have permalink links" # May not be present
|
227
|
+
# assert main_page.include?("copy link"), "Main page should have copy link buttons" # May not be present
|
228
|
+
|
229
|
+
# Test basic functionality that should be present
|
230
|
+
assert main_page.include?("bootstrap"), "Main page should include Bootstrap CSS/JS"
|
231
|
+
assert main_page.length > 100, "Main page should have substantial content"
|
232
|
+
assert post_page.length > 50, "Post page should have content"
|
233
|
+
end
|
234
|
+
|
235
|
+
private
|
236
|
+
|
237
|
+
def setup_deployment_config
|
238
|
+
# Copy deployment config to the view if it exists
|
239
|
+
config_source = "test/config/deployment.txt"
|
240
|
+
if File.exist?(config_source)
|
241
|
+
deploy_file = @view.dir/:config/"deploy.txt"
|
242
|
+
write_file(deploy_file, read_file(config_source))
|
243
|
+
else
|
244
|
+
raise "Deployment config source not found: #{config_source}"
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
end
|