typo 3.99.0

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 (742) hide show
  1. data/.DS_Store +0 -0
  2. data/CHANGELOG +718 -0
  3. data/MAINTAINERS +30 -0
  4. data/MIT-LICENSE +21 -0
  5. data/README +92 -0
  6. data/Rakefile +10 -0
  7. data/app/apis/blogger_service.rb +94 -0
  8. data/app/apis/meta_weblog_service.rb +197 -0
  9. data/app/apis/movable_type_service.rb +150 -0
  10. data/app/apis/typo_web_service.rb +26 -0
  11. data/app/controllers/accounts_controller.rb +52 -0
  12. data/app/controllers/admin/base_controller.rb +21 -0
  13. data/app/controllers/admin/blacklist_controller.rb +50 -0
  14. data/app/controllers/admin/cache_controller.rb +31 -0
  15. data/app/controllers/admin/categories_controller.rb +64 -0
  16. data/app/controllers/admin/comments_controller.rb +57 -0
  17. data/app/controllers/admin/content_controller.rb +147 -0
  18. data/app/controllers/admin/general_controller.rb +42 -0
  19. data/app/controllers/admin/pages_controller.rb +50 -0
  20. data/app/controllers/admin/resources_controller.rb +98 -0
  21. data/app/controllers/admin/sidebar_controller.rb +74 -0
  22. data/app/controllers/admin/textfilters_controller.rb +104 -0
  23. data/app/controllers/admin/themes_controller.rb +20 -0
  24. data/app/controllers/admin/trackbacks_controller.rb +54 -0
  25. data/app/controllers/admin/users_controller.rb +41 -0
  26. data/app/controllers/application.rb +66 -0
  27. data/app/controllers/articles_controller.rb +218 -0
  28. data/app/controllers/backend_controller.rb +11 -0
  29. data/app/controllers/content_controller.rb +98 -0
  30. data/app/controllers/live_controller.rb +10 -0
  31. data/app/controllers/redirect_controller.rb +16 -0
  32. data/app/controllers/sidebar_controller.rb +50 -0
  33. data/app/controllers/textfilter_controller.rb +22 -0
  34. data/app/controllers/theme_controller.rb +52 -0
  35. data/app/controllers/xml_controller.rb +111 -0
  36. data/app/helpers/accounts_helper.rb +2 -0
  37. data/app/helpers/admin/base_helper.rb +124 -0
  38. data/app/helpers/admin/blacklist_helper.rb +2 -0
  39. data/app/helpers/admin/cache_helper.rb +2 -0
  40. data/app/helpers/admin/comments_helper.rb +2 -0
  41. data/app/helpers/admin/content_helper.rb +2 -0
  42. data/app/helpers/admin/general_helper.rb +2 -0
  43. data/app/helpers/admin/pages_helper.rb +2 -0
  44. data/app/helpers/admin/resources_helper.rb +2 -0
  45. data/app/helpers/admin/sidebar_helper.rb +2 -0
  46. data/app/helpers/admin/textfilters_helper.rb +2 -0
  47. data/app/helpers/admin/themes_helper.rb +2 -0
  48. data/app/helpers/admin/trackbacks_helper.rb +2 -0
  49. data/app/helpers/admin/users_helper.rb +2 -0
  50. data/app/helpers/application_helper.rb +92 -0
  51. data/app/helpers/articles_helper.rb +163 -0
  52. data/app/helpers/backend_helper.rb +2 -0
  53. data/app/helpers/content_helper.rb +3 -0
  54. data/app/helpers/mail_helper.rb +6 -0
  55. data/app/helpers/redirect_helper.rb +2 -0
  56. data/app/helpers/sidebar_helper.rb +22 -0
  57. data/app/helpers/sidebars/plugin_helper.rb +2 -0
  58. data/app/helpers/text_filter_plugin_helper.rb +2 -0
  59. data/app/helpers/textfilter_helper.rb +2 -0
  60. data/app/helpers/theme_helper.rb +23 -0
  61. data/app/helpers/xml_helper.rb +21 -0
  62. data/app/models/aggregations/audioscrobbler.rb +54 -0
  63. data/app/models/aggregations/backpack.rb +57 -0
  64. data/app/models/aggregations/delicious.rb +57 -0
  65. data/app/models/aggregations/flickr.rb +89 -0
  66. data/app/models/aggregations/fortythree.rb +62 -0
  67. data/app/models/aggregations/magnolia.rb +81 -0
  68. data/app/models/aggregations/tada.rb +75 -0
  69. data/app/models/aggregations/technorati.rb +51 -0
  70. data/app/models/aggregations/upcoming.rb +74 -0
  71. data/app/models/article.rb +211 -0
  72. data/app/models/blacklist_pattern.rb +22 -0
  73. data/app/models/blog.rb +162 -0
  74. data/app/models/blog_sweeper.rb +23 -0
  75. data/app/models/category.rb +62 -0
  76. data/app/models/comment.rb +76 -0
  77. data/app/models/config_manager.rb +80 -0
  78. data/app/models/content.rb +222 -0
  79. data/app/models/content_observer.rb +5 -0
  80. data/app/models/content_state/base.rb +51 -0
  81. data/app/models/content_state/draft.rb +40 -0
  82. data/app/models/content_state/factory.rb +16 -0
  83. data/app/models/content_state/just_published.rb +47 -0
  84. data/app/models/content_state/new.rb +45 -0
  85. data/app/models/content_state/publication_pending.rb +43 -0
  86. data/app/models/content_state/published.rb +35 -0
  87. data/app/models/email_notifier.rb +9 -0
  88. data/app/models/notification_mailer.rb +34 -0
  89. data/app/models/page.rb +20 -0
  90. data/app/models/page_cache.rb +29 -0
  91. data/app/models/ping.rb +129 -0
  92. data/app/models/redirect.rb +3 -0
  93. data/app/models/resource.rb +76 -0
  94. data/app/models/sidebar.rb +32 -0
  95. data/app/models/simple_cache.rb +37 -0
  96. data/app/models/tag.rb +63 -0
  97. data/app/models/text_filter.rb +111 -0
  98. data/app/models/theme.rb +44 -0
  99. data/app/models/trackback.rb +51 -0
  100. data/app/models/trigger.rb +31 -0
  101. data/app/models/user.rb +113 -0
  102. data/app/models/web_notifier.rb +7 -0
  103. data/app/views/accounts/login.rhtml +24 -0
  104. data/app/views/accounts/logout.rhtml +12 -0
  105. data/app/views/accounts/signup.rhtml +26 -0
  106. data/app/views/accounts/welcome.rhtml +13 -0
  107. data/app/views/admin/base/_recent_comments.rhtml +10 -0
  108. data/app/views/admin/base/_recent_trackbacks.rhtml +10 -0
  109. data/app/views/admin/blacklist/_blacklist_patterns.rhtml +16 -0
  110. data/app/views/admin/blacklist/_form.rhtml +15 -0
  111. data/app/views/admin/blacklist/_quick_post.rhtml +16 -0
  112. data/app/views/admin/blacklist/destroy.rhtml +10 -0
  113. data/app/views/admin/blacklist/edit.rhtml +14 -0
  114. data/app/views/admin/blacklist/list.rhtml +13 -0
  115. data/app/views/admin/cache/list.rhtml +8 -0
  116. data/app/views/admin/categories/_categories.rhtml +14 -0
  117. data/app/views/admin/categories/_form.rhtml +7 -0
  118. data/app/views/admin/categories/_quick_post.rhtml +11 -0
  119. data/app/views/admin/categories/destroy.rhtml +10 -0
  120. data/app/views/admin/categories/edit.rhtml +13 -0
  121. data/app/views/admin/categories/list.rhtml +15 -0
  122. data/app/views/admin/categories/reorder.rhtml +9 -0
  123. data/app/views/admin/categories/show.rhtml +18 -0
  124. data/app/views/admin/comments/_form.rhtml +19 -0
  125. data/app/views/admin/comments/comments.rhtml +4 -0
  126. data/app/views/admin/comments/destroy.rhtml +11 -0
  127. data/app/views/admin/comments/edit.rhtml +18 -0
  128. data/app/views/admin/comments/list.rhtml +31 -0
  129. data/app/views/admin/comments/new.rhtml +15 -0
  130. data/app/views/admin/comments/show.rhtml +10 -0
  131. data/app/views/admin/content/_articles.rhtml +20 -0
  132. data/app/views/admin/content/_attachment.rhtml +17 -0
  133. data/app/views/admin/content/_form.rhtml +51 -0
  134. data/app/views/admin/content/_pages.rhtml +3 -0
  135. data/app/views/admin/content/_quick_post.rhtml +20 -0
  136. data/app/views/admin/content/_show_categories.rhtml +9 -0
  137. data/app/views/admin/content/_show_resources.rhtml +9 -0
  138. data/app/views/admin/content/destroy.rhtml +11 -0
  139. data/app/views/admin/content/edit.rhtml +28 -0
  140. data/app/views/admin/content/list.rhtml +20 -0
  141. data/app/views/admin/content/new.rhtml +27 -0
  142. data/app/views/admin/content/preview.rhtml +3 -0
  143. data/app/views/admin/content/show.rhtml +25 -0
  144. data/app/views/admin/general/index.rhtml +216 -0
  145. data/app/views/admin/general/update_database.rhtml +44 -0
  146. data/app/views/admin/pages/_form.rhtml +19 -0
  147. data/app/views/admin/pages/_pages.rhtml +18 -0
  148. data/app/views/admin/pages/_quick_post.rhtml +21 -0
  149. data/app/views/admin/pages/destroy.rhtml +11 -0
  150. data/app/views/admin/pages/edit.rhtml +28 -0
  151. data/app/views/admin/pages/list.rhtml +13 -0
  152. data/app/views/admin/pages/new.rhtml +24 -0
  153. data/app/views/admin/pages/preview.rhtml +1 -0
  154. data/app/views/admin/pages/show.rhtml +14 -0
  155. data/app/views/admin/resources/_itunes_category_add.rhtml +11 -0
  156. data/app/views/admin/resources/_itunes_category_edit.rhtml +32 -0
  157. data/app/views/admin/resources/_metadata_add.rhtml +22 -0
  158. data/app/views/admin/resources/_metadata_edit.rhtml +22 -0
  159. data/app/views/admin/resources/_mime_edit.rhtml +8 -0
  160. data/app/views/admin/resources/_pages.rhtml +3 -0
  161. data/app/views/admin/resources/_resources.rhtml +40 -0
  162. data/app/views/admin/resources/destroy.rhtml +11 -0
  163. data/app/views/admin/resources/list.rhtml +9 -0
  164. data/app/views/admin/resources/new.rhtml +12 -0
  165. data/app/views/admin/sidebar/_active.rhtml +14 -0
  166. data/app/views/admin/sidebar/_actives.rhtml +9 -0
  167. data/app/views/admin/sidebar/_available.rhtml +5 -0
  168. data/app/views/admin/sidebar/_availables.rhtml +5 -0
  169. data/app/views/admin/sidebar/_publish.rhtml +2 -0
  170. data/app/views/admin/sidebar/_target.rhtml +1 -0
  171. data/app/views/admin/sidebar/index.rhtml +34 -0
  172. data/app/views/admin/sidebar/publish.rjs +6 -0
  173. data/app/views/admin/sidebar/remove.rjs +5 -0
  174. data/app/views/admin/sidebar/set_active.rjs +10 -0
  175. data/app/views/admin/textfilters/_form.rhtml +45 -0
  176. data/app/views/admin/textfilters/_macros.rhtml +16 -0
  177. data/app/views/admin/textfilters/_textfilters.rhtml +20 -0
  178. data/app/views/admin/textfilters/destroy.rhtml +10 -0
  179. data/app/views/admin/textfilters/edit.rhtml +17 -0
  180. data/app/views/admin/textfilters/list.rhtml +15 -0
  181. data/app/views/admin/textfilters/macro_help.rhtml +3 -0
  182. data/app/views/admin/textfilters/new.rhtml +15 -0
  183. data/app/views/admin/textfilters/preview.rhtml +3 -0
  184. data/app/views/admin/textfilters/show.rhtml +34 -0
  185. data/app/views/admin/textfilters/show_help.rhtml +8 -0
  186. data/app/views/admin/themes/index.rhtml +12 -0
  187. data/app/views/admin/trackbacks/_form.rhtml +19 -0
  188. data/app/views/admin/trackbacks/destroy.rhtml +6 -0
  189. data/app/views/admin/trackbacks/edit.rhtml +14 -0
  190. data/app/views/admin/trackbacks/list.rhtml +31 -0
  191. data/app/views/admin/trackbacks/new.rhtml +15 -0
  192. data/app/views/admin/trackbacks/show.rhtml +14 -0
  193. data/app/views/admin/users/_form.rhtml +48 -0
  194. data/app/views/admin/users/_user.rhtml +9 -0
  195. data/app/views/admin/users/destroy.rhtml +14 -0
  196. data/app/views/admin/users/edit.rhtml +14 -0
  197. data/app/views/admin/users/list.rhtml +9 -0
  198. data/app/views/admin/users/new.rhtml +15 -0
  199. data/app/views/admin/users/show.rhtml +18 -0
  200. data/app/views/articles/_article.rhtml +4 -0
  201. data/app/views/articles/_comment.rhtml +7 -0
  202. data/app/views/articles/_comment_box.rhtml +43 -0
  203. data/app/views/articles/_comment_error.rhtml +1 -0
  204. data/app/views/articles/_trackback.rhtml +7 -0
  205. data/app/views/articles/archives.rhtml +22 -0
  206. data/app/views/articles/comment_preview.rhtml +3 -0
  207. data/app/views/articles/error.rhtml +3 -0
  208. data/app/views/articles/groupings.rhtml +14 -0
  209. data/app/views/articles/index.rhtml +11 -0
  210. data/app/views/articles/read.rhtml +70 -0
  211. data/app/views/articles/trackback.rxml +5 -0
  212. data/app/views/articles/view_page.rhtml +3 -0
  213. data/app/views/layouts/accounts.rhtml +22 -0
  214. data/app/views/layouts/administration.rhtml +75 -0
  215. data/app/views/layouts/sidebar.rhtml +40 -0
  216. data/app/views/live/search.rhtml +10 -0
  217. data/app/views/notification_mailer/_mail_footer.rhtml +7 -0
  218. data/app/views/notification_mailer/_mail_header.rhtml +1 -0
  219. data/app/views/notification_mailer/article.rhtml +6 -0
  220. data/app/views/notification_mailer/comment.rhtml +11 -0
  221. data/app/views/notification_mailer/trackback.rhtml +3 -0
  222. data/app/views/settings/done.rhtml +2 -0
  223. data/app/views/settings/install.rhtml +12 -0
  224. data/app/views/shared/_search.rhtml +10 -0
  225. data/app/views/sidebar/_row.rhtml +1 -0
  226. data/app/views/sidebar/_sidebar.rhtml +5 -0
  227. data/app/views/sidebar/display_plugins.rhtml +5 -0
  228. data/app/views/sidebar/show.rhtml +1 -0
  229. data/app/views/theme/static_view_test.rhtml +1 -0
  230. data/app/views/xml/_atom10_item_article.rxml +39 -0
  231. data/app/views/xml/_atom10_item_comment.rxml +13 -0
  232. data/app/views/xml/_atom10_item_trackback.rxml +16 -0
  233. data/app/views/xml/_itunes_item_resource.rxml +30 -0
  234. data/app/views/xml/_rss20_item_article.rxml +35 -0
  235. data/app/views/xml/_rss20_item_comment.rxml +7 -0
  236. data/app/views/xml/_rss20_item_trackback.rxml +7 -0
  237. data/app/views/xml/atom10_feed.rxml +18 -0
  238. data/app/views/xml/itunes_feed.rxml +29 -0
  239. data/app/views/xml/rsd.rxml +19 -0
  240. data/app/views/xml/rss20_feed.rxml +18 -0
  241. data/bin/typo +12 -0
  242. data/cache/META/DATA/ACTION_PARAM/localhost.3000/articles/index/.cache +540 -0
  243. data/cache/META/DATA/ACTION_PARAM/localhost.3000/articles/permalink/day=09&month=09&title=i-need-a-new-keyboard-and-mouse&year=2005.cache +414 -0
  244. data/cache/META/META/ACTION_PARAM/localhost.3000/articles/index/.cache +3 -0
  245. data/cache/META/META/ACTION_PARAM/localhost.3000/articles/permalink/day=09&month=09&title=i-need-a-new-keyboard-and-mouse&year=2005.cache +3 -0
  246. data/components/plugins/sidebars/aimpresence/content.rhtml +4 -0
  247. data/components/plugins/sidebars/aimpresence_controller.rb +10 -0
  248. data/components/plugins/sidebars/amazon/content.rhtml +4 -0
  249. data/components/plugins/sidebars/amazon_controller.rb +17 -0
  250. data/components/plugins/sidebars/archives/content.rhtml +11 -0
  251. data/components/plugins/sidebars/archives_controller.rb +24 -0
  252. data/components/plugins/sidebars/audioscrobbler/content.rhtml +10 -0
  253. data/components/plugins/sidebars/audioscrobbler_controller.rb +10 -0
  254. data/components/plugins/sidebars/backpack/content.rhtml +12 -0
  255. data/components/plugins/sidebars/backpack_controller.rb +17 -0
  256. data/components/plugins/sidebars/category/content.rhtml +10 -0
  257. data/components/plugins/sidebars/category_controller.rb +13 -0
  258. data/components/plugins/sidebars/delicious/content.rhtml +20 -0
  259. data/components/plugins/sidebars/delicious_controller.rb +29 -0
  260. data/components/plugins/sidebars/flickr/content.rhtml +15 -0
  261. data/components/plugins/sidebars/flickr_controller.rb +16 -0
  262. data/components/plugins/sidebars/fortythree/content.rhtml +8 -0
  263. data/components/plugins/sidebars/fortythree_controller.rb +12 -0
  264. data/components/plugins/sidebars/fortythreeplaces/content.rhtml +8 -0
  265. data/components/plugins/sidebars/fortythreeplaces_controller.rb +12 -0
  266. data/components/plugins/sidebars/magnolia/content.rhtml +12 -0
  267. data/components/plugins/sidebars/magnolia_controller.rb +17 -0
  268. data/components/plugins/sidebars/recent_comments/content.rhtml +12 -0
  269. data/components/plugins/sidebars/recent_comments_controller.rb +23 -0
  270. data/components/plugins/sidebars/static/content.rhtml +2 -0
  271. data/components/plugins/sidebars/static_controller.rb +23 -0
  272. data/components/plugins/sidebars/tada/content.rhtml +12 -0
  273. data/components/plugins/sidebars/tada_controller.rb +12 -0
  274. data/components/plugins/sidebars/tag/content.rhtml +8 -0
  275. data/components/plugins/sidebars/tag_controller.rb +18 -0
  276. data/components/plugins/sidebars/technorati/content.rhtml +8 -0
  277. data/components/plugins/sidebars/technorati_controller.rb +12 -0
  278. data/components/plugins/sidebars/upcoming/content.rhtml +8 -0
  279. data/components/plugins/sidebars/upcoming_controller.rb +11 -0
  280. data/components/plugins/sidebars/xbox/content.rhtml +2 -0
  281. data/components/plugins/sidebars/xbox_controller.rb +6 -0
  282. data/components/plugins/sidebars/xml/content.rhtml +12 -0
  283. data/components/plugins/sidebars/xml_controller.rb +11 -0
  284. data/components/plugins/textfilters/amazon_controller.rb +39 -0
  285. data/components/plugins/textfilters/code_controller.rb +59 -0
  286. data/components/plugins/textfilters/flickr_controller.rb +75 -0
  287. data/components/plugins/textfilters/htmlfilter_controller.rb +8 -0
  288. data/components/plugins/textfilters/lightbox_controller.rb +122 -0
  289. data/components/plugins/textfilters/macropost_controller.rb +14 -0
  290. data/components/plugins/textfilters/macropre_controller.rb +14 -0
  291. data/components/plugins/textfilters/markdown_controller.rb +32 -0
  292. data/components/plugins/textfilters/none_controller.rb +8 -0
  293. data/components/plugins/textfilters/smartypants_controller.rb +8 -0
  294. data/components/plugins/textfilters/sparkline_controller.rb +87 -0
  295. data/components/plugins/textfilters/textile_controller.rb +8 -0
  296. data/components/sidebars/README +36 -0
  297. data/config/boot.rb +44 -0
  298. data/config/database.yml +17 -0
  299. data/config/database.yml-pgsql +17 -0
  300. data/config/database.yml.example +18 -0
  301. data/config/environment.rb +145 -0
  302. data/config/environments/development.rb +17 -0
  303. data/config/environments/production.rb +19 -0
  304. data/config/environments/test.rb +26 -0
  305. data/config/iTunes.yml +72 -0
  306. data/config/lighttpd.conf +46 -0
  307. data/config/mail.yml +8 -0
  308. data/config/mail.yml.example +8 -0
  309. data/config/routes.rb +92 -0
  310. data/db/DB +0 -0
  311. data/db/DB.test +0 -0
  312. data/db/converters/README +14 -0
  313. data/db/converters/feed.rb +68 -0
  314. data/db/converters/mt-import.rb +72 -0
  315. data/db/converters/mt3.rb +172 -0
  316. data/db/converters/rss.rb +67 -0
  317. data/db/converters/s9y.rb +182 -0
  318. data/db/converters/textpattern.rb +137 -0
  319. data/db/converters/wordpress.rb +187 -0
  320. data/db/development_structure.sql +691 -0
  321. data/db/migrate/001_initial_schema.rb +127 -0
  322. data/db/migrate/002_add_user_email.rb +17 -0
  323. data/db/migrate/003_add_article_user_id.rb +20 -0
  324. data/db/migrate/004_add_sidebars.rb +31 -0
  325. data/db/migrate/005_add_cache_table.rb +20 -0
  326. data/db/migrate/006_add_pages.rb +17 -0
  327. data/db/migrate/007_add_permalink.rb +36 -0
  328. data/db/migrate/008_add_page_title.rb +9 -0
  329. data/db/migrate/009_add_article_guid.rb +10 -0
  330. data/db/migrate/010_add_tags.rb +19 -0
  331. data/db/migrate/011_add_article_id.rb +17 -0
  332. data/db/migrate/012_enlarge_settings.rb +11 -0
  333. data/db/migrate/013_add_textfilters.rb +33 -0
  334. data/db/migrate/014_move_text_filter_to_text_filter_id.rb +43 -0
  335. data/db/migrate/015_convert_mysql_to_innodb.rb +19 -0
  336. data/db/migrate/016_fix_is_primary_postgres.rb +19 -0
  337. data/db/migrate/017_add_comment_user_id.rb +23 -0
  338. data/db/migrate/018_add_guids.rb +13 -0
  339. data/db/migrate/019_add_whiteboards_to_content.rb +15 -0
  340. data/db/migrate/020_superclass_articles.rb +167 -0
  341. data/db/migrate/021_superclass_comments.rb +94 -0
  342. data/db/migrate/022_superclass_trackbacks.rb +71 -0
  343. data/db/migrate/023_superclass_pages.rb +64 -0
  344. data/db/migrate/024_cleanup_contents.rb +54 -0
  345. data/db/migrate/025_add_itunes_metadata.rb +29 -0
  346. data/db/migrate/026_add_redirect_table.rb +13 -0
  347. data/db/migrate/027_set_comment_published_flag.rb +19 -0
  348. data/db/migrate/028_rename_redirect_to.rb +12 -0
  349. data/db/migrate/029_add_user_notification.rb +29 -0
  350. data/db/migrate/030_index_sessions.rb +9 -0
  351. data/db/migrate/031_add_notifications_table.rb +14 -0
  352. data/db/migrate/032_add_jabber_notification.rb +11 -0
  353. data/db/migrate/033_add_count_caching.rb +34 -0
  354. data/db/migrate/034_boolify_published.rb +36 -0
  355. data/db/migrate/035_boolify_content_allow_foo.rb +36 -0
  356. data/db/migrate/036_add_tag_display_name.rb +53 -0
  357. data/db/migrate/037_enlarge_ip_field.rb +9 -0
  358. data/db/migrate/038_add_blog_object.rb +52 -0
  359. data/db/migrate/039_serialize_blog_attributes.rb +160 -0
  360. data/db/migrate/040_attach_content_to_blog.rb +28 -0
  361. data/db/migrate/041_fixup_default_sidebars.rb +18 -0
  362. data/db/migrate/042_remove_sidebar_staged_config.rb +22 -0
  363. data/db/migrate/043_create_triggers.rb +14 -0
  364. data/db/migrate/044_add_published_at_to_content.rb +18 -0
  365. data/db/migrate/045_fix_contents_published_default.rb +9 -0
  366. data/db/migrate/046_fixup_forthcoming_publications.rb +40 -0
  367. data/db/schema.mysql-v3.sql +218 -0
  368. data/db/schema.mysql.sql +218 -0
  369. data/db/schema.postgresql.sql +218 -0
  370. data/db/schema.rb +169 -0
  371. data/db/schema.sqlite.sql +218 -0
  372. data/db/schema.sqlserver.sql +232 -0
  373. data/db/schema_version +1 -0
  374. data/db/scripts/fix_permalinks.rb +5 -0
  375. data/db/updates/update.168.to.200.mysql.sql +33 -0
  376. data/db/updates/update.168.to.200.psql.sql +30 -0
  377. data/doc/Installer.txt +55 -0
  378. data/doc/README_FOR_APP +2 -0
  379. data/installer/rails-installer.rb +488 -0
  380. data/installer/rails_installer_defaults.yml +4 -0
  381. data/installer/typo-installer.rb +35 -0
  382. data/lib/backpack_api.rb +202 -0
  383. data/lib/bare_migration.rb +142 -0
  384. data/lib/email_notify.rb +32 -0
  385. data/lib/format.rb +19 -0
  386. data/lib/generators/sidebar/sidebar_generator.rb +13 -0
  387. data/lib/generators/sidebar/templates/components/plugins/sidebars/controller_template.rb +20 -0
  388. data/lib/generators/sidebar/templates/components/plugins/sidebars/views/content_template.rhtml +4 -0
  389. data/lib/jabber_notify.rb +32 -0
  390. data/lib/login_system.rb +85 -0
  391. data/lib/migrator.rb +28 -0
  392. data/lib/rails_patch/active_record.rb +36 -0
  393. data/lib/rails_patch/components.rb +14 -0
  394. data/lib/sidebars/component_plugin.rb +5 -0
  395. data/lib/sidebars/plugin.rb +241 -0
  396. data/lib/spam_protection.rb +126 -0
  397. data/lib/tasks/release.rake +171 -0
  398. data/lib/tasks/schemas.rake +6 -0
  399. data/lib/tasks/sweep_cache.rake +6 -0
  400. data/lib/text_filter_plugin.rb +97 -0
  401. data/lib/transforms.rb +26 -0
  402. data/lib/typo_guid.rb +10 -0
  403. data/lib/typo_plugins.rb +19 -0
  404. data/lib/typo_version.rb +1 -0
  405. data/lib/xmlrpc_fix.rb +13 -0
  406. data/public/.htaccess +34 -0
  407. data/public/404.html +8 -0
  408. data/public/500.html +8 -0
  409. data/public/dispatch.cgi +10 -0
  410. data/public/dispatch.fcgi +24 -0
  411. data/public/dispatch.rb +10 -0
  412. data/public/favicon.ico +0 -0
  413. data/public/images/admin/dot-vertical.gif +0 -0
  414. data/public/images/admin/h-tile.gif +0 -0
  415. data/public/images/admin/hdr-tile.gif +0 -0
  416. data/public/images/admin/toggle.gif +0 -0
  417. data/public/images/bg.jpg +0 -0
  418. data/public/images/bgcolor.jpg +0 -0
  419. data/public/images/body_bg.png +0 -0
  420. data/public/images/branding_bg.png +0 -0
  421. data/public/images/branding_logo.png +0 -0
  422. data/public/images/checked.gif +0 -0
  423. data/public/images/content_bg.png +0 -0
  424. data/public/images/delete.png +0 -0
  425. data/public/images/footer.jpg +0 -0
  426. data/public/images/footer.png +0 -0
  427. data/public/images/global_bg.png +0 -0
  428. data/public/images/global_logo.png +0 -0
  429. data/public/images/go.png +0 -0
  430. data/public/images/header.jpg +0 -0
  431. data/public/images/loading.gif +0 -0
  432. data/public/images/not-checked copy.gif +0 -0
  433. data/public/images/not-checked.gif +0 -0
  434. data/public/images/overlay.png +0 -0
  435. data/public/images/powered.gif +0 -0
  436. data/public/images/section_bg.png +0 -0
  437. data/public/images/sections_bg.png +0 -0
  438. data/public/images/sections_hilite.png +0 -0
  439. data/public/images/sections_hover.png +0 -0
  440. data/public/images/spinner-blue.gif +0 -0
  441. data/public/images/spinner.gif +0 -0
  442. data/public/images/spot-header.gif +0 -0
  443. data/public/images/spot-title.gif +0 -0
  444. data/public/images/x-ed.gif +0 -0
  445. data/public/javascripts/application.js +2 -0
  446. data/public/javascripts/controls.js +815 -0
  447. data/public/javascripts/cookies.js +60 -0
  448. data/public/javascripts/dragdrop.js +724 -0
  449. data/public/javascripts/effects.js +953 -0
  450. data/public/javascripts/lightbox.js +348 -0
  451. data/public/javascripts/prototype.js +1985 -0
  452. data/public/javascripts/scriptaculous.js +47 -0
  453. data/public/javascripts/slider.js +258 -0
  454. data/public/javascripts/typo.js +85 -0
  455. data/public/robots.txt +2 -0
  456. data/public/stylesheets/administration.css +585 -0
  457. data/public/stylesheets/lightbox.css +22 -0
  458. data/public/stylesheets/rss.css +54 -0
  459. data/public/stylesheets/user-styles.css +0 -0
  460. data/script/about +3 -0
  461. data/script/benchmarker +19 -0
  462. data/script/breakpointer +3 -0
  463. data/script/console +3 -0
  464. data/script/destroy +3 -0
  465. data/script/generate +3 -0
  466. data/script/lighttpd +2 -0
  467. data/script/logreport +79 -0
  468. data/script/migrate +31 -0
  469. data/script/performance/benchmarker +3 -0
  470. data/script/performance/profiler +3 -0
  471. data/script/plugin +3 -0
  472. data/script/process/reaper +3 -0
  473. data/script/process/spawner +3 -0
  474. data/script/process/spinner +3 -0
  475. data/script/profiler +34 -0
  476. data/script/runner +3 -0
  477. data/script/server +3 -0
  478. data/script/spacecheck +40 -0
  479. data/test/fixtures/articles_categories.yml +31 -0
  480. data/test/fixtures/articles_tags.yml +19 -0
  481. data/test/fixtures/blacklist_patterns.yml +10 -0
  482. data/test/fixtures/blogs.yml +74 -0
  483. data/test/fixtures/categories.yml +35 -0
  484. data/test/fixtures/contents.yml +297 -0
  485. data/test/fixtures/notification_mailer/article +3 -0
  486. data/test/fixtures/notification_mailer/comment +3 -0
  487. data/test/fixtures/notification_mailer/trackback +3 -0
  488. data/test/fixtures/notifications.yml +0 -0
  489. data/test/fixtures/page_caches.yml +7 -0
  490. data/test/fixtures/redirects.yml +13 -0
  491. data/test/fixtures/resources.yml +24 -0
  492. data/test/fixtures/sidebars.yml +5 -0
  493. data/test/fixtures/tags.yml +13 -0
  494. data/test/fixtures/text_filters.yml +42 -0
  495. data/test/fixtures/triggers.yml +1 -0
  496. data/test/fixtures/users.yml +56 -0
  497. data/test/functional/accounts_controller_test.rb +82 -0
  498. data/test/functional/admin/article_preview_test.rb +67 -0
  499. data/test/functional/admin/blacklist_controller_test.rb +63 -0
  500. data/test/functional/admin/categories_controller_test.rb +112 -0
  501. data/test/functional/admin/comments_controller_test.rb +78 -0
  502. data/test/functional/admin/content_controller_test.rb +234 -0
  503. data/test/functional/admin/general_controller_test.rb +26 -0
  504. data/test/functional/admin/pages_controller_test.rb +103 -0
  505. data/test/functional/admin/resources_controller_test.rb +49 -0
  506. data/test/functional/admin/textfilters_controller_test.rb +29 -0
  507. data/test/functional/admin/themes_controller_test.rb +34 -0
  508. data/test/functional/admin/trackbacks_controller_test.rb +76 -0
  509. data/test/functional/admin/users_controller_test.rb +72 -0
  510. data/test/functional/articles_controller_test.rb +525 -0
  511. data/test/functional/backend_controller_test.rb +273 -0
  512. data/test/functional/redirect_controller_test.rb +40 -0
  513. data/test/functional/textfilter_controller_test.rb +275 -0
  514. data/test/functional/theme_controller_test.rb +45 -0
  515. data/test/functional/xml_controller_test.rb +353 -0
  516. data/test/mocks/test/dns_mock.rb +13 -0
  517. data/test/mocks/test/flickr_mock.rb +30 -0
  518. data/test/mocks/test/http_mock.rb +38 -0
  519. data/test/mocks/test/theme_mock.rb +5 -0
  520. data/test/mocks/test/xmlrpc_mock.rb +27 -0
  521. data/test/mocks/themes/123-numbers-in-path/about.markdown +0 -0
  522. data/test/mocks/themes/CamelCaseDirectory/about.markdown +0 -0
  523. data/test/mocks/themes/azure/about.markdown +5 -0
  524. data/test/mocks/themes/azure/layouts/default.rhtml +50 -0
  525. data/test/mocks/themes/azure/preview.png +0 -0
  526. data/test/mocks/themes/azure/views/theme/static_view_test.rhtml +1 -0
  527. data/test/mocks/themes/i-have-special-chars/about.markdown +0 -0
  528. data/test/test_helper.rb +95 -0
  529. data/test/unit/article_test.rb +245 -0
  530. data/test/unit/assumptions_tests.rb +54 -0
  531. data/test/unit/audioscrobbler_test.rb +132 -0
  532. data/test/unit/blacklist_pattern_test.rb +14 -0
  533. data/test/unit/blog_test.rb +83 -0
  534. data/test/unit/category_test.rb +37 -0
  535. data/test/unit/comment_test.rb +117 -0
  536. data/test/unit/configuration_test.rb +21 -0
  537. data/test/unit/content_state/factory_test.rb +84 -0
  538. data/test/unit/delicious_test.rb +96 -0
  539. data/test/unit/flickr_test.rb +134 -0
  540. data/test/unit/fortythree_test.rb +66 -0
  541. data/test/unit/magnolia_test.rb +87 -0
  542. data/test/unit/metafragment_test.rb +63 -0
  543. data/test/unit/notification_mailer_test.rb +55 -0
  544. data/test/unit/observer_test.rb +40 -0
  545. data/test/unit/page_cache_test.rb +34 -0
  546. data/test/unit/page_test.rb +25 -0
  547. data/test/unit/ping_test.rb +111 -0
  548. data/test/unit/redirect_test.rb +19 -0
  549. data/test/unit/resource_test.rb +71 -0
  550. data/test/unit/sidebar_test.rb +14 -0
  551. data/test/unit/tag_test.rb +66 -0
  552. data/test/unit/text_filter_test.rb +126 -0
  553. data/test/unit/theme_test.rb +44 -0
  554. data/test/unit/trackback_test.rb +45 -0
  555. data/test/unit/trigger_test.rb +40 -0
  556. data/test/unit/user_test.rb +111 -0
  557. data/themes/azure/about.markdown +5 -0
  558. data/themes/azure/images/bg-tile.gif +0 -0
  559. data/themes/azure/images/bracket.gif +0 -0
  560. data/themes/azure/images/bullet.gif +0 -0
  561. data/themes/azure/images/hdr.gif +0 -0
  562. data/themes/azure/images/q-close.gif +0 -0
  563. data/themes/azure/images/q-open.gif +0 -0
  564. data/themes/azure/images/sbar-tile.gif +0 -0
  565. data/themes/azure/images/spinner.gif +0 -0
  566. data/themes/azure/images/xlink.gif +0 -0
  567. data/themes/azure/layouts/default.rhtml +50 -0
  568. data/themes/azure/preview.png +0 -0
  569. data/themes/azure/stylesheets/azure.css +436 -0
  570. data/themes/azure/stylesheets/print.css +30 -0
  571. data/themes/azure/views/theme/static_view_test.rhtml +1 -0
  572. data/vendor/akismet/Akismet.rb +140 -0
  573. data/vendor/bluecloth/CHANGES +366 -0
  574. data/vendor/bluecloth/LICENSE +340 -0
  575. data/vendor/bluecloth/README +99 -0
  576. data/vendor/bluecloth/bin/bluecloth +83 -0
  577. data/vendor/bluecloth/install.rb +150 -0
  578. data/vendor/bluecloth/lib/bluecloth.rb +1144 -0
  579. data/vendor/bluecloth/test.rb +117 -0
  580. data/vendor/bluecloth/tests/00_Class.tests.rb +71 -0
  581. data/vendor/bluecloth/tests/05_Markdown.tests.rb +1527 -0
  582. data/vendor/bluecloth/tests/10_Bug.tests.rb +57 -0
  583. data/vendor/bluecloth/tests/15_Contrib.tests.rb +132 -0
  584. data/vendor/bluecloth/tests/bctestcase.rb +274 -0
  585. data/vendor/bluecloth/tests/data/antsugar.txt +34 -0
  586. data/vendor/bluecloth/tests/data/ml-announce.txt +17 -0
  587. data/vendor/bluecloth/tests/data/re-overflow.txt +67 -0
  588. data/vendor/bluecloth/tests/data/re-overflow2.txt +281 -0
  589. data/vendor/bluecloth/utils.rb +553 -0
  590. data/vendor/flickr/Rakefile +36 -0
  591. data/vendor/flickr/flickr.rb +490 -0
  592. data/vendor/flickr/index.html +129 -0
  593. data/vendor/flickr/test_flickr.rb +173 -0
  594. data/vendor/jabber4r/CHANGES +8 -0
  595. data/vendor/jabber4r/LICENSE.txt +12 -0
  596. data/vendor/jabber4r/README +180 -0
  597. data/vendor/jabber4r/Rakefile.rb +143 -0
  598. data/vendor/jabber4r/lib/jabber4r/jabber4r.rb +22 -0
  599. data/vendor/jabber4r/lib/jabber4r/jid.rb +93 -0
  600. data/vendor/jabber4r/lib/jabber4r/protocol.rb +1384 -0
  601. data/vendor/jabber4r/lib/jabber4r/rexml_1.8_patch.rb +16 -0
  602. data/vendor/jabber4r/lib/jabber4r/roster.rb +322 -0
  603. data/vendor/jabber4r/lib/jabber4r/session.rb +615 -0
  604. data/vendor/jabber4r/lib/jabber4r/vcard.rb +42 -0
  605. data/vendor/plugins/expiring_action_cache/init.rb +2 -0
  606. data/vendor/plugins/expiring_action_cache/lib/actionparamcache.rb +113 -0
  607. data/vendor/plugins/expiring_action_cache/lib/metafragment.rb +46 -0
  608. data/vendor/plugins/upload_progress/CHANGELOG +3 -0
  609. data/vendor/plugins/upload_progress/MIT-LICENSE +20 -0
  610. data/vendor/plugins/upload_progress/README +45 -0
  611. data/vendor/plugins/upload_progress/Rakefile +23 -0
  612. data/vendor/plugins/upload_progress/init.rb +7 -0
  613. data/vendor/plugins/upload_progress/lib/multipart_progress.rb +169 -0
  614. data/vendor/plugins/upload_progress/lib/progress.rb +145 -0
  615. data/vendor/plugins/upload_progress/lib/upload_progress.rb +303 -0
  616. data/vendor/plugins/upload_progress/lib/upload_progress_helper.rb +424 -0
  617. data/vendor/plugins/upload_progress/public/stylesheets/upload_progress.css +21 -0
  618. data/vendor/plugins/upload_progress/test/multipart_progress_testx.rb +364 -0
  619. data/vendor/plugins/upload_progress/test/upload_progress_helper_testx.rb +134 -0
  620. data/vendor/plugins/upload_progress/test/upload_progress_testx.rb +88 -0
  621. data/vendor/redcloth/RedCloth.gemspec +52 -0
  622. data/vendor/redcloth/bin/redcloth +3 -0
  623. data/vendor/redcloth/doc/CHANGELOG +160 -0
  624. data/vendor/redcloth/doc/COPYING +25 -0
  625. data/vendor/redcloth/doc/README +106 -0
  626. data/vendor/redcloth/doc/REFERENCE +216 -0
  627. data/vendor/redcloth/doc/make.rb +359 -0
  628. data/vendor/redcloth/install.rb +1032 -0
  629. data/vendor/redcloth/lib/redcloth.rb +1130 -0
  630. data/vendor/redcloth/run-tests.rb +28 -0
  631. data/vendor/redcloth/setup.rb +1376 -0
  632. data/vendor/redcloth/tests/code.yml +105 -0
  633. data/vendor/redcloth/tests/hard_breaks.yml +26 -0
  634. data/vendor/redcloth/tests/images.yml +171 -0
  635. data/vendor/redcloth/tests/instiki.yml +39 -0
  636. data/vendor/redcloth/tests/links.yml +155 -0
  637. data/vendor/redcloth/tests/lists.yml +77 -0
  638. data/vendor/redcloth/tests/markdown.yml +218 -0
  639. data/vendor/redcloth/tests/poignant.yml +64 -0
  640. data/vendor/redcloth/tests/table.yml +198 -0
  641. data/vendor/redcloth/tests/textism.yml +406 -0
  642. data/vendor/ruby-mp3info/lib/mp3info.rb +720 -0
  643. data/vendor/rubypants/README +114 -0
  644. data/vendor/rubypants/Rakefile +55 -0
  645. data/vendor/rubypants/html/classes/RubyPants.html +924 -0
  646. data/vendor/rubypants/html/created.rid +1 -0
  647. data/vendor/rubypants/html/files/README.html +248 -0
  648. data/vendor/rubypants/html/files/rubypants_rb.html +125 -0
  649. data/vendor/rubypants/html/fr_class_index.html +27 -0
  650. data/vendor/rubypants/html/fr_file_index.html +28 -0
  651. data/vendor/rubypants/html/fr_method_index.html +38 -0
  652. data/vendor/rubypants/html/index.html +24 -0
  653. data/vendor/rubypants/html/rdoc-style.css +172 -0
  654. data/vendor/rubypants/install.rb +9 -0
  655. data/vendor/rubypants/rubypants.rb +490 -0
  656. data/vendor/rubypants/test_rubypants.rb +162 -0
  657. data/vendor/sparklines/README.txt +47 -0
  658. data/vendor/sparklines/USAGE +14 -0
  659. data/vendor/sparklines/lib/sparklines.rb +435 -0
  660. data/vendor/sparklines/samples/sparklinestest.rb +26 -0
  661. data/vendor/sparklines/sparklines_generator.rb +9 -0
  662. data/vendor/sparklines/templates/sparklines_controller.rb +30 -0
  663. data/vendor/sparklines/templates/sparklines_helper.rb +30 -0
  664. data/vendor/syntax/LICENSE +27 -0
  665. data/vendor/syntax/NEWS +16 -0
  666. data/vendor/syntax/README +38 -0
  667. data/vendor/syntax/Rakefile +194 -0
  668. data/vendor/syntax/api/classes/Syntax.html +173 -0
  669. data/vendor/syntax/api/classes/Syntax/Convertors.html +91 -0
  670. data/vendor/syntax/api/classes/Syntax/Convertors/Abstract.html +159 -0
  671. data/vendor/syntax/api/classes/Syntax/Convertors/HTML.html +149 -0
  672. data/vendor/syntax/api/classes/Syntax/Default.html +123 -0
  673. data/vendor/syntax/api/classes/Syntax/Ruby.html +319 -0
  674. data/vendor/syntax/api/classes/Syntax/Token.html +151 -0
  675. data/vendor/syntax/api/classes/Syntax/Tokenizer.html +324 -0
  676. data/vendor/syntax/api/classes/Syntax/Version.html +109 -0
  677. data/vendor/syntax/api/classes/Syntax/XML.html +205 -0
  678. data/vendor/syntax/api/classes/Syntax/YAML.html +189 -0
  679. data/vendor/syntax/api/created.rid +1 -0
  680. data/vendor/syntax/api/files/README.html +155 -0
  681. data/vendor/syntax/api/files/lib/syntax/common_rb.html +96 -0
  682. data/vendor/syntax/api/files/lib/syntax/convertors/abstract_rb.html +96 -0
  683. data/vendor/syntax/api/files/lib/syntax/convertors/html_rb.html +96 -0
  684. data/vendor/syntax/api/files/lib/syntax/lang/ruby_rb.html +96 -0
  685. data/vendor/syntax/api/files/lib/syntax/lang/xml_rb.html +96 -0
  686. data/vendor/syntax/api/files/lib/syntax/lang/yaml_rb.html +96 -0
  687. data/vendor/syntax/api/files/lib/syntax/version_rb.html +92 -0
  688. data/vendor/syntax/api/files/lib/syntax_rb.html +96 -0
  689. data/vendor/syntax/api/fr_class_index.html +56 -0
  690. data/vendor/syntax/api/fr_file_index.html +54 -0
  691. data/vendor/syntax/api/fr_method_index.html +65 -0
  692. data/vendor/syntax/api/index.html +26 -0
  693. data/vendor/syntax/api/rdoc-style.css +175 -0
  694. data/vendor/syntax/doc/manual-html/chapter-1.html +198 -0
  695. data/vendor/syntax/doc/manual-html/chapter-2.html +262 -0
  696. data/vendor/syntax/doc/manual-html/chapter-3.html +266 -0
  697. data/vendor/syntax/doc/manual-html/chapter-4.html +267 -0
  698. data/vendor/syntax/doc/manual-html/index.html +152 -0
  699. data/vendor/syntax/doc/manual-html/stylesheets/manual.css +270 -0
  700. data/vendor/syntax/doc/manual-html/stylesheets/ruby.css +17 -0
  701. data/vendor/syntax/doc/manual/chapter.erb +38 -0
  702. data/vendor/syntax/doc/manual/example.erb +18 -0
  703. data/vendor/syntax/doc/manual/index.erb +29 -0
  704. data/vendor/syntax/doc/manual/manual.rb +311 -0
  705. data/vendor/syntax/doc/manual/manual.yml +43 -0
  706. data/vendor/syntax/doc/manual/page.erb +87 -0
  707. data/vendor/syntax/doc/manual/parts/0000.txt +5 -0
  708. data/vendor/syntax/doc/manual/parts/0001.txt +16 -0
  709. data/vendor/syntax/doc/manual/parts/0002.txt +24 -0
  710. data/vendor/syntax/doc/manual/parts/0003.txt +6 -0
  711. data/vendor/syntax/doc/manual/parts/0004.txt +32 -0
  712. data/vendor/syntax/doc/manual/parts/0005.txt +18 -0
  713. data/vendor/syntax/doc/manual/parts/0006.txt +62 -0
  714. data/vendor/syntax/doc/manual/parts/0007.txt +3 -0
  715. data/vendor/syntax/doc/manual/parts/0008.txt +5 -0
  716. data/vendor/syntax/doc/manual/parts/0009.txt +29 -0
  717. data/vendor/syntax/doc/manual/parts/0010.txt +21 -0
  718. data/vendor/syntax/doc/manual/stylesheets/manual.css +270 -0
  719. data/vendor/syntax/doc/manual/stylesheets/ruby.css +17 -0
  720. data/vendor/syntax/doc/manual/tutorial.erb +30 -0
  721. data/vendor/syntax/lib/syntax.rb +38 -0
  722. data/vendor/syntax/lib/syntax/common.rb +163 -0
  723. data/vendor/syntax/lib/syntax/convertors/abstract.rb +27 -0
  724. data/vendor/syntax/lib/syntax/convertors/html.rb +51 -0
  725. data/vendor/syntax/lib/syntax/lang/ruby.rb +317 -0
  726. data/vendor/syntax/lib/syntax/lang/xml.rb +108 -0
  727. data/vendor/syntax/lib/syntax/lang/yaml.rb +105 -0
  728. data/vendor/syntax/lib/syntax/version.rb +9 -0
  729. data/vendor/syntax/setup.rb +1331 -0
  730. data/vendor/syntax/syntax.gemspec +24 -0
  731. data/vendor/syntax/test/ALL-TESTS.rb +5 -0
  732. data/vendor/syntax/test/syntax/tc_ruby.rb +871 -0
  733. data/vendor/syntax/test/syntax/tc_xml.rb +202 -0
  734. data/vendor/syntax/test/syntax/tc_yaml.rb +228 -0
  735. data/vendor/syntax/test/syntax/tokenizer_testcase.rb +40 -0
  736. data/vendor/syntax/test/tc_syntax.rb +22 -0
  737. data/vendor/uuidtools/CHANGELOG +4 -0
  738. data/vendor/uuidtools/README +13 -0
  739. data/vendor/uuidtools/install.rb +30 -0
  740. data/vendor/uuidtools/lib/uuidtools.rb +555 -0
  741. data/vendor/uuidtools/rakefile +112 -0
  742. metadata +1022 -0
