scriptorium 0.0.3 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (353) hide show
  1. checksums.yaml +4 -4
  2. data/README.lt3 +324 -0
  3. data/README.md +3155 -1
  4. data/assets/.DS_Store +0 -0
  5. data/assets/README.md +44 -0
  6. data/assets/icons/social/reddit.png +0 -0
  7. data/assets/icons/social/x-logo.png +0 -0
  8. data/assets/icons/ui/.DS_Store +0 -0
  9. data/assets/icons/ui/back.png +0 -0
  10. data/assets/icons/ui/copy.png +0 -0
  11. data/assets/icons/ui/down.png +0 -0
  12. data/assets/icons/ui/end.png +0 -0
  13. data/assets/icons/ui/exit.png +0 -0
  14. data/assets/icons/ui/foo +10 -0
  15. data/assets/icons/ui/home.png +0 -0
  16. data/assets/icons/ui/left.png +0 -0
  17. data/assets/icons/ui/next.png +0 -0
  18. data/assets/icons/ui/right.png +0 -0
  19. data/assets/icons/ui/start.png +0 -0
  20. data/assets/icons/ui/up.png +0 -0
  21. data/assets/imagenotfound.jpg +0 -0
  22. data/assets/samples/placeholder.svg +9 -0
  23. data/assets/themes/standard/favicon.svg +6 -0
  24. data/bin/sblog +84 -5
  25. data/bin/scriptorium +1 -0
  26. data/doc/README.txt +6 -0
  27. data/doc/anti-amnesia/20250727-054000-scriptorium-overview.md +94 -0
  28. data/doc/anti-amnesia/20250727-123000-anti-amnesia-conventions.md +2 -0
  29. data/doc/anti-amnesia/20250727-172600-cursor-rbenv-ruby-version-mystery.md +45 -0
  30. data/doc/anti-amnesia/20250727-172900-ai-cognitive-assessment-capabilities.md +40 -0
  31. data/doc/anti-amnesia/20250728-124243-aaa-syntax-clarification.md +46 -0
  32. data/doc/anti-amnesia/20250729-210000-reddit-autopost-integration-complete.md +158 -0
  33. data/doc/anti-amnesia/20250804-190500-cognitive-loop-bug.md +35 -0
  34. data/doc/anti-amnesia/20250804-190700-anti-amnesia-timestamping-fix.md +27 -0
  35. data/doc/anti-amnesia/20250807-213025.md +116 -0
  36. data/doc/anti-amnesia/20250901-211714-codemirror-integration-and-web-tests.md +172 -0
  37. data/doc/anti-amnesia/20250902-002402-backup-restore-system.md +126 -0
  38. data/doc/anti-amnesia/20250907-203339-backup-metadata-implementation.md +66 -0
  39. data/doc/banner_svg_config.md +114 -0
  40. data/doc/contrib.lt3 +8 -0
  41. data/doc/dependencies.md +281 -0
  42. data/doc/hacker.lt3 +5 -0
  43. data/doc/imported/0001-elixir-conf-2014/metadata.txt +7 -0
  44. data/doc/imported/0001-elixir-conf-2014/post.html +37 -0
  45. data/doc/imported/0001-elixir-conf-2014/source.lt3 +22 -0
  46. data/doc/imported/0002-programmers-and-word-processing/metadata.txt +7 -0
  47. data/doc/imported/0002-programmers-and-word-processing/post.html +192 -0
  48. data/doc/imported/0002-programmers-and-word-processing/source.lt3 +146 -0
  49. data/doc/imported/0003-how-to-turn-your-brain-sideways/metadata.txt +7 -0
  50. data/doc/imported/0003-how-to-turn-your-brain-sideways/post.html +60 -0
  51. data/doc/imported/0003-how-to-turn-your-brain-sideways/source.lt3 +40 -0
  52. data/doc/imported/0004-upcoming-lone-star-ruby-conference/metadata.txt +7 -0
  53. data/doc/imported/0004-upcoming-lone-star-ruby-conference/post.html +42 -0
  54. data/doc/imported/0004-upcoming-lone-star-ruby-conference/source.lt3 +24 -0
  55. data/doc/imported/0005-elixir-conf-2015-announced/metadata.txt +7 -0
  56. data/doc/imported/0005-elixir-conf-2015-announced/post.html +30 -0
  57. data/doc/imported/0005-elixir-conf-2015-announced/source.lt3 +16 -0
  58. data/doc/imported/0006-ruby-for-dinosaurs/metadata.txt +7 -0
  59. data/doc/imported/0006-ruby-for-dinosaurs/post.html +43 -0
  60. data/doc/imported/0006-ruby-for-dinosaurs/source.lt3 +27 -0
  61. data/doc/imported/0007-phoenix-isnt-rails/metadata.txt +7 -0
  62. data/doc/imported/0007-phoenix-isnt-rails/post.html +116 -0
  63. data/doc/imported/0007-phoenix-isnt-rails/source.lt3 +87 -0
  64. data/doc/imported/0008-concerning-the-term-monkeypatching/metadata.txt +7 -0
  65. data/doc/imported/0008-concerning-the-term-monkeypatching/post.html +129 -0
  66. data/doc/imported/0008-concerning-the-term-monkeypatching/source.lt3 +92 -0
  67. data/doc/imported/0009-announcement-coming-soon/metadata.txt +7 -0
  68. data/doc/imported/0009-announcement-coming-soon/post.html +33 -0
  69. data/doc/imported/0009-announcement-coming-soon/source.lt3 +19 -0
  70. data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/metadata.txt +7 -0
  71. data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/post.html +175 -0
  72. data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/source.lt3 +139 -0
  73. data/doc/imported/0011-computer-science-as-a-lost-art/metadata.txt +7 -0
  74. data/doc/imported/0011-computer-science-as-a-lost-art/post.html +139 -0
  75. data/doc/imported/0011-computer-science-as-a-lost-art/source.lt3 +104 -0
  76. data/doc/imported/0012-ruby-day-in-turin-italy/metadata.txt +7 -0
  77. data/doc/imported/0012-ruby-day-in-turin-italy/post.html +42 -0
  78. data/doc/imported/0012-ruby-day-in-turin-italy/source.lt3 +24 -0
  79. data/doc/imported/0013-rubyday-was-a-success/metadata.txt +7 -0
  80. data/doc/imported/0013-rubyday-was-a-success/post.html +44 -0
  81. data/doc/imported/0013-rubyday-was-a-success/source.lt3 +27 -0
  82. data/doc/imported/0014-working-on-the-blogging-software/metadata.txt +7 -0
  83. data/doc/imported/0014-working-on-the-blogging-software/post.html +63 -0
  84. data/doc/imported/0014-working-on-the-blogging-software/source.lt3 +41 -0
  85. data/doc/imported/0015-ok-its-not-really-a-lost-art/metadata.txt +7 -0
  86. data/doc/imported/0015-ok-its-not-really-a-lost-art/post.html +172 -0
  87. data/doc/imported/0015-ok-its-not-really-a-lost-art/source.lt3 +134 -0
  88. data/doc/imported/0016-an-in-operator-for-ruby/metadata.txt +7 -0
  89. data/doc/imported/0016-an-in-operator-for-ruby/post.html +155 -0
  90. data/doc/imported/0016-an-in-operator-for-ruby/source.lt3 +106 -0
  91. data/doc/imported/0017-the-forgotten-mathematician/metadata.txt +7 -0
  92. data/doc/imported/0017-the-forgotten-mathematician/post.html +161 -0
  93. data/doc/imported/0017-the-forgotten-mathematician/source.lt3 +119 -0
  94. data/doc/imported/0018-ruby-puns/metadata.txt +7 -0
  95. data/doc/imported/0018-ruby-puns/post.html +46 -0
  96. data/doc/imported/0018-ruby-puns/source.lt3 +28 -0
  97. data/doc/imported/0019-custom-exceptions-via-metaprogramming/metadata.txt +7 -0
  98. data/doc/imported/0019-custom-exceptions-via-metaprogramming/post.html +138 -0
  99. data/doc/imported/0019-custom-exceptions-via-metaprogramming/source.lt3 +101 -0
  100. data/doc/imported/0020-fffff/metadata.txt +7 -0
  101. data/doc/imported/0020-fffff/post.html +24 -0
  102. data/doc/imported/0020-fffff/source.lt3 +12 -0
  103. data/doc/imported/0021-trying-ror-yet-again/metadata.txt +7 -0
  104. data/doc/imported/0021-trying-ror-yet-again/post.html +26 -0
  105. data/doc/imported/0021-trying-ror-yet-again/source.lt3 +12 -0
  106. data/doc/imported/0023-doctor-sleep/metadata.txt +7 -0
  107. data/doc/imported/0023-doctor-sleep/post.html +63 -0
  108. data/doc/imported/0023-doctor-sleep/source.lt3 +44 -0
  109. data/doc/imported/0024-just-a-test/metadata.txt +7 -0
  110. data/doc/imported/0024-just-a-test/post.html +24 -0
  111. data/doc/imported/0024-just-a-test/source.lt3 +12 -0
  112. data/doc/imported/import_summary.txt +98 -0
  113. data/doc/livetext-informal-spec.txt +65 -0
  114. data/doc/myuserdoc/ch-0.lt3 +31 -0
  115. data/doc/myuserdoc/ch-1.lt3 +37 -0
  116. data/doc/myuserdoc/ch-10.lt3 +22 -0
  117. data/doc/myuserdoc/ch-2.lt3 +37 -0
  118. data/doc/myuserdoc/ch-3.lt3 +19 -0
  119. data/doc/myuserdoc/ch-4.lt3 +43 -0
  120. data/doc/myuserdoc/ch-5.lt3 +22 -0
  121. data/doc/myuserdoc/ch-6.lt3 +19 -0
  122. data/doc/myuserdoc/ch-7.lt3 +16 -0
  123. data/doc/myuserdoc/ch-8.lt3 +13 -0
  124. data/doc/myuserdoc/ch-9.lt3 +19 -0
  125. data/doc/myuserdoc/tweak.rb +18 -0
  126. data/doc/myuserdoc/userdoc-toc.txt +88 -0
  127. data/doc/old-posts/0001-elixir-conf-2014.lt3 +24 -0
  128. data/doc/old-posts/0002-programmers-and-word-processing.lt3 +150 -0
  129. data/doc/old-posts/0003-how-to-turn-your-brain-sideways.lt3 +43 -0
  130. data/doc/old-posts/0004-upcoming-lone-star-ruby-conference.lt3 +26 -0
  131. data/doc/old-posts/0005-elixir-conf-2015-announced.lt3 +17 -0
  132. data/doc/old-posts/0006-ruby-for-dinosaurs.lt3 +30 -0
  133. data/doc/old-posts/0007-phoenix-isnt-rails.lt3 +90 -0
  134. data/doc/old-posts/0008-concerning-the-term-monkeypatching.lt3 +105 -0
  135. data/doc/old-posts/0009-announcement-coming-soon.lt3 +20 -0
  136. data/doc/old-posts/0010-immutable-data-ditching-the-wax-tablet.lt3 +142 -0
  137. data/doc/old-posts/0011-computer-science-as-a-lost-art.lt3 +117 -0
  138. data/doc/old-posts/0012-ruby-day-in-turin-italy.lt3 +26 -0
  139. data/doc/old-posts/0013-rubyday-was-a-success.lt3 +28 -0
  140. data/doc/old-posts/0014-working-on-the-blogging-software.lt3 +42 -0
  141. data/doc/old-posts/0015-ok-its-not-really-a-lost-art.lt3 +137 -0
  142. data/doc/old-posts/0016-an-in-operator-for-ruby.lt3 +142 -0
  143. data/doc/old-posts/0017-the-forgotten-mathematician.lt3 +129 -0
  144. data/doc/old-posts/0018-ruby-puns.lt3 +31 -0
  145. data/doc/old-posts/0019-custom-exceptions-via-metaprogramming.lt3 +116 -0
  146. data/doc/old-posts/0021-trying-ror-yet-again.lt3 +35 -0
  147. data/doc/old-posts/0023-doctor-sleep.lt3 +43 -0
  148. data/doc/old-posts/0024-just-a-test.lt3 +12 -0
  149. data/doc/old-posts/0025-trying-another-post.lt3 +12 -0
  150. data/doc/old-repo +1 -0
  151. data/doc/reddit_credentials_template.json +8 -0
  152. data/doc/reddit_integration.md +207 -0
  153. data/doc/user.lt3 +35 -0
  154. data/doc/user_guide_section_1.md +137 -0
  155. data/doc/user_guide_section_10.md +515 -0
  156. data/doc/user_guide_section_11.md +708 -0
  157. data/doc/user_guide_section_2.md +233 -0
  158. data/doc/user_guide_section_3.md +5 -0
  159. data/doc/user_guide_section_4.md +221 -0
  160. data/doc/user_guide_section_5.md +243 -0
  161. data/doc/user_guide_section_6.md +147 -0
  162. data/doc/user_guide_section_7.md +311 -0
  163. data/doc/user_guide_section_8.md +224 -0
  164. data/doc/user_guide_section_9.md +375 -0
  165. data/lib/rouge/lexers/livetext.rb +74 -0
  166. data/lib/scriptorium/api.rb +2373 -0
  167. data/lib/scriptorium/banner_svg.rb +729 -0
  168. data/lib/scriptorium/contract.rb +34 -0
  169. data/lib/scriptorium/exceptions.rb +201 -1
  170. data/lib/scriptorium/helpers.rb +675 -0
  171. data/lib/scriptorium/post.rb +259 -0
  172. data/lib/scriptorium/reddit.rb +83 -0
  173. data/lib/scriptorium/repo.rb +938 -0
  174. data/lib/scriptorium/standard_files.rb +149 -0
  175. data/lib/scriptorium/support/bootstrap/css.txt +5 -0
  176. data/lib/scriptorium/support/bootstrap/js.txt +4 -0
  177. data/lib/scriptorium/support/common_js/clipboard.js +35 -0
  178. data/lib/scriptorium/support/common_js/content-loader.js +187 -0
  179. data/lib/scriptorium/support/common_js/navigation.js +52 -0
  180. data/lib/scriptorium/support/common_js/syntax-highlighting.js +27 -0
  181. data/lib/scriptorium/support/config/reddit.txt +10 -0
  182. data/lib/scriptorium/support/config/reddit_template.txt +17 -0
  183. data/lib/scriptorium/support/config/social.txt +8 -0
  184. data/lib/scriptorium/support/highlight/css.txt +2 -0
  185. data/lib/scriptorium/support/highlight/custom.css +119 -0
  186. data/lib/scriptorium/support/highlight/js.txt +1 -0
  187. data/lib/scriptorium/support/post_index/config.txt +15 -0
  188. data/lib/scriptorium/support/post_index/style.css +55 -0
  189. data/lib/scriptorium/support/templates/index_entry.lt3 +16 -0
  190. data/lib/scriptorium/support/templates/initial_post.lt3 +12 -0
  191. data/lib/scriptorium/support/templates/layout.txt +5 -0
  192. data/lib/scriptorium/support/templates/post.lt3 +104 -0
  193. data/lib/scriptorium/support/theme/footer.lt3 +2 -0
  194. data/lib/scriptorium/support/theme/header.lt3 +4 -0
  195. data/lib/scriptorium/support/theme/left.lt3 +3 -0
  196. data/lib/scriptorium/support/theme/main.lt3 +5 -0
  197. data/lib/scriptorium/support/theme/right.lt3 +3 -0
  198. data/lib/scriptorium/theme.rb +192 -0
  199. data/lib/scriptorium/version.rb +1 -1
  200. data/lib/scriptorium/view.rb +1021 -0
  201. data/lib/scriptorium/widgets/featured_posts.rb +149 -0
  202. data/lib/scriptorium/widgets/links.rb +112 -0
  203. data/lib/scriptorium/widgets/pages.rb +133 -0
  204. data/lib/scriptorium/widgets/widget.rb +133 -0
  205. data/lib/scriptorium.rb +38 -34
  206. data/lib/skeleton.rb +10 -1
  207. data/scriptorium.gemspec +17 -5
  208. data/test/README.md +69 -0
  209. data/test/WEB_INTEGRATION_README.md +196 -0
  210. data/test/all +83 -0
  211. data/test/api_demo.rb +99 -0
  212. data/test/assets/imagenotfound.jpg +0 -0
  213. data/test/assets/images/.DS_Store +0 -0
  214. data/test/assets/images/README.md +27 -0
  215. data/test/assets/images/odd_aspect.png +0 -0
  216. data/test/assets/images/perfect.png +0 -0
  217. data/test/assets/images/small.png +0 -0
  218. data/test/assets/images/tall.png +0 -0
  219. data/test/assets/images/very_tall.png +0 -0
  220. data/test/assets/images/very_wide.png +0 -0
  221. data/test/assets/images/wide.png +0 -0
  222. data/test/assets/testbanner.jpg +0 -0
  223. data/test/banner_svg/simple_helpers.rb +13 -0
  224. data/test/banner_svg/unit.rb +1000 -0
  225. data/test/config/deployment.txt +5 -0
  226. data/test/ed_test.rb +204 -0
  227. data/test/integration/cursor_banner_combinations.rb +193 -0
  228. data/test/integration/cursor_banner_features.rb +374 -0
  229. data/test/integration/integration_test.rb +326 -0
  230. data/test/integration/preview_flow_test.rb +94 -0
  231. data/test/livetext_plugin_test.rb +500 -0
  232. data/test/manual/asset_mgmt.rb +67 -0
  233. data/test/manual/banner-tests/index.html +45 -0
  234. data/test/manual/banner-tests/svg.txt +3 -0
  235. data/test/manual/banner-tests/test01.html +122 -0
  236. data/test/manual/banner-tests/test02.html +122 -0
  237. data/test/manual/banner-tests/test03.html +122 -0
  238. data/test/manual/banner-tests/test04.html +129 -0
  239. data/test/manual/banner-tests/test05.html +129 -0
  240. data/test/manual/banner-tests/test06.html +129 -0
  241. data/test/manual/banner-tests/test07.html +129 -0
  242. data/test/manual/banner-tests/test08.html +123 -0
  243. data/test/manual/banner-tests/test09.html +123 -0
  244. data/test/manual/banner-tests/test10.html +123 -0
  245. data/test/manual/banner-tests/test11.html +123 -0
  246. data/test/manual/banner-tests/test12.html +123 -0
  247. data/test/manual/banner-tests/test13.html +123 -0
  248. data/test/manual/banner-tests/test14.html +123 -0
  249. data/test/manual/banner-tests/test15.html +122 -0
  250. data/test/manual/banner-tests/test16.html +122 -0
  251. data/test/manual/banner-tests/test17.html +122 -0
  252. data/test/manual/banner-tests/test18.html +132 -0
  253. data/test/manual/banner-tests/test19.html +132 -0
  254. data/test/manual/banner-tests/test20.html +132 -0
  255. data/test/manual/banner-tests/test21.html +132 -0
  256. data/test/manual/banner-tests/test22.html +132 -0
  257. data/test/manual/banner-tests/test23.html +132 -0
  258. data/test/manual/banner-tests/test24.html +132 -0
  259. data/test/manual/banner-tests/test25.html +131 -0
  260. data/test/manual/banner_environment.rb +205 -0
  261. data/test/manual/codemirror_demo.html +773 -0
  262. data/test/manual/create_posts_for_web.rb +114 -0
  263. data/test/manual/environment.rb +67 -0
  264. data/test/manual/make_banner.rb +153 -0
  265. data/test/manual/preview_manual_test.rb +129 -0
  266. data/test/manual/sample_banner_config.txt +12 -0
  267. data/test/manual/test_advanced_widgets.rb +73 -0
  268. data/test/manual/test_banner_combinations.rb +120 -0
  269. data/test/manual/test_banner_features.rb +306 -0
  270. data/test/manual/test_banner_integration.rb +115 -0
  271. data/test/manual/test_banner_radial.rb +87 -0
  272. data/test/manual/test_basic_posts.rb +47 -0
  273. data/test/manual/test_layout_widgets.rb +40 -0
  274. data/test/manual/test_pagination.rb +24 -0
  275. data/test/manual/test_random_posts.rb +38 -0
  276. data/test/manual/test_syntax_highlighting.rb +167 -0
  277. data/test/rubytext/rubytext_comprehensive_test.rb +307 -0
  278. data/test/rubytext/rubytext_demo_test.rb +42 -0
  279. data/test/rubytext/rubytext_testing_guide.md +277 -0
  280. data/test/run_automated_tests.rb +45 -0
  281. data/test/staging/.DS_Store +0 -0
  282. data/test/support/preview_utils.rb +88 -0
  283. data/test/syntax_highlighting_test.lt3 +124 -0
  284. data/test/test_gem_assets.rb +48 -0
  285. data/test/test_helpers.rb +240 -0
  286. data/test/tui_editor_integration_test.rb +296 -0
  287. data/test/tui_integration_test.rb +883 -0
  288. data/test/unit/api.rb +1776 -0
  289. data/test/unit/asset_management.rb +219 -0
  290. data/test/unit/backup_test.rb +451 -0
  291. data/test/unit/clipboard_test.rb +60 -0
  292. data/test/unit/contract_test.rb +69 -0
  293. data/test/unit/core.rb +1211 -0
  294. data/test/unit/deploy_config_test.rb +248 -0
  295. data/test/unit/deploy_test.rb +478 -0
  296. data/test/unit/edit_post_test.rb +168 -0
  297. data/test/unit/gem_asset_management.rb +183 -0
  298. data/test/unit/livetext_basic.rb +57 -0
  299. data/test/unit/livetext_compatibility.rb +82 -0
  300. data/test/unit/parse_cmd_test.rb +260 -0
  301. data/test/unit/permalink_copy_test.rb +211 -0
  302. data/test/unit/post.rb +309 -0
  303. data/test/unit/post_index_config_test.rb +258 -0
  304. data/test/unit/post_state_helpers_test.rb +137 -0
  305. data/test/unit/read_commented_file_test.rb +278 -0
  306. data/test/unit/reddit_test.rb +235 -0
  307. data/test/unit/repo.rb +569 -0
  308. data/test/unit/social_test.rb +366 -0
  309. data/test/unit/syntax_highlighting.rb +70 -0
  310. data/test/unit/theme_management_test.rb +91 -0
  311. data/test/unit/view.rb +498 -0
  312. data/test/unit/widgets.rb +669 -0
  313. data/test/web_integration_test.rb +231 -0
  314. data/test/web_test_helper.rb +218 -0
  315. data/test/web_workflow_test.rb +527 -0
  316. data/test/wizard_test.rb +123 -0
  317. data/ui/README.md +67 -0
  318. data/ui/common/lib/ui_common.rb +8 -0
  319. data/ui/rubytext/README.md +191 -0
  320. data/ui/rubytext/bin/scriptorium-rubytext +402 -0
  321. data/ui/rubytext/lib/rubytext_ui.rb +300 -0
  322. data/ui/tui/bin/scriptorium +1890 -0
  323. data/ui/tui/test/tui_test.rb +23 -0
  324. data/ui/web/app/app.rb +2600 -0
  325. data/ui/web/app/assets/livetext_mode.js +244 -0
  326. data/ui/web/app/error_helpers.rb +150 -0
  327. data/ui/web/app/views/advanced_config.erb +196 -0
  328. data/ui/web/app/views/asset_management.erb +645 -0
  329. data/ui/web/app/views/backup_management.erb +238 -0
  330. data/ui/web/app/views/banner_config.erb +200 -0
  331. data/ui/web/app/views/config_widget.erb +232 -0
  332. data/ui/web/app/views/configure_view.erb +401 -0
  333. data/ui/web/app/views/dashboard.erb +154 -0
  334. data/ui/web/app/views/deploy_config.erb +149 -0
  335. data/ui/web/app/views/edit_pages.erb +363 -0
  336. data/ui/web/app/views/edit_post.erb +175 -0
  337. data/ui/web/app/views/edit_theme.erb +73 -0
  338. data/ui/web/app/views/edit_theme_file.erb +74 -0
  339. data/ui/web/app/views/error_page.erb +29 -0
  340. data/ui/web/app/views/header_config.erb +155 -0
  341. data/ui/web/app/views/layout_config.erb +147 -0
  342. data/ui/web/app/views/navbar_config.erb +411 -0
  343. data/ui/web/app/views/theme_management.erb +130 -0
  344. data/ui/web/app/views/view_dashboard.erb +779 -0
  345. data/ui/web/app/views/widgets.erb +249 -0
  346. data/ui/web/bin/scriptorium-web +164 -0
  347. data/ui/web/test/web_basic_test.rb +38 -0
  348. data/ui/web/test_navbar.txt +7 -0
  349. data/ui/web/tmp/timing.log +17 -0
  350. data/ui/web/tmp/web_server.log +0 -0
  351. metadata +434 -8
  352. data/lib/scriptorium/engine.rb +0 -22
  353. data/test/engine/unit.rb +0 -44