@@ -0,0 +1,232 @@
1
+ -- This file is autogenerated by the Rail schema generator, using
2
+ -- the schema defined in db/migration/*.rb
3
+ --
4
+ -- Do not edit this file. Instead, add a new migration using
5
+ -- ./script/generate migration <name>, and then run
6
+ -- ./script/generate schema
7
+
8
+ -- tables
9
+
10
+ CREATE TABLE articles_categories (
11
+ [article_id] int,
12
+ [category_id] int,
13
+ [is_primary] int
14
+ );
15
+
16
+ CREATE TABLE articles_tags (
17
+ [article_id] int,
18
+ [tag_id] int
19
+ );
20
+
21
+ CREATE TABLE blacklist_patterns (
22
+ [id] int NOT NULL IDENTITY(1,
23
+ 1) PRIMARY KEY,
24
+ [type] varchar(255),
25
+ [pattern] varchar(255)
26
+ );
27
+
28
+ CREATE TABLE blogs (
29
+ [id] int NOT NULL IDENTITY(1,
30
+ 1) PRIMARY KEY,
31
+ [settings] text
32
+ );
33
+
34
+ CREATE TABLE categories (
35
+ [id] int NOT NULL IDENTITY(1,
36
+ 1) PRIMARY KEY,
37
+ [name] varchar(255),
38
+ [position] int,
39
+ [permalink] varchar(255)
40
+ );
41
+
42
+ CREATE TABLE contents (
43
+ [id] int NOT NULL IDENTITY(1,
44
+ 1) PRIMARY KEY,
45
+ [type] varchar(255),
46
+ [title] varchar(255),
47
+ [author] varchar(255),
48
+ [body] text,
49
+ [body_html] text,
50
+ [extended] text,
51
+ [excerpt] text,
52
+ [keywords] varchar(255),
53
+ [created_at] datetime,
54
+ [updated_at] datetime,
55
+ [extended_html] text,
56
+ [user_id] int,
57
+ [permalink] varchar(255),
58
+ [guid] varchar(255),
59
+ [text_filter_id] int,
60
+ [whiteboard] text,
61
+ [article_id] int,
62
+ [email] varchar(255),
63
+ [url] varchar(255),
64
+ [ip] varchar(40),
65
+ [blog_name] varchar(255),
66
+ [name] varchar(255),
67
+ [comments_count] int,
68
+ [trackbacks_count] int,
69
+ [published] bit DEFAULT 0,
70
+ [allow_pings] bit,
71
+ [allow_comments] bit,
72
+ [blog_id] int NOT NULL,
73
+ [published_at] datetime
74
+ );
75
+
76
+ CREATE TABLE notifications (
77
+ [notify_user_id] int,
78
+ [notify_content_id] int,
79
+ [created_at] datetime,
80
+ [updated_at] datetime
81
+ );
82
+
83
+ CREATE TABLE page_caches (
84
+ [id] int NOT NULL IDENTITY(1,
85
+ 1) PRIMARY KEY,
86
+ [name] varchar(255)
87
+ );
88
+
89
+ CREATE TABLE pings (
90
+ [id] int NOT NULL IDENTITY(1,
91
+ 1) PRIMARY KEY,
92
+ [article_id] int,
93
+ [url] varchar(255),
94
+ [created_at] datetime
95
+ );
96
+
97
+ CREATE TABLE redirects (
98
+ [id] int NOT NULL IDENTITY(1,
99
+ 1) PRIMARY KEY,
100
+ [from_path] varchar(255),
101
+ [to_path] varchar(255)
102
+ );
103
+
104
+ CREATE TABLE resources (
105
+ [id] int NOT NULL IDENTITY(1,
106
+ 1) PRIMARY KEY,
107
+ [size] int,
108
+ [filename] varchar(255),
109
+ [mime] varchar(255),
110
+ [created_at] datetime,
111
+ [updated_at] datetime,
112
+ [article_id] int,
113
+ [itunes_metadata] bit,
114
+ [itunes_author] varchar(255),
115
+ [itunes_subtitle] varchar(255),
116
+ [itunes_duration] int,
117
+ [itunes_summary] text,
118
+ [itunes_keywords] varchar(255),
119
+ [itunes_category] varchar(255),
120
+ [itunes_explicit] bit
121
+ );
122
+
123
+ CREATE TABLE sessions (
124
+ [id] int NOT NULL IDENTITY(1,
125
+ 1) PRIMARY KEY,
126
+ [sessid] varchar(255),
127
+ [data] text,
128
+ [created_at] datetime,
129
+ [updated_at] datetime
130
+ );
131
+
132
+ CREATE TABLE sidebars (
133
+ [id] int NOT NULL IDENTITY(1,
134
+ 1) PRIMARY KEY,
135
+ [controller] varchar(255),
136
+ [active_position] int,
137
+ [config] text,
138
+ [staged_position] int
139
+ );
140
+
141
+ CREATE TABLE tags (
142
+ [id] int NOT NULL IDENTITY(1,
143
+ 1) PRIMARY KEY,
144
+ [name] varchar(255),
145
+ [created_at] datetime,
146
+ [updated_at] datetime,
147
+ [display_name] varchar(255)
148
+ );
149
+
150
+ CREATE TABLE text_filters (
151
+ [id] int NOT NULL IDENTITY(1,
152
+ 1) PRIMARY KEY,
153
+ [name] varchar(255),
154
+ [description] varchar(255),
155
+ [markup] varchar(255),
156
+ [filters] text,
157
+ [params] text
158
+ );
159
+
160
+ CREATE TABLE triggers (
161
+ [id] int NOT NULL IDENTITY(1,
162
+ 1) PRIMARY KEY,
163
+ [pending_item_id] int,
164
+ [pending_item_type] varchar(255),
165
+ [due_at] datetime,
166
+ [trigger_method] varchar(255)
167
+ );
168
+
169
+ CREATE TABLE users (
170
+ [id] int NOT NULL IDENTITY(1,
171
+ 1) PRIMARY KEY,
172
+ [login] varchar(255),
173
+ [password] varchar(255),
174
+ [email] text,
175
+ [name] text,
176
+ [notify_via_email] bit,
177
+ [notify_on_new_articles] bit,
178
+ [notify_on_comments] bit,
179
+ [notify_watch_my_articles] bit,
180
+ [notify_via_jabber] bit,
181
+ [jabber] varchar(255)
182
+ );
183
+
184
+
185
+ -- indexes
186
+
187
+ CREATE INDEX [blacklist_patterns_pattern_index] ON blacklist_patterns ([pattern]);
188
+ CREATE INDEX [categories_permalink_index] ON categories ([permalink]);
189
+ CREATE INDEX [contents_blog_id_index] ON contents ([blog_id]);
190
+ CREATE INDEX [contents_article_id_index] ON contents ([article_id]);
191
+ CREATE INDEX [page_caches_name_index] ON page_caches ([name]);
192
+ CREATE INDEX [pings_article_id_index] ON pings ([article_id]);
193
+ CREATE INDEX [sessions_sessid_index] ON sessions ([sessid]);
194
+
195
+ -- data
196
+
197
+ INSERT INTO sidebars ([config], [staged_position], [active_position], [controller]) VALUES(NULL, NULL, 0, 'category');
198
+ INSERT INTO sidebars ([config], [staged_position], [active_position], [controller]) VALUES(NULL, NULL, 1, 'static');
199
+ INSERT INTO sidebars ([config], [staged_position], [active_position], [controller]) VALUES(NULL, NULL, 2, 'xml');
200
+ INSERT INTO text_filters ([name], [filters], [description], [params], [markup]) VALUES('none', '--- []
201
+
202
+ ', 'None', '--- {}
203
+
204
+ ', 'none');
205
+ INSERT INTO text_filters ([name], [filters], [description], [params], [markup]) VALUES('markdown', '--- []
206
+
207
+ ', 'Markdown', '--- {}
208
+
209
+ ', 'markdown');
210
+ INSERT INTO text_filters ([name], [filters], [description], [params], [markup]) VALUES('smartypants', '---
211
+ - :smartypants
212
+ ', 'SmartyPants', '--- {}
213
+
214
+ ', 'none');
215
+ INSERT INTO text_filters ([name], [filters], [description], [params], [markup]) VALUES('markdown smartypants', '---
216
+ - :smartypants
217
+ ', 'Markdown with SmartyPants', '--- {}
218
+
219
+ ', 'markdown');
220
+ INSERT INTO text_filters ([name], [filters], [description], [params], [markup]) VALUES('textile', '--- []
221
+
222
+ ', 'Textile', '--- {}
223
+
224
+ ', 'textile');
225
+
226
+ -- schema version meta-info
227
+
228
+ CREATE TABLE schema_info (
229
+ [version] int
230
+ );
231
+
232
+ insert into schema_info (version) values (46);
data/db/schema_version ADDED
@@ -0,0 +1 @@
1
+ 46
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ require File.dirname(__FILE__) + '/../../config/environment'
3
+ Article.find(:all).each do |a|
4
+ (puts "Processing #{a.title} (#{a.stripped_title})" ; a.save) if a.permalink.blank?
5
+ end
@@ -0,0 +1,33 @@
1
+ CREATE TABLE IF NOT EXISTS `blacklist_patterns` (
2
+ `id` int(11) NOT NULL auto_increment,
3
+ `type` varchar(15) default NULL,
4
+ `pattern` varchar(255) default NULL,
5
+ PRIMARY KEY (`id`)
6
+ );
7
+
8
+ CREATE TABLE IF NOT EXISTS `settings` (
9
+ `id` int(11) NOT NULL auto_increment,
10
+ `name` varchar(40) default NULL,
11
+ `value` varchar(40) default NULL,
12
+ PRIMARY KEY (`id`)
13
+ );
14
+
15
+ CREATE TABLE IF NOT EXISTS `sessions` (
16
+ `id` int(11) unsigned NOT NULL auto_increment,
17
+ `sessid` varchar(32) default NULL,
18
+ `data` text,
19
+ `updated_at` datetime default NULL,
20
+ PRIMARY KEY (`id`),
21
+ UNIQUE KEY `sessid` (`sessid`)
22
+ );
23
+
24
+ CREATE TABLE IF NOT EXISTS `users` (
25
+ `id` int(11) NOT NULL auto_increment,
26
+ `login` varchar(80) default NULL,
27
+ `password` varchar(40) default NULL,
28
+ PRIMARY KEY (`id`),
29
+ UNIQUE KEY `login` (`login`)
30
+ );
31
+
32
+ ALTER TABLE `comments` ADD `ip` varchar(15) DEFAULT NULL;
33
+ ALTER TABLE `articles` ADD `text_filter` varchar(20) DEFAULT NULL;
@@ -0,0 +1,30 @@
1
+ CREATE TABLE blacklist_patterns (
2
+ id SERIAL PRIMARY KEY NOT NULL,
3
+ type varchar(15) default NULL,
4
+ pattern varchar(255) default NULL
5
+ );
6
+
7
+ CREATE TABLE sessions (
8
+ id SERIAL PRIMARY KEY NOT NULL,
9
+ sessid varchar(255) default NULL,
10
+ data text,
11
+ created_at TIMESTAMP DEFAULT now(),
12
+ updated_at TIMESTAMP DEFAULT now()
13
+ );
14
+
15
+ CREATE TABLE settings (
16
+ id SERIAL PRIMARY KEY NOT NULL,
17
+ name varchar(255) default NULL,
18
+ value varchar(255) default NULL,
19
+ position int default NULL
20
+ );
21
+
22
+ CREATE TABLE users (
23
+ id SERIAL PRIMARY KEY NOT NULL,
24
+ login varchar(40) default NULL,
25
+ password varchar(40) default NULL,
26
+ UNIQUE (login)
27
+ );
28
+
29
+ ALTER TABLE comments ADD ip varchar(15) DEFAULT NULL;
30
+ ALTER TABLE articles ADD text_filter varchar(20) DEFAULT NULL;
data/doc/Installer.txt ADDED
@@ -0,0 +1,55 @@
1
+ How to use the Typo Rails installer
2
+ ===================================
3
+
4
+ Typo 4.0 includes an installer that makes it easy to install Typo.
5
+
6
+ Quick Start
7
+ -----------
8
+
9
+ Here's the short version:
10
+
11
+ $ gem install typo
12
+ $ typo install /var/www/my_typo_site
13
+
14
+
15
+ Prerequisites
16
+ -------------
17
+
18
+ You'll need the following software installed on your system:
19
+
20
+ 1. Ruby 1.8.4
21
+ 2. RubyGems (http://www.rubygems.org)
22
+ 3. SWIG (http://www.swig.org)
23
+ 4. SQLite 3
24
+
25
+ Most modern Unix systems should have all four of these easily available in pre-built form.
26
+
27
+ Installing Typo
28
+ ---------------
29
+
30
+ 1. Install the Typo GEM.
31
+
32
+ Run 'gem install typo'. This will install the current version of Typo
33
+ along with all dependencies.
34
+
35
+ 2. Create a working Typo installation in a directory somewhere.
36
+
37
+ Run 'typo install DIRECTORY'. Replace DIRECTORY with the name of the
38
+ directory that you want Typo to live in. This will copy all of Typo's
39
+ files into DIRECTORY, create a new database for Typo to use, and start
40
+ Typo running on a random port number.
41
+
42
+ 3. Verify that Typo works for you. The installer will print a URL at the end
43
+ of the installation process; load it in a browser to test out Typo.
44
+
45
+ 4. Once you're happy with Typo's configuration, follow the directions in
46
+ installer/apache.conf.example to run your Typo installation under Apache.
47
+
48
+
49
+ TODO
50
+ ----
51
+
52
+ 1. Actually write the Apache HTTP proxy instructions (for 1.3 and 2.x)
53
+ 2. Add lighttpd proxy directions.
54
+ 3. Figure out how to best have Typo restart on reboot.
55
+ 4. Handle the "missing swig" problem better.
@@ -0,0 +1,2 @@
1
+ Use this README file to introduce your application and point to useful places in the API for learning more.
2
+ Run "rake appdoc" to generate API documentation for your models and controllers.
@@ -0,0 +1,488 @@
1
+ require 'fileutils'
2
+ require 'readline'
3
+ require 'rubygems'
4
+ require 'yaml'
5
+ require 'digest/sha1'
6
+
7
+ class RailsInstaller
8
+ include FileUtils
9
+ attr_accessor :install_directory, :source_directory, :config
10
+ attr_accessor :message_proc
11
+
12
+ class InstallFailed < StandardError; end
13
+
14
+ @@rails_version = nil
15
+
16
+ def self.application_name(name)
17
+ @@app_name = name
18
+ end
19
+
20
+ def self.support_location(location)
21
+ @@support_location = location
22
+ end
23
+
24
+ def self.rails_version(svn_tag)
25
+ @@rails_version = svn_tag
26
+ end
27
+
28
+ def initialize(install_directory)
29
+ @install_directory = install_directory
30
+
31
+ @config = read_yml(config_file) rescue nil
32
+ @config ||= Hash.new
33
+ end
34
+
35
+ # Display a status message
36
+ def message(string)
37
+ if message_proc
38
+ message_proc.call(string)
39
+ else
40
+ STDERR.puts string
41
+ end
42
+ end
43
+
44
+ # Install Application
45
+ def install(version=nil)
46
+ @source_directory = find_source_directory(@@app_name,version)
47
+
48
+ if config.size == 0
49
+ @config = read_yml(backup_config_file)
50
+ end
51
+
52
+ install_sequence
53
+
54
+ message ''
55
+ message "#{@@app_name.capitalize} is now running on http://#{`hostname`.chomp}:#{config['port-number']}"
56
+ message "Use '#{@@app_name} start #{install_directory}' to restart after boot."
57
+ message "Look in installer/apache.conf.example to see how to integrate with Apache."
58
+ end
59
+
60
+ # The default install sequence. Override this if you need to add extra
61
+ # steps to the installer.
62
+ def install_sequence
63
+ stop
64
+
65
+ backup_database
66
+ pre_migrate_database
67
+ copy_files
68
+ freeze_rails
69
+ create_default_config_files
70
+ create_directories
71
+ create_initial_database
72
+ set_initial_port_number
73
+
74
+ migrate
75
+ save
76
+
77
+ run_rails_tests
78
+
79
+ start
80
+ end
81
+
82
+
83
+ # Start application in the background
84
+ def start(foreground = false)
85
+ return unless config['web-server'] == 'mongrel'
86
+
87
+ args = {}
88
+ args['-p'] = config['port-number']
89
+ args['-a'] = config['bind-address']
90
+ args['-e'] = config['rails-environment']
91
+ args['-d'] = foreground
92
+ args['-P'] = pid_file
93
+
94
+ # Remove keys with nil values
95
+ args.delete_if {|k,v| v==nil}
96
+
97
+ args_array = args.to_a.flatten.map {|e| e.to_s}
98
+ args_array = ['mongrel_rails', 'start', install_directory] + args_array
99
+ message "Starting #{@@app_name.capitalize} on port #{config['port-number']}"
100
+ system(args_array.join(' '))
101
+ end
102
+
103
+ # Stop application
104
+ def stop
105
+ return unless File.exists? pid_file
106
+ return unless config['web-server'] == 'mongrel'
107
+
108
+ args = {}
109
+ args['-P'] = pid_file
110
+
111
+ args_array = args.to_a.flatten.map {|e| e.to_s}
112
+ args_array = ['mongrel_rails', 'stop', install_directory] + args_array
113
+ message "Stopping #{@@app_name.capitalize}"
114
+ system(args_array.join(' '))
115
+ end
116
+
117
+ # private
118
+
119
+ # The name of the sqlite database file
120
+ def db_file
121
+ File.join(install_directory,'db','database.sqlite')
122
+ end
123
+
124
+ # Backup the database
125
+ def backup_database
126
+ return unless File.exists? db_file
127
+ return unless config['database'] == 'sqlite'
128
+ new_db_file = db_file+"-#{Time.now.strftime('%Y%m%d-%H%M')}.sql"
129
+
130
+ message "Backing up existing SQLite database into #{new_db_file}"
131
+ system("sqlite3 #{db_file} .dump > #{new_db_file}")
132
+ end
133
+
134
+ # Copy files from the source directory to the target directory.
135
+ def copy_files
136
+ message "Checking for existing #{@@app_name.capitalize} install in #{install_directory}"
137
+ files_yml = File.join(install_directory,'installer','files.yml')
138
+ old_files = read_yml(files_yml) rescue Hash.new
139
+
140
+ message "Reading files from #{source_directory}"
141
+ new_files = sha1_hash_directory_tree(source_directory)
142
+
143
+ # Next, we compare the original install hash to the current hash. For each
144
+ # entry:
145
+ #
146
+ # - in new_file but not in old_files: copy
147
+ # - in old files but not in new_files: delete
148
+ # - in both, but hash different: copy
149
+ # - in both, hash same: don't copy
150
+ #
151
+ # We really should add a third hash (existing_files) and compare against that
152
+ # so we don't overwrite changed files.
153
+
154
+ added, changed, deleted, same = hash_diff(old_files, new_files)
155
+
156
+ if added.size > 0
157
+ message "Copying #{added.size} new files into #{install_directory}"
158
+ added.keys.sort.each do |file|
159
+ message " copying #{file}"
160
+ copy_one_file(file)
161
+ end
162
+ end
163
+
164
+ if changed.size > 0
165
+ message "Updating #{changed.size} files in #{install_directory}"
166
+ changed.keys.sort.each do |file|
167
+ message " updating #{file}"
168
+ copy_one_file(file)
169
+ end
170
+ end
171
+
172
+ if deleted.size > 0
173
+ message "Deleting #{deleted.size} files from #{install_directory}"
174
+
175
+ deleted.keys.sort.each do |file|
176
+ message " deleting #{file}"
177
+ rm(File.join(install_directory,file))
178
+ end
179
+ end
180
+
181
+ write_yml(files_yml,new_files)
182
+ end
183
+
184
+ # Copy one file from source_directory to install_directory, creating directories as needed.
185
+ def copy_one_file(filename)
186
+ source_name = File.join(source_directory,filename)
187
+ install_name = File.join(install_directory,filename)
188
+ dir_name = File.dirname(install_name)
189
+
190
+ mkdir_p(dir_name)
191
+ cp(source_name,install_name,:preserve => true)
192
+ end
193
+
194
+ # Compute the different between two hashes. Returns four hashes,
195
+ # one contains the keys that are in 'b' but not in 'a' (added entries),
196
+ # the next contains keys that are in 'a' and 'b', but have different values
197
+ # (changed). The third contains keys that are in 'b' but not 'a' (added).
198
+ # The final hash contains items that are the same in each.
199
+ def hash_diff(a, b)
200
+ added = {}
201
+ changed = {}
202
+ deleted = {}
203
+ same = {}
204
+
205
+ seen = {}
206
+
207
+ a.each_key do |k|
208
+ seen[k] = true
209
+
210
+ if b.has_key? k
211
+ if b[k] == a[k]
212
+ same[k] = true
213
+ else
214
+ changed[k] = true
215
+ end
216
+ else
217
+ deleted[k] = true
218
+ end
219
+ end
220
+
221
+ b.each_key do |k|
222
+ unless seen[k]
223
+ added[k] = true
224
+ end
225
+ end
226
+
227
+ [added, changed, deleted, same]
228
+ end
229
+
230
+ # Freeze to a specific version of Rails
231
+ def freeze_rails
232
+ return unless @@rails_version
233
+ version_file = File.join(install_directory,'vendor','rails-version')
234
+ vendor_rails = File.join(install_directory,'vendor','rails')
235
+
236
+ old_version = File.read(version_file).chomp rescue nil
237
+
238
+ if @@rails_version == old_version
239
+ return
240
+ elsif old_version != nil
241
+ rm_rf(vendor_rails)
242
+ mkdir_p(vendor_rails)
243
+ end
244
+
245
+ package_map = {
246
+ 'rails' => File.join(vendor_rails,'railties'),
247
+ 'actionmailer' => File.join(vendor_rails,'actionmailer'),
248
+ 'actionpack' => File.join(vendor_rails,'actionpack'),
249
+ 'actionwebservice' => File.join(vendor_rails,'actionwebservice'),
250
+ 'activerecord' => File.join(vendor_rails,'activerecord'),
251
+ 'activesupport' => File.join(vendor_rails,'activesupport'),
252
+ }
253
+
254
+ specs = Gem.source_index.find_name('rails',["= #{@@rails_version}"])
255
+
256
+ unless specs.to_a.size > 0
257
+ raise InstallFailed, "Can't locate Rails #{@@rails_version}!"
258
+ end
259
+
260
+ copy_gem(specs.first, package_map[specs.first.name])
261
+
262
+ specs.first.dependencies.each do |dep|
263
+ next unless package_map[dep.name]
264
+
265
+ dep_spec = Gem.source_index.find_name(dep.name,[dep.version_requirements.to_s])
266
+ if dep_spec.size == 0
267
+ raise InstallFailed, "Can't locate dependency #{dep.name} #{dep.version_requirements.to_s}"
268
+ end
269
+
270
+ copy_gem(dep_spec.first, package_map[dep.name])
271
+ end
272
+
273
+ File.open(version_file,'w') do |f|
274
+ f.puts @@rails_version
275
+ end
276
+ end
277
+
278
+ def copy_gem(spec, destination)
279
+ message("copying #{spec.name} #{spec.version} to #{destination}")
280
+ cp_r("#{spec.full_gem_path}/.",destination)
281
+ end
282
+
283
+ # Create all default config files
284
+ def create_default_config_files
285
+ create_default_database_yml
286
+ end
287
+
288
+ # Create the default database.yml
289
+ def create_default_database_yml
290
+ database_yml = File.join(install_directory,'config','database.yml')
291
+ return if File.exist?(database_yml)
292
+ return unless config['database'] == 'sqlite'
293
+
294
+ message "Creating default database configuration file"
295
+ cp("#{database_yml}.sqlite",database_yml)
296
+ end
297
+
298
+ # Create required directories, like tmp
299
+ def create_directories
300
+ mkdir_p(File.join(install_directory,'tmp','cache'))
301
+ mkdir_p(File.join(install_directory,'tmp','session'))
302
+ mkdir_p(File.join(install_directory,'tmp','sockets'))
303
+ mkdir_p(File.join(install_directory,'log'))
304
+ File.open(File.join(install_directory,'log','development.log'),'w')
305
+ File.open(File.join(install_directory,'log','production.log'),'w')
306
+ File.open(File.join(install_directory,'log','testing.log'),'w')
307
+ end
308
+
309
+ # Create the initial SQLite database
310
+ def create_initial_database
311
+ return if File.exists? db_file
312
+ return unless config['database'] == 'sqlite'
313
+
314
+ message "Creating initial #{@@app_name.capitalize} SQLite database"
315
+ schema_file = File.join(install_directory,'db','schema.sqlite.sql')
316
+ system("sqlite3 #{db_file} < #{schema_file}")
317
+ end
318
+
319
+ # Get the current schema version
320
+ def get_schema_version
321
+ File.read(File.join(install_directory,'db','schema_version')).to_i rescue 0
322
+ end
323
+
324
+ # The path to the installed config file
325
+ def config_file
326
+ File.join(install_directory,'installer','rails_installer.yml')
327
+ end
328
+
329
+ # The path to the config file that comes with the GEM
330
+ def backup_config_file
331
+ File.join(source_directory,'installer','rails_installer_defaults.yml')
332
+ end
333
+
334
+ # Pick a default port number
335
+ def set_initial_port_number
336
+ config['port-number'] ||= (rand(1000)+4000)
337
+ end
338
+
339
+ def pre_migrate_database
340
+ old_schema_version = get_schema_version
341
+ new_schema_version = File.read(File.join(source_directory,'db','schema_version')).to_i
342
+
343
+ return unless old_schema_version > 0
344
+
345
+ Dir.chdir(install_directory)
346
+
347
+ # Are we downgrading?
348
+ if old_schema_version > new_schema_version
349
+ message "Downgrading schema from #{old_schema_version} to #{new_schema_version}"
350
+ status = system("rake -s migrate VERSION=#{new_schema_version}")
351
+
352
+ unless status
353
+ raise InstallFailed, "Downgrade migrating from #{old_schema_version} to #{new_schema_version} failed."
354
+ end
355
+ end
356
+ end
357
+
358
+ # Migrate the database
359
+ def migrate
360
+ Dir.chdir(install_directory)
361
+ message "Migrating #{@@app_name.capitalize}'s database to newest release"
362
+ status = system("rake -s migrate")
363
+
364
+ unless status
365
+ raise InstallFailed, "Migration failed"
366
+ end
367
+ end
368
+
369
+ # Sweep the cache
370
+ def run_rails_tests
371
+ Dir.chdir(install_directory)
372
+ message "Running tests. This may take a minute or two"
373
+ status = system("rake -s test > /dev/null 2> /dev/null")
374
+
375
+ if status
376
+ message "All tests pass. Congratulations."
377
+ else
378
+ message "***** Tests failed *****"
379
+ message "** Please run 'rake test' by hand in your install directory."
380
+ message "** Report problems to #{@@support_location}."
381
+ message "***** Tests failed *****"
382
+ end
383
+ end
384
+
385
+ def sha1_hash_directory_tree(directory, prefix='', hash={})
386
+ Dir.entries(directory).each do |file|
387
+ next if file =~ /^\./
388
+ pathname = File.join(directory,file)
389
+ if File.directory?(pathname)
390
+ sha1_hash_directory_tree(pathname, File.join(prefix,file), hash)
391
+ else
392
+ hash[File.join(prefix,file)] = Digest::SHA1.hexdigest(File.read(pathname))
393
+ end
394
+ end
395
+
396
+ hash
397
+ end
398
+
399
+ def save
400
+ write_yml(config_file,@config)
401
+ end
402
+
403
+ def read_yml(filename)
404
+ YAML.load(File.read(filename))
405
+ end
406
+
407
+ def write_yml(filename,object)
408
+ File.open(filename,'w') do |f|
409
+ f.write(YAML.dump(object))
410
+ end
411
+ end
412
+
413
+ def pid_file
414
+ File.join(install_directory,'tmp','pid.txt')
415
+ end
416
+
417
+ # Locate the source directory for a specific Version
418
+ def find_source_directory(gem_name, version)
419
+ if version == 'cwd'
420
+ return Dir.pwd
421
+ elsif version
422
+ version_array = ["= #{version}"]
423
+ else
424
+ version_array = ["> 0.0.0"]
425
+ end
426
+
427
+ specs = Gem.source_index.find_name(gem_name,version_array)
428
+ unless specs.to_a.size > 0
429
+ raise InstallFailed, "Can't locate version #{version}!"
430
+ end
431
+
432
+ specs.last.full_gem_path
433
+ end
434
+
435
+ # Execute a command-line command
436
+ def execute_command(*args)
437
+ if args.size < 2
438
+ display_help
439
+ exit(1)
440
+ end
441
+
442
+ case args[0]
443
+ when 'install'
444
+ install(args[2])
445
+ when 'upgrade'
446
+ install(args[2])
447
+ when 'start'
448
+ start
449
+ when 'stop'
450
+ stop
451
+ when 'run'
452
+ start(true)
453
+ when 'config'
454
+ if args.size < 3
455
+ config.keys.sort.each do |k|
456
+ puts "#{k}=#{config[k]}"
457
+ end
458
+ else
459
+ args[2..-1].each do |arg|
460
+ if(arg=~/^([^=]+)=(.*)$/)
461
+ config[$1.to_s]=$2.to_s
462
+ else
463
+ STDERR.puts "Unknown config command: #{arg}"
464
+ end
465
+ end
466
+ save
467
+ end
468
+ else
469
+ display_help('Unknown command')
470
+ end
471
+ end
472
+
473
+ def display_help(error=nil)
474
+ STDERR.puts error if error
475
+ STDERR.puts "Commands:"
476
+ STDERR.puts " typo install DIRECTORY [VERSION]"
477
+ STDERR.puts " Installs Typo into DIRECTORY. If there's an existing Typo install in"
478
+ STDERR.puts " DIRECTORY, then the installer will upgrade the installation instead."
479
+ STDERR.puts " typo start DIRECTORY"
480
+ STDERR.puts " Starts a Typo server in DIRECTORY."
481
+ STDERR.puts " typo stop DIRECTORY"
482
+ STDERR.puts " Shuts down a Typo server in DIRECTORY."
483
+ STDERR.puts " typo config DIRECTORY"
484
+ STDERR.puts " Shows configuration variables for Typo."
485
+ STDERR.puts " typo config DIRECTORY NAME=VALUE..."
486
+ STDERR.puts " Sets configuration variables for Typo."
487
+ end
488
+ end