@@ -0,0 +1,18 @@
1
+ text = File.read("userdoc-toc.txt")
2
+
3
+ pieces = text.split("\n\n")
4
+
5
+ pieces.each.with_index do |txt, i|
6
+ f = File.new("ch-#{'%0d' % i}.lt3", "w")
7
+ lines = txt.split("\n").map {|x| " " + x }
8
+ f.puts ".comment"
9
+ f.puts lines
10
+ f.puts ".end\n "
11
+
12
+ f.puts lines[0].sub!(" xx.", ".chapter")
13
+ f.puts "\n "
14
+ lines[1..-1].map! {|x| x.sub!(/^/, ".sec ") }
15
+ lines[1..-1].each {|line| f.puts line + "\n " }
16
+ f.close
17
+ end
18
+
@@ -0,0 +1,88 @@
1
+ xx. Core Concepts
2
+ What is Scriptorium?
3
+ - Static files
4
+ - What are views? and why?
5
+ - What is a repository?
6
+ - How does deployment work?
7
+ What is Livetext?
8
+ - Why Livetext?
9
+ - Syntax in brief (1-2 paragraphs)
10
+
11
+ xx. Getting Started
12
+ Quick installation (gem install)
13
+ Interactive setup
14
+ - create repo
15
+ - create first view
16
+ - other commands
17
+ - the sample view
18
+ - first blog post
19
+ Basic Configuration
20
+ Checking dependencies
21
+ The "standard" theme (only one for now)
22
+
23
+ xx. The Front Page
24
+ - containers and their uses
25
+ - configuring header
26
+ - banner
27
+ - navbar
28
+ - configuring a sidebar
29
+ - the main container: post index
30
+ Widgets
31
+ - Links
32
+ - Pages
33
+ - Featured Posts
34
+
35
+ xx. Deployment & Hosting
36
+ Local Development
37
+ Server Deployment
38
+ Domain Configuration
39
+ SSL Setup
40
+
41
+ xx. LiveText Basics
42
+ What is LiveText?
43
+ Basic Syntax
44
+ - inline formatting: boldface, italics, etc.
45
+ - simple dot commands (with/without parameters)
46
+ - comments
47
+ - dot commands taking a body and .end
48
+ - predefined variables
49
+ - predefined functions
50
+ - user variables
51
+ - writing your own dot commands and functions in Ruby
52
+ The Plugin for Scriptorium
53
+ Writing Posts
54
+
55
+ xx. Managing posts
56
+ - create
57
+ - delete
58
+ - link
59
+ - unlink
60
+ - featured
61
+
62
+ xx. Managing Pages
63
+ - Used in navbar
64
+ - Used in Pages widget
65
+ - Internal links
66
+ - Subdirectories under pages/
67
+
68
+ xx. Customization
69
+ - Themes and Styling (cloning)
70
+ - Templates
71
+ - Widgets and Features
72
+
73
+ xx. Advanced Features
74
+ Reddit Integration
75
+ Social Media Features
76
+
77
+ xx. Troubleshooting
78
+ Common Issues
79
+ Dependency Management
80
+ Error Messages
81
+ Getting Help
82
+
83
+ xx. Reference
84
+ Command Reference
85
+ Configuration Files
86
+ LiveText Reference
87
+ API Reference
88
+ View Tree Structure
@@ -0,0 +1,24 @@
1
+ .mixin liveblog
2
+
3
+ .post 1
4
+
5
+ .title Elixir Conf 2014
6
+ .pubdate 2014-07-29
7
+ .views computing austin
8
+ .tags
9
+
10
+ .teaser
11
+ Last week in Austin, I attended the world's first Elixir conference. It was very
12
+ energizing!
13
+ .end
14
+
15
+ With only 105 people attending, the vibe was that of a Ruby conference 10 or more
16
+ years ago. Jose Valim, the language creator, was there; two Erlang heavyweights
17
+ were also in attendance -- Robert Virding and Francesco Cesarini.
18
+
19
+ There were many Rubyists there, of course, but I will only mention myself, Dave
20
+ Thomas, and Jim Freeze. The three of us were also at the first Ruby conference
21
+ in 2001.
22
+
23
+ This will be an exciting ride. I'll keep you informed.
24
+
@@ -0,0 +1,150 @@
1
+ .mixin liveblog
2
+
3
+ .post 2
4
+
5
+ .title Programmers and word processing
6
+ .pubdate 2014-09-17
7
+ .views computing writing
8
+ .tags
9
+
10
+ .teaser
11
+ The other day, I was thinking about the mechanics of writing. Not grammar, spelling, and punctuation,
12
+ but the actual work flow involved.
13
+ .end
14
+
15
+ .pin computing
16
+
17
+ Specifically, I was trying to gather my thoughts on why writing a software book using Microsoft Word
18
+ is so incredibly painful. (Granted, I have used Word or similar tools to write fiction and shorter pieces.)
19
+
20
+ It wouldn't seem so at first, would it? Isn't word processing software the savior of the writer? Wouldn't
21
+ we be using typewriters without it?
22
+
23
+ Well, yes and no. Several facts have to be considered here: 1. I'm a programmer (and a somewhat old-fashioned
24
+ one, who almost always goes straight to the command line). 2. When you write a programming book, there is
25
+ often a need to manipulate the text in various ways you otherwise wouldn't. This is even more true for a
26
+ "larger" document like a book of a few hundred pages. 3. Programmers by nature want the computer to do things
27
+ for them. It's natural to want to write code to manipulate your text.
28
+
29
+ the typewriter and the modern word processing suites. It's a forgotten generation of software -- forgotten
30
+ partly because computer guys were mostly the only ones who ever used it, and today even the younger software
31
+ professionals don't remember it.
32
+
33
+ I'm talking, of course, about what we commonly call a _text formatter_. Many of you who read this will have
34
+ much more experience here than I do, but I'll share from my own limited knowledge and experience.
35
+
36
+ I'll assume some of my readers have no idea what I'm talking about. A text formatter is just a piece of software
37
+ that takes plain text (mixed with some metadata relating to formatting) and produces a formatted document. Think
38
+ of it as a little like HTML, but usually without nesting. Typically if a line of text started with a dot, it
39
+ would be interpreted as a formatting instruction rather than as raw text.
40
+
41
+ This was before there were laser printers (or at least I had never heard of them). Although I don't go back to
42
+ the early days of Unix utilities like troff and nroff, I did know about them and have touched them (in the early
43
+ to mid-1980s). I've even used a similar tool on an IBM mainframe (called Scripsit, as I recall). I'm certain
44
+ there were similar things on the DEC-10 and many other forgotten platforms. Even in the late 80s, when word
45
+ processing was coming into its own, many of the tools still were not fully "WYSIWYG."
46
+
47
+ Remember that term? "What You See Is What You Get"? It was coined because this was rather a new concept. With
48
+ text formatters, what you saw was _not what you got.
49
+
50
+ Even back then, there were more sophisticated tools. TeX was around, though I didn't know it and never really
51
+ saw it. LaTeX I suppose came later. At that time, dot matrix printers were not uncommon -- and on the mainframes,
52
+ even line printers were still common (typically without even lowercase letters).
53
+
54
+ As for "really fancy" output such as TeX could produce, I don't know that our comp sci department _or our
55
+ computer center could really print such material. If I used a printer that could print italics and boldface text,
56
+ I was ecstatic.
57
+
58
+ This is starting to sound like the stories about walking to school in the snow, right? And it was uphill both
59
+ ways? That's not my point. The hardware was primitive, yes, and the software was primitive, too.
60
+
61
+ When WYSIWYG came along, suddenly armies of "ordinary people" escaped their typewriters and learned the joys of
62
+ backspace and delete. Programmers benefited, too. And yet...
63
+
64
+ I won't even go into the disadvantages of the GUI in general. That could be a controversy in itself. Suffice to
65
+ say that I earned two degrees in computer science and hardly even _touched a mouse. In fact, I don't think I
66
+ actually owned a mouse until four or five years later. I remember with fondness the online signature of one
67
+ Arno Schaefer: *(How do I type) `("for i in \*.dvi do xdvi i done") *(in a GUI?) But that is a little outside our
68
+ discussion here.
69
+
70
+ From a programmer's perspective, a primary failing of the word processor in general is that it stores documents
71
+ in a binary format rather than text. It is difficult or impossible to peer into those files from the outside.
72
+
73
+ That means that all of the traditional Unix utilities, so useful for text files, are useless for Word documents
74
+ and similar file types. Which utilities? That depends on how well you know Unix and how much time you have
75
+ spent at the command line.
76
+
77
+ The first utility, of course, is the text editor itself. If you want fancy formatting and WYSIWYG, the traditional
78
+ editors like vim and emacs won't seem that great to you. But if you want something "lean, mean, and easy" --
79
+ maybe these are pretty great after all. (Granted, nothing ever seems "cool" until you learn to use it effectively.)
80
+
81
+ Personally I use vim (although I freely admit that emacs is more powerful, just as I admit LISP is more powerful
82
+ than any of my favorite languages). It loads into memory very quickly, it loads files quickly, it saves them
83
+ quickly, and it never crashes. Navigation is fast and simple (again, if you know what you're doing). I've never
84
+ done real scripting in vim, but I have sometimes used macros and such.
85
+
86
+ But the editor is only the beginning. Some of the utilities I have used are: grep, wc, fold, cut, colrm,
87
+ diff, sdiff, csplit, expand, head, tail, less, more, cut, sort, split, strings, tee, tr, and uniq. Sometimes I have
88
+ even used awk, sed, and m4. I can combine files, split them, search them, and manipulate their contents at will.
89
+
90
+ I can redirect standard input, standard output, and standard error for these utilities. I can use pipes with them.
91
+ Many of these tools understand regular expressions. I can build scripts that perform multiple commands, even with
92
+ some simple branching and looping logic involved.
93
+
94
+ None of these things are possible in general with Word documents. None of these tools or techniques will work well
95
+ with such a file format.
96
+
97
+ But let's go a step farther... I'm a programmer, after all. I principally work in Ruby, which is good for text
98
+ processing (far more powerful and friendly than bash or awk, for instance).
99
+
100
+ I have written programs that could search and/or replace only in the body of the text, only in the source code,
101
+ or in both. I have written programs to extract code fragments from the text, to insert them, to syntax-check them,
102
+ and to format them. I've written programs to create test cases, to syntax-check code, and to reorder (and renumber)
103
+ sections and other items. I've written code that will honor the file format (and code fragments) and spell-check
104
+ the document, naturally honoring all the technical terms and abbreviations unique to my topic. I've written code
105
+ to extract a table of contents, lists of figures, and lists of code listings. I've written code to compare the
106
+ sizes of different sections, code to check cross-references, and code to suggest keywords for the index.
107
+
108
+ Is all this overkill? You could argue that. Some of these things are doable in MS Word, after all. But you have to
109
+ do everything _their_ way; you can't tweak or customize the functions; and you can't turn off all the features you
110
+ don't need or want. Furthermore, you can't automate it, you have to use the mouse, and sometimes it just crashes or
111
+ malfunctions for a reason you may or may not figure out.
112
+
113
+ There are many solutions, of course. If you know TeX, that is probably the ultimate tool; and there are add-ons
114
+ such as LaTeX and Lyx to make it easier. I've never learned any of this; for most of my purposes, it would be a
115
+ case of killing a mosquito with a hand grenade. On the other hand... if I were writing a calculus textbook, as I
116
+ never will, I would want something like that to handle all the mathematical notation.
117
+
118
+ As a side note, I've never used Lyx. But I've heard it is a nice compromise between the two paradigms -- a WYSIWYG
119
+ editor that also offers low-level access to the raw markup.
120
+
121
+ What's interesting is that people often "roll their own" solutions. I have done it myself (although I principally
122
+ worked with plain HTML), and I have seen it done by others more than once. It's natural, as programmers are always
123
+ looking for an easier or better way to do things.
124
+
125
+ Once in a while, a programmer will build a solution that is also intended to benefit others who think the same way.
126
+ An excellent example is the relatively new _Softcover_, created by Michael Hartl (https://www.softcover.io/).
127
+ I've only begun to learn it myself, but my initial impression is that what troff was in the 70s, softcover will be
128
+ in only a year or two. It looks to me like a powerful text formatter for the 21st century -- a tool that will let
129
+ the author/programmer do what he wants without getting too much in the way.
130
+
131
+ Softcover was designed (in my opinion) the "right way" -- that is, it was first built for a specific purpose, and
132
+ during that process, ideas were generated, and lessons were learned. This enables the developer to avoid false moves,
133
+ design flaws, and "dead ends." Remember that, in the same way, Ruby on Rails was first an application (Basecamp, as
134
+ I recall) before it was abstracted and generalized into a framework.
135
+
136
+ Softcover does other things right as well. It isn't just a tool or framework, but also a publishing platform for
137
+ ebooks. There is at least one print book published this way as well, and I expect more.
138
+
139
+ When programmers write, the readers are often programmers as well. And we are certainly (on the whole) heavy
140
+ consumers of electronic reading material. Only one American in four uses any kind of ebook reader; but do you know
141
+ of even a single software person who doesn't use one?
142
+
143
+ So it's a tool, and it's a publishing platform. The business model permits the author to keep a high percentage of
144
+ the sale price of the book. All this assumes, of course, that the author is actually capable of producing quality
145
+ material without the help of the host of individuals at a traditional publishing house. But I've noticed that this
146
+ often can be done, especially if the author seeks a little outside help now and then.
147
+
148
+ So I see Softcover as a tool, a platform, and community that connects writers to readers (and to each other). You
149
+ might consider checking it out.
150
+
@@ -0,0 +1,43 @@
1
+ .mixin liveblog
2
+
3
+ .post 3
4
+
5
+ .title How to turn your brain sideways
6
+ .pubdate 2015-07-17
7
+ .views computing
8
+ .tags
9
+
10
+ .teaser
11
+ If you think in OOP, as I do, then functional programming is a great way to
12
+ shake your neurons out of their complacency.
13
+ .end
14
+
15
+ If you already know FP, you may be smiling a little. Maybe you learned it a
16
+ long time ago. Maybe it's natural to you. To me, it isn't.
17
+
18
+ The three basic stumbling blocks for me are:
19
+
20
+ .list
21
+ The concept that all data are immutable
22
+ The concept of tail recursion as opposed to looping
23
+ The concept of pattern matching as opposed to traditional assignment
24
+ .end
25
+
26
+ Yet, of course, those are perhaps the very foundations of functional programming.
27
+ In theory, it all makes sense to me; but it doesn't yet stick to my brain.
28
+
29
+ In many ways, it is literally like learning a foreign language. Not just varying
30
+ syntax and slightly different semantics. If you know C++, Java, Object Pascal, or
31
+ any host of other languages, then you know that these feel "similar" in some ways.
32
+
33
+ Here's an analogy for you. If you have studied French, Spanish, and Italian, you
34
+ have noticed they are of the same "family." They're not identical by any means,
35
+ but you can often transfer knowledge from one area to another. That's how OOP
36
+ languages feel to me.
37
+
38
+ On the other hand, functional languages feel to me as if I were trying to learn
39
+ an Asian tongue like Japanese or Korean. The differences are not just fairly minor
40
+ differences in syntax and semantics, but a difference in paradigm.
41
+
42
+ Learning Elixir is making me feel young and incompetent again. This is a nice break
43
+ from feeling old and incompetent.
@@ -0,0 +1,26 @@
1
+ .mixin liveblog
2
+
3
+ .post 4
4
+
5
+ .title Upcoming Lone Star Ruby Conference...
6
+ .pubdate 2015-07-20
7
+ .views computing austin
8
+ .tags
9
+
10
+ .teaser
11
+ After a short hiatus, LSRC is back! Join us in Austin next month. Speakers have
12
+ just been announced.
13
+ .end
14
+
15
+ I submitted a proposal, but it wasn't accepted this time. But many other fine people
16
+ will be presenting there -- see http://LoneStarRuby.org
17
+
18
+ As a bonus, there is a Phoenix training session on the day before. Wait, what? Phoenix
19
+ isn't Ruby. It's Elixir.
20
+
21
+ That's true. But Phoenix and Elixir are cool, too. And Jim Freeze who organizes LSRC
22
+ also put together the first Elixir Conference last year (and the upcoming one in 2015).
23
+ So we're keeping it in the family.
24
+
25
+ I hope to see you at *[all three] of these events.
26
+
@@ -0,0 +1,17 @@
1
+ .mixin liveblog
2
+
3
+ .post 5
4
+
5
+ .title Elixir Conf 2015 announced
6
+ .pubdate 2015-07-22
7
+ .views computing
8
+ .tags
9
+
10
+ .teaser
11
+ Elixir Conference 2015 will be in early October in Austin, Texas!
12
+ .end
13
+
14
+ It's sure to be a great time. The CFP will be open until mid-August. You're
15
+ encouraged to submit.
16
+
17
+ Really looking forward to this one.
@@ -0,0 +1,30 @@
1
+ .mixin liveblog
2
+
3
+ .post 6
4
+
5
+ .title Ruby for Dinosaurs...
6
+ .pubdate 2015-07-23
7
+ .views computing
8
+ .tags
9
+
10
+ .pin computing
11
+
12
+ .teaser
13
+ I have a good friend I've known since college. He was much older than I was (though
14
+ now somehow we are much closer together in age). He was a mentor to me with regard
15
+ to computers and other things.
16
+ .end
17
+
18
+ He was a brilliant programmer and actually wrote a C compiler in the days before the
19
+ IBM PC. He's now past 70 if I am not mistaken. Lately, he says technical things make
20
+ him tired.
21
+
22
+ But as a Ruby enthusiast, I felt obligated to pass on some of the insights I had in
23
+ the last 16 years. Will it bring him out of retirement and get him to write code
24
+ again? Maybe not. But I had been meaning for years to write this little intro, and so
25
+ I finally did.
26
+
27
+ Here's the PDF of $$link["Ruby for the Old-Time C Programmer"|assets/rubydino.pdf]
28
+
29
+ If you know someone who thinks in C and never learned OOP, you might share it with
30
+ that person as well. If you have comments, feel free to email me.
@@ -0,0 +1,90 @@
1
+ .mixin liveblog
2
+
3
+ .post 7
4
+
5
+ .title Phoenix isn't Rails
6
+ .pubdate 2015-07-27
7
+ .views computing
8
+ .tags
9
+
10
+ .teaser
11
+ I don't know Elixir very well at all. But I've started to learn Phoenix now. The
12
+ first thing to know: Phoenix is <i>not</i> Ruby on Rails (nor is it "Elixir on Rails").
13
+ .end
14
+
15
+ I began my learning experience by dutifully crunching through the tutorial and
16
+ making my share (at least) of newbie mistakes. (Disclaimer: I'm not a web guy. I
17
+ don't natively "think" in those terms and perhaps never will.)
18
+
19
+ At some point in the hello-world example, I stopped and did a count of the files
20
+ under my tree. It will become clear in a moment why this was a little naive and
21
+ careless.
22
+
23
+ At any rate, I think <tt>find . | wc -l</tt>reported 11,648 files to me. I found this
24
+ a bit confusing and puzzling, and I didn't think it through.
25
+
26
+ I chatted with Chris McCord and another guy I don't think I've met. This is a summary:
27
+
28
+ <pre>
29
+ hal_9000: chrismccord: I have a question about the philosophy/design
30
+ of phoenix - if you have time/inclination and the answer is not too involved
31
+
32
+ chrismccord: hal_9000: shoot
33
+
34
+ hal_9000: first of all, i’m not a web guy - i’ve played with rails and several
35
+ other things - wrote a few small apps. One thing that appealed to me
36
+ about Sinatra was how “lightweight” it was compared to Rails — you can
37
+ write a primitive Sinatra app in a single file.
38
+ hal_9000: i “sort of” expected that Phoenix might be that way — but a find piped
39
+ to wc showed me that a hello-world app has more than 11,000 files in it.
40
+ why in general is that?
41
+
42
+ chrismccord: hal_9000: remove the node_modules folder and re-run ws
43
+ chrismccord: it's all nodejs for the asset building
44
+ chrismccord: hal_9000: we are lightweight. It's a misconception I have to keep correcting.
45
+ We are much closer to sinatra than rails
46
+
47
+ hal_9000: hmm, i don’t even know nodejs of course
48
+ hal_9000: chrismccord: thanks, i had a feeling i was missing something for sure
49
+
50
+ chrismccord: hal_9000: you could write an app in a single file, but no-one does that,
51
+ because we don't write production software in a single file
52
+ chrismccord: hal_9000: It is also worth mentioning there is also nothing global in
53
+ phoenix. We are not a monolith like rails
54
+
55
+ jeregrine: hal_9000: something to keep in mind here is that phoenix assumes you are
56
+ writing production software. Eventually you will need to touch every file, otherwise
57
+ it wouldn't generate the file
58
+
59
+ hal_9000: chrismccord: ok, thanks, i will look more closely. i’m impressed with what i see
60
+
61
+ jeregrine: hal_9000: if you are like me and have used sinatra for production software you
62
+ probably discovered you ended up writing a slightly smaller version of rails
63
+
64
+ hal_9000: jeregrine: that makes perfect sense
65
+
66
+ jeregrine: hal_9000: if you only need a single route/api call, and are certain it will never grow,
67
+ you could VERY easily get away with just plug and it's router
68
+ jeregrine: hal_9000: http://hexdocs.pm/plug/Plug.Router.html for reference.
69
+
70
+ hal_9000: chrismccord: i grasp it now, sorry for the noise
71
+
72
+ jeregrine: hal_9000: lemme know if you have any questions, this is something we need to be better at
73
+ communicating. We are not rails
74
+
75
+ chrismccord: hal_9000: no worries. Sorry if my response was rash too. I just have to fight a lot of
76
+ "phoenix is bloated" comments because people assume it is given my Rails background and
77
+ the comparisons with rails
78
+
79
+ hal_9000: chrismccord: no, your response was not rash at all
80
+ </pre>
81
+
82
+ So first of all: I didn't pay attention to what I was doing when I did my file count.
83
+
84
+ But the real takeaway here is: Phoenix isn't bloated, and more importantly, <i>Phoenix isn't Rails</i>.
85
+ The philosophy seems to be more "minimalistic" as I had hoped.
86
+
87
+ And of course, we all know that Elixir isn't Ruby. I won't belabor that point.
88
+
89
+ On the other hand, I do find (so far) that Plug is a lot like Rack. That's a good thing, because I
90
+ always thought Rack was sheer genius. More on that as I learn.
@@ -0,0 +1,105 @@
1
+ .mixin liveblog
2
+
3
+ .post 8
4
+
5
+ .title Concerning the term "monkeypatching"
6
+ .pubdate 2015-08-10
7
+ .views computing
8
+ .tags
9
+
10
+ .pin computing
11
+
12
+ .teaser
13
+ There have been many "dark days" in the Ruby community, some much darker than others.
14
+ .end
15
+
16
+ Guy Decoux died, \_why the lucky stiff\_ left us (without dying), Jim Weirich died. (Yes, I count
17
+ actual deaths as the darkest moments of all.)
18
+
19
+ But I count another dark moment that many of you will not. When I had been using Ruby a
20
+ little more than six years, in December 2005, the term "monkeypatching" was introduced
21
+ into our circle.
22
+
23
+ It was a post by Drew Mills, quoting a blog from a Python person who apparently hated Ruby.
24
+ I don't blame Drew. I don't suppose I "blame" anyone. But I regret that this slang has entered
25
+ our culture.
26
+
27
+ The post Drew quoted was this:
28
+
29
+ .quote
30
+ It's the second generation that's going to be less enthused,
31
+ that's going to stare in bafflement at these classes that
32
+ mysteriously spawn methods, and trying to figure out what's
33
+ going when there's an exception in dynamically generated
34
+ code. You can monkeypatch code in Python pretty easily, but we
35
+ look down on it enough that we call it "monkeypatching". In
36
+ Ruby they call it "opening a class" and think it's a cool
37
+ feature. I will assert: we are right, they are wrong.
38
+ .end
39
+
40
+ Before I go on to my main point, I'll make an observation that is arguably much more interesting.
41
+ If you read again, it sounds like the Python person (Ian Bicking) was talking about dynamic method
42
+ dispatch (the use or abuse of method_missing) rather than actual open classes.
43
+
44
+ Someone later in that thread decried the "ignorance" of Bicking with regard to this -- that he didn't
45
+ even know enough Ruby to know the difference between dynamic dispatch and open classes. I
46
+ wonder if the original pythonism meant something different? Since I never completed my Python
47
+ studies, I can't comment.
48
+
49
+ At any rate: Back to my story.
50
+
51
+ I still recall the revulsion I felt, almost physical nausea, when I read this the first time. That's probably
52
+ a somewhat extreme response on my part.
53
+
54
+ I regarded open classes as a programming technique that is potentially very powerful but easy to misuse.
55
+ This sounds like a "good and yet bad" argument. But let me rephrase that sentence.
56
+
57
+ Open classes are a technique that is potentially very powerful _(and therefore) easy to misuse. That is
58
+ the point. Any tool that is powerful enough is prone to misuse by people who are unskilled.
59
+
60
+ The term "monkeypatching" is obviously a pejorative term. Upon seeing it, my first thought was, "I am
61
+ not a monkey, and I am not 'patching' anything."
62
+
63
+ After all, that is the implication. The term implies that the developer is a monkey, and that the work he is
64
+ doing is sloppy or shoddy. It is an insult both to the quality of the developer's work and to the developer
65
+ himself.
66
+
67
+ So it bothered me because it was a pejorative and it was insulting to us as programmers. It was also
68
+ (arguably) an insult to Ruby itself and therefore by extension an insult to Matz.
69
+
70
+ I dislike being clannish, though perhaps sometimes I am. After all, Ruby is not (supposed to be) anyone's
71
+ religion or cultural heritage. It's only a programming language, and I think it's very much like Python. But it
72
+ also bothered me that this neologism originated _outside our community, in particular with the Python
73
+ community.
74
+
75
+ Generalizations are always wrong. (Yes, that's a joke.) And stereotypes as such are at least useless if not
76
+ actually hurtful. And yet I always heard about the arrogance and rudeness of Python programmers, and I
77
+ occasionally saw real evidence of it. And though I dislike the word "nice" in general, I always found it interesting
78
+ that Ruby coders were labeled as "nice" (as in the abbreviation MINASWAN, "Matz is nice, and so we are nice").
79
+
80
+ So when this usage was introduced, I felt rather as though someone had opened my front door and dumped a
81
+ large piece of dog manure onto my carpet. What is worse, it has wormed its way into common usage in our
82
+ community, even in documentation. A lot of this happened in the early days of Rails, when fate dumped a huge
83
+ influx of newbies onto the Ruby community. Not to disparage the Rails people in general, but at the time this
84
+ felt much the same as it did back when AOL (America Online) made its debut and dumped millions of (insert
85
+ noun here) into the Internet and Usenet communities.
86
+
87
+ It's impossible to stop this usage now (like so many other usages in the English language having nothing to do
88
+ with computing). But I still protest, and I still stand against it.
89
+
90
+ The term "monkeypatching" appears only once in more than 800 pages of _[The Ruby Way]. It occurs when I
91
+ say I don't condone this term, and it won't be used further in the book.
92
+
93
+ As an aside: The "refinements" which exist in recent versions of Ruby make open classes stricter and safer. I'll blog
94
+ about that later. But this isn't much of a technical post. It's just a reminiscence and a rant.
95
+
96
+ So basically I hate the term "monkeypatching." I am polite to people who say it to me (e.g., in asking a question), but
97
+ secretly I want to just ignore them.
98
+
99
+ The last time I saw Jim Weirich, in New Orleans, he and I talked about this. He agreed it was a pejorative term,
100
+ and it was a shame it had entered the common dialect, though there was really nothing to do about it. But being
101
+ much more level-headed and good-natured than I am, he wasn't bothered much by it.
102
+
103
+ I really miss Jim, by the way. He was a truly brilliant developer and an amiable and wonderful person in general.
104
+ If it would bring him back, I would gladly change the book's name to _[The Art of Monkeypatching].
105
+
@@ -0,0 +1,20 @@
1
+ .mixin liveblog
2
+
3
+ .post 9
4
+
5
+ .title Announcement coming soon...
6
+ .pubdate 2015-08-11
7
+ .views computing
8
+ .tags
9
+
10
+ .teaser
11
+ Maybe this will stir your curiosity a little. I hope it does.
12
+ I've started working on a project with someone else, and I
13
+ think it will be really worthwhile.
14
+ .end
15
+
16
+ This will be launched within 48 hours and announced at the
17
+ Lone Star Ruby Conference in Austin, Texas (October 15).
18
+ Maybe it will be leaked a little before then, too.
19
+
20
+ Sit tight 48 hours or so...