typo 4.0.3 → 4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (652) hide show
  1. data/CHANGES-4.1 +83 -0
  2. data/MAINTAINERS +3 -7
  3. data/README +1 -1
  4. data/{components/sidebars/README → README.SIDEBARS} +3 -0
  5. data/Rakefile +1 -1
  6. data/TODO-4.1 +16 -0
  7. data/app/apis/blogger_service.rb +3 -3
  8. data/app/apis/meta_weblog_service.rb +4 -21
  9. data/app/apis/movable_type_service.rb +5 -5
  10. data/app/controllers/accounts_controller.rb +6 -3
  11. data/app/controllers/admin/blacklist_controller.rb +1 -1
  12. data/app/controllers/admin/cache_controller.rb +3 -7
  13. data/app/controllers/admin/content_controller.rb +46 -24
  14. data/app/controllers/admin/feedback_controller.rb +3 -3
  15. data/app/controllers/admin/general_controller.rb +3 -3
  16. data/app/controllers/admin/pages_controller.rb +7 -3
  17. data/app/controllers/admin/sidebar_controller.rb +19 -26
  18. data/app/controllers/admin/textfilters_controller.rb +3 -1
  19. data/app/controllers/admin/themes_controller.rb +1 -1
  20. data/app/controllers/admin/users_controller.rb +1 -1
  21. data/app/controllers/application.rb +25 -27
  22. data/app/controllers/articles_controller.rb +14 -18
  23. data/app/controllers/content_controller.rb +7 -7
  24. data/app/controllers/live_controller.rb +1 -1
  25. data/app/controllers/redirect_controller.rb +2 -0
  26. data/app/controllers/textfilter_controller.rb +0 -3
  27. data/app/controllers/theme_controller.rb +10 -5
  28. data/app/controllers/xml_controller.rb +7 -9
  29. data/app/helpers/admin/base_helper.rb +10 -5
  30. data/app/helpers/admin/content_helper.rb +6 -0
  31. data/app/helpers/admin/feedback_helper.rb +1 -1
  32. data/app/helpers/admin/pages_helper.rb +5 -0
  33. data/app/helpers/application_helper.rb +84 -51
  34. data/app/helpers/articles_helper.rb +29 -29
  35. data/app/helpers/mail_helper.rb +3 -2
  36. data/app/helpers/sidebar_helper.rb +25 -16
  37. data/app/helpers/xml_helper.rb +0 -16
  38. data/app/models/article.rb +90 -32
  39. data/app/models/blog.rb +82 -74
  40. data/app/models/blog_sweeper.rb +33 -8
  41. data/app/models/categorization.rb +4 -0
  42. data/app/models/category.rb +21 -4
  43. data/app/models/comment.rb +23 -21
  44. data/app/models/content.rb +106 -64
  45. data/app/models/content_state/base.rb +12 -3
  46. data/app/models/content_state/draft.rb +2 -3
  47. data/app/models/content_state/factory.rb +1 -1
  48. data/app/models/content_state/ham.rb +0 -1
  49. data/app/models/content_state/just_marked_as_ham.rb +8 -1
  50. data/app/models/content_state/just_marked_as_spam.rb +4 -1
  51. data/app/models/content_state/just_presumed_ham.rb +14 -14
  52. data/app/models/content_state/just_published.rb +11 -18
  53. data/app/models/content_state/just_withdrawn.rb +11 -0
  54. data/app/models/content_state/new.rb +0 -1
  55. data/app/models/content_state/presumed_ham.rb +9 -3
  56. data/app/models/content_state/presumed_spam.rb +4 -1
  57. data/app/models/content_state/publication_pending.rb +4 -4
  58. data/app/models/content_state/published.rb +7 -8
  59. data/app/models/content_state/spam.rb +0 -1
  60. data/app/models/content_state/unclassified.rb +12 -3
  61. data/app/models/content_state/withdrawn.rb +5 -6
  62. data/app/models/email_notifier.rb +1 -1
  63. data/app/models/feedback.rb +31 -11
  64. data/app/models/notification.rb +4 -0
  65. data/app/models/notification_mailer.rb +8 -8
  66. data/app/models/page.rb +19 -5
  67. data/app/models/ping.rb +27 -40
  68. data/app/models/sidebar.rb +241 -11
  69. data/app/models/tag.rb +12 -1
  70. data/app/models/text_filter.rb +33 -39
  71. data/app/models/theme.rb +9 -0
  72. data/app/models/trackback.rb +1 -5
  73. data/app/models/user.rb +7 -5
  74. data/app/views/accounts/login.rhtml +19 -15
  75. data/app/views/accounts/logout.rhtml +4 -4
  76. data/app/views/accounts/signup.rhtml +9 -9
  77. data/app/views/admin/base/_recent_comments.rhtml +2 -2
  78. data/app/views/admin/base/_recent_trackbacks.rhtml +2 -2
  79. data/app/views/admin/blacklist/_blacklist_patterns.rhtml +4 -4
  80. data/app/views/admin/blacklist/_form.rhtml +3 -3
  81. data/app/views/admin/blacklist/_quick_post.rhtml +7 -6
  82. data/app/views/admin/blacklist/destroy.rhtml +5 -5
  83. data/app/views/admin/blacklist/edit.rhtml +7 -7
  84. data/app/views/admin/blacklist/list.rhtml +2 -2
  85. data/app/views/admin/cache/list.rhtml +2 -2
  86. data/app/views/admin/categories/_categories.rhtml +3 -3
  87. data/app/views/admin/categories/_form.rhtml +1 -1
  88. data/app/views/admin/categories/_quick_post.rhtml +5 -5
  89. data/app/views/admin/categories/destroy.rhtml +7 -7
  90. data/app/views/admin/categories/edit.rhtml +6 -6
  91. data/app/views/admin/categories/list.rhtml +7 -4
  92. data/app/views/admin/categories/reorder.rhtml +1 -1
  93. data/app/views/admin/categories/show.rhtml +6 -6
  94. data/app/views/admin/comments/_form.rhtml +4 -4
  95. data/app/views/admin/comments/comments.rhtml +1 -1
  96. data/app/views/admin/comments/destroy.rhtml +6 -6
  97. data/app/views/admin/comments/edit.rhtml +8 -8
  98. data/app/views/admin/comments/list.rhtml +11 -11
  99. data/app/views/admin/comments/new.rhtml +7 -7
  100. data/app/views/admin/comments/show.rhtml +7 -7
  101. data/app/views/admin/content/_articles.rhtml +12 -10
  102. data/app/views/admin/content/_attachment.rhtml +15 -17
  103. data/app/views/admin/content/_form.rhtml +68 -45
  104. data/app/views/admin/content/_pages.rhtml +2 -2
  105. data/app/views/admin/content/_quick_post.rhtml +6 -6
  106. data/app/views/admin/content/_show_categories.rhtml +2 -2
  107. data/app/views/admin/content/_show_resources.rhtml +2 -2
  108. data/app/views/admin/content/destroy.rhtml +8 -8
  109. data/app/views/admin/content/edit.rhtml +8 -26
  110. data/app/views/admin/content/list.rhtml +4 -4
  111. data/app/views/admin/content/new.rhtml +5 -25
  112. data/app/views/admin/content/preview.rhtml +9 -2
  113. data/app/views/admin/content/show.rhtml +10 -9
  114. data/app/views/admin/feedback/_item.rhtml +2 -2
  115. data/app/views/admin/feedback/list.rhtml +21 -20
  116. data/app/views/admin/general/index.rhtml +261 -239
  117. data/app/views/admin/general/update_database.rhtml +15 -15
  118. data/app/views/admin/pages/_form.rhtml +32 -15
  119. data/app/views/admin/pages/_pages.rhtml +9 -8
  120. data/app/views/admin/pages/_quick_post.rhtml +2 -2
  121. data/app/views/admin/pages/destroy.rhtml +7 -7
  122. data/app/views/admin/pages/edit.rhtml +7 -26
  123. data/app/views/admin/pages/list.rhtml +4 -3
  124. data/app/views/admin/pages/new.rhtml +5 -22
  125. data/app/views/admin/pages/preview.rhtml +1 -1
  126. data/app/views/admin/pages/show.rhtml +5 -5
  127. data/app/views/admin/resources/_itunes_category_edit.rhtml +2 -2
  128. data/app/views/admin/resources/_metadata_add.rhtml +13 -13
  129. data/app/views/admin/resources/_metadata_edit.rhtml +14 -14
  130. data/app/views/admin/resources/_mime_edit.rhtml +5 -5
  131. data/app/views/admin/resources/_pages.rhtml +2 -2
  132. data/app/views/admin/resources/_resources.rhtml +8 -8
  133. data/app/views/admin/resources/destroy.rhtml +7 -7
  134. data/app/views/admin/resources/list.rhtml +6 -3
  135. data/app/views/admin/resources/new.rhtml +7 -3
  136. data/app/views/admin/shared/_edit.rhtml +17 -0
  137. data/app/views/admin/sidebar/_active.rhtml +5 -5
  138. data/app/views/admin/sidebar/_availables.rhtml +1 -1
  139. data/app/views/admin/sidebar/_publish.rhtml +1 -1
  140. data/app/views/admin/sidebar/_target.rhtml +1 -1
  141. data/app/views/admin/sidebar/index.rhtml +9 -5
  142. data/app/views/admin/textfilters/_form.rhtml +13 -5
  143. data/app/views/admin/textfilters/_macros.rhtml +4 -4
  144. data/app/views/admin/textfilters/_textfilters.rhtml +6 -6
  145. data/app/views/admin/textfilters/destroy.rhtml +5 -8
  146. data/app/views/admin/textfilters/edit.rhtml +2 -5
  147. data/app/views/admin/textfilters/list.rhtml +4 -2
  148. data/app/views/admin/textfilters/macro_help.rhtml +1 -1
  149. data/app/views/admin/textfilters/new.rhtml +9 -7
  150. data/app/views/admin/textfilters/show.rhtml +5 -5
  151. data/app/views/admin/textfilters/show_help.rhtml +3 -3
  152. data/app/views/admin/themes/index.rhtml +8 -2
  153. data/app/views/admin/trackbacks/_form.rhtml +4 -4
  154. data/app/views/admin/trackbacks/destroy.rhtml +4 -4
  155. data/app/views/admin/trackbacks/edit.rhtml +6 -6
  156. data/app/views/admin/trackbacks/list.rhtml +10 -10
  157. data/app/views/admin/trackbacks/new.rhtml +6 -6
  158. data/app/views/admin/trackbacks/show.rhtml +8 -8
  159. data/app/views/admin/users/_form.rhtml +10 -10
  160. data/app/views/admin/users/_user.rhtml +6 -6
  161. data/app/views/admin/users/destroy.rhtml +7 -7
  162. data/app/views/admin/users/edit.rhtml +9 -5
  163. data/app/views/admin/users/list.rhtml +2 -2
  164. data/app/views/admin/users/new.rhtml +9 -7
  165. data/app/views/admin/users/show.rhtml +10 -10
  166. data/app/views/articles/_article.rhtml +3 -3
  167. data/app/views/articles/_comment.rhtml +3 -3
  168. data/app/views/articles/_comment_box.rhtml +6 -6
  169. data/app/views/articles/_trackback.rhtml +1 -1
  170. data/app/views/articles/archives.rhtml +3 -3
  171. data/app/views/articles/comment_preview.rhtml +2 -2
  172. data/app/views/articles/groupings.rhtml +1 -1
  173. data/app/views/articles/index.rhtml +2 -2
  174. data/app/views/articles/read.rhtml +15 -15
  175. data/app/views/articles/view_page.rhtml +1 -1
  176. data/app/views/layouts/administration.rhtml +11 -17
  177. data/app/views/layouts/minimal.rhtml +13 -0
  178. data/app/views/live/search.rhtml +1 -1
  179. data/app/views/notification_mailer/_mail_footer.rhtml +2 -2
  180. data/app/views/notification_mailer/article.rhtml +1 -1
  181. data/app/views/notification_mailer/comment.rhtml +4 -4
  182. data/app/views/settings/done.rhtml +1 -1
  183. data/app/views/settings/install.rhtml +3 -3
  184. data/app/views/shared/_search.rhtml +4 -4
  185. data/app/views/xml/_atom10_item_article.rxml +9 -7
  186. data/app/views/xml/_atom10_item_comment.rxml +2 -3
  187. data/app/views/xml/_atom10_item_trackback.rxml +1 -1
  188. data/app/views/xml/_googlesitemap_item_article.rxml +2 -2
  189. data/app/views/xml/_googlesitemap_item_category.rxml +1 -1
  190. data/app/views/xml/_googlesitemap_item_page.rxml +2 -2
  191. data/app/views/xml/_googlesitemap_item_tag.rxml +2 -2
  192. data/app/views/xml/_itunes_item_resource.rxml +2 -4
  193. data/app/views/xml/_rss20_item_article.rxml +4 -10
  194. data/app/views/xml/_rss20_item_comment.rxml +2 -2
  195. data/app/views/xml/rsd.rxml +4 -4
  196. data/bin/typo +0 -1
  197. data/config/boot.rb +4 -3
  198. data/config/environment.rb +37 -28
  199. data/config/environments/test.rb +1 -1
  200. data/config/routes.rb +6 -5
  201. data/db/migrate/051_fix_canonical_server_url.rb +17 -0
  202. data/db/migrate/052_remove_cached_html.rb +11 -0
  203. data/db/migrate/053_promote_canonical_server_url.rb +22 -0
  204. data/db/migrate/054_upgrade_sidebar_objects.rb +26 -0
  205. data/db/migrate/055_link_sidebars_to_blog.rb +17 -0
  206. data/db/migrate/056_create_notifications.rb +32 -0
  207. data/db/migrate/057_add_categorization_model.rb +45 -0
  208. data/db/migrate/058_separate_entries_and_feedback.rb +68 -0
  209. data/db/migrate/059_cleanup_feedback_table.rb +25 -0
  210. data/db/migrate/060_cleanup_contents_table.rb +29 -0
  211. data/db/migrate/061_convert_title_prefix_setting.rb +25 -0
  212. data/db/schema.mysql.sql +139 -108
  213. data/db/schema.postgresql.sql +140 -108
  214. data/db/schema.rb +97 -75
  215. data/db/schema.sqlite.sql +140 -108
  216. data/db/schema.sqlserver.sql +144 -109
  217. data/db/schema_version +1 -1
  218. data/lang/fr_FR.rb +469 -0
  219. data/lib/email_notify.rb +4 -4
  220. data/lib/generators/sidebar/sidebar_generator.rb +15 -6
  221. data/lib/generators/sidebar/templates/Rakefile +22 -0
  222. data/lib/generators/sidebar/templates/content.rhtml +10 -0
  223. data/lib/generators/sidebar/templates/init.rb +4 -0
  224. data/lib/generators/sidebar/templates/sidebar.rb +16 -0
  225. data/lib/generators/sidebar/templates/unit_test.rb +8 -0
  226. data/lib/jabber_notify.rb +8 -7
  227. data/lib/memory_profiler.rb +60 -0
  228. data/lib/rails_patch/active_record.rb +0 -27
  229. data/lib/route_cache.rb +15 -0
  230. data/lib/sidebars/component_plugin.rb +3 -0
  231. data/lib/sidebars/consolidated_plugin.rb +26 -0
  232. data/lib/sidebars/plugin.rb +8 -13
  233. data/lib/spam_protection.rb +35 -23
  234. data/lib/tasks/release.rake +7 -7
  235. data/lib/text_filter_plugin.rb +55 -15
  236. data/lib/typo_deprecated.rb +19 -0
  237. data/lib/typo_version.rb +1 -1
  238. data/public/images/bracket.gif +0 -0
  239. data/public/images/cancel.png +0 -0
  240. data/public/images/checked.png +0 -0
  241. data/public/images/delete.png +0 -0
  242. data/public/images/edit.png +0 -0
  243. data/public/images/help.png +0 -0
  244. data/public/images/show.png +0 -0
  245. data/public/javascripts/codecollapse.js +8 -0
  246. data/public/javascripts/controls.js +41 -23
  247. data/public/javascripts/dragdrop.js +105 -76
  248. data/public/javascripts/effects.js +293 -163
  249. data/public/javascripts/prototype.js +900 -391
  250. data/public/stylesheets/administration.css +390 -318
  251. data/public/stylesheets/codecollapse.css +3 -0
  252. data/public/stylesheets/minimal.css +142 -0
  253. data/public/stylesheets/textmate/dawn.css +209 -0
  254. data/public/stylesheets/textmate/iplastic.css +142 -0
  255. data/public/stylesheets/textmate/space_cadet.css +99 -0
  256. data/public/stylesheets/textmate/textmate.css +48 -0
  257. data/public/stylesheets/textmate/twilight.css +227 -0
  258. data/script/process/inspector +3 -0
  259. data/spec/controllers/accounts_controller_spec.rb +184 -0
  260. data/spec/controllers/articles_controller_spec.rb +47 -0
  261. data/spec/fixtures/articles_tags.yml +19 -0
  262. data/spec/fixtures/blacklist_patterns.yml +10 -0
  263. data/spec/fixtures/blogs.yml +77 -0
  264. data/spec/fixtures/categories.yml +35 -0
  265. data/{test/fixtures/articles_categories.yml → spec/fixtures/categorizations.yml} +0 -0
  266. data/spec/fixtures/contents.yml +215 -0
  267. data/spec/fixtures/feedback.yml +159 -0
  268. data/spec/fixtures/notifications.yml +0 -0
  269. data/spec/fixtures/page_caches.yml +7 -0
  270. data/spec/fixtures/redirects.yml +13 -0
  271. data/spec/fixtures/resources.yml +24 -0
  272. data/spec/fixtures/sidebars.yml +12 -0
  273. data/spec/fixtures/tags.yml +13 -0
  274. data/spec/fixtures/text_filters.yml +42 -0
  275. data/spec/fixtures/triggers.yml +1 -0
  276. data/spec/fixtures/users.yml +56 -0
  277. data/spec/fixtures/whiteboards.yml +13 -0
  278. data/spec/helpers/admin_base_helper_spec.rb +13 -0
  279. data/spec/models/amazon_sidebar_spec.rb +40 -0
  280. data/spec/models/audioscrobbler_spec.rb +134 -0
  281. data/spec/models/blog_spec.rb +28 -0
  282. data/spec/models/cache_support_spec.rb +55 -0
  283. data/spec/models/category_spec.rb +48 -0
  284. data/spec/models/configuration_spec.rb +108 -0
  285. data/spec/models/content_state_spec.rb +1010 -0
  286. data/spec/models/delegate_to_content_state_spec.rb +126 -0
  287. data/spec/models/delicious_spec.rb +101 -0
  288. data/spec/models/flickr_spec.rb +128 -0
  289. data/spec/models/metafragment_spec.rb +65 -0
  290. data/spec/models/page_cache_spec.rb +35 -0
  291. data/spec/models/page_spec.rb +88 -0
  292. data/spec/models/ping_spec.rb +133 -0
  293. data/spec/models/redirect_spec.rb +17 -0
  294. data/spec/models/resource_spec.rb +43 -0
  295. data/spec/models/static_sidebar_spec.rb +17 -0
  296. data/spec/models/tag_spec.rb +54 -0
  297. data/spec/models/text_filter_spec.rb +38 -0
  298. data/spec/models/theme_spec.rb +45 -0
  299. data/spec/models/trackback_spec.rb +60 -0
  300. data/spec/models/trigger_spec.rb +41 -0
  301. data/spec/models/user_spec.rb +105 -0
  302. data/test/fixtures/blogs.yml +5 -4
  303. data/test/fixtures/categorizations.yml +31 -0
  304. data/test/fixtures/contents.yml +2 -160
  305. data/test/fixtures/feedback.yml +159 -0
  306. data/test/fixtures/sidebars.yml +11 -4
  307. data/test/functional/accounts_controller_test.rb +6 -10
  308. data/test/functional/admin/article_preview_test.rb +21 -6
  309. data/test/functional/admin/blacklist_controller_test.rb +11 -11
  310. data/test/functional/admin/categories_controller_test.rb +13 -13
  311. data/test/functional/admin/comments_controller_test.rb +21 -21
  312. data/test/functional/admin/content_controller_test.rb +30 -38
  313. data/test/functional/admin/feedback_controller_test.rb +12 -12
  314. data/test/functional/admin/general_controller_test.rb +2 -2
  315. data/test/functional/admin/pages_controller_test.rb +3 -18
  316. data/test/functional/admin/resources_controller_test.rb +7 -7
  317. data/test/functional/admin/textfilters_controller_test.rb +2 -2
  318. data/test/functional/admin/themes_controller_test.rb +1 -1
  319. data/test/functional/admin/trackbacks_controller_test.rb +21 -21
  320. data/test/functional/admin/users_controller_test.rb +21 -18
  321. data/test/functional/articles_controller_test.rb +62 -46
  322. data/test/functional/backend_controller_test.rb +6 -6
  323. data/test/functional/redirect_controller_test.rb +3 -3
  324. data/test/functional/textfilter_controller_test.rb +10 -12
  325. data/test/functional/theme_controller_test.rb +1 -1
  326. data/test/functional/xml_controller_test.rb +7 -5
  327. data/test/mocks/themes/azure/layouts/default.rhtml +2 -2
  328. data/test/test_helper.rb +75 -0
  329. data/test/unit/amazon_sidebar_test.rb +36 -0
  330. data/test/unit/article_test.rb +36 -4
  331. data/test/unit/blog_test.rb +5 -36
  332. data/test/unit/cache_support_test.rb +62 -0
  333. data/test/unit/category_test.rb +6 -1
  334. data/test/unit/comment_test.rb +34 -9
  335. data/test/unit/content_state/factory_test.rb +8 -0
  336. data/test/unit/content_state/feedback_states_test.rb +71 -0
  337. data/test/unit/magnolia_test.rb +1 -1
  338. data/test/unit/notification_test.rb +10 -0
  339. data/test/unit/page_test.rb +20 -0
  340. data/test/unit/ping_test.rb +1 -1
  341. data/test/unit/sidebar_test.rb +2 -7
  342. data/test/unit/static_sidebar_test.rb +19 -0
  343. data/test/unit/tag_test.rb +6 -1
  344. data/test/unit/text_filter_test.rb +21 -21
  345. data/test/unit/theme_test.rb +1 -1
  346. data/test/unit/trackback_test.rb +16 -1
  347. data/themes/azure/layouts/default.rhtml +2 -2
  348. data/themes/scribbish/layouts/default.rhtml +2 -2
  349. data/themes/scribbish/stylesheets/content.css +6 -8
  350. data/themes/scribbish/views/articles/_article.rhtml +10 -10
  351. data/themes/scribbish/views/articles/_comment.rhtml +16 -12
  352. data/themes/scribbish/views/articles/_comment_form.rhtml +25 -22
  353. data/themes/scribbish/views/articles/_search.rhtml +14 -13
  354. data/themes/scribbish/views/articles/comment_preview.rhtml +3 -3
  355. data/themes/scribbish/views/articles/index.rhtml +1 -1
  356. data/themes/scribbish/views/articles/read.rhtml +8 -8
  357. data/vendor/cached_model/History.txt +30 -0
  358. data/vendor/cached_model/LICENSE.txt +30 -0
  359. data/vendor/cached_model/Manifest.txt +7 -0
  360. data/vendor/cached_model/README.txt +96 -0
  361. data/vendor/cached_model/Rakefile +25 -0
  362. data/vendor/cached_model/lib/cached_model.rb +287 -0
  363. data/vendor/cached_model/test/test_cached_model.rb +593 -0
  364. data/vendor/flickr/flickr.rb +1 -1
  365. data/vendor/memcache-client/History.txt +25 -0
  366. data/vendor/memcache-client/LICENSE.txt +30 -0
  367. data/vendor/memcache-client/Manifest.txt +8 -0
  368. data/vendor/memcache-client/README.txt +46 -0
  369. data/vendor/memcache-client/Rakefile +23 -0
  370. data/vendor/memcache-client/lib/memcache.rb +491 -0
  371. data/vendor/memcache-client/lib/memcache_util.rb +71 -0
  372. data/vendor/memcache-client/test/test_mem_cache.rb +284 -0
  373. data/vendor/plugins/action_view_patch/Rakefile +22 -0
  374. data/vendor/plugins/action_view_patch/init.rb +1 -0
  375. data/vendor/plugins/action_view_patch/lib/action_view_patch.rb +18 -0
  376. data/vendor/plugins/action_view_patch/test/action_view_patch_test.rb +56 -0
  377. data/vendor/plugins/aimpresence_sidebar/Rakefile +22 -0
  378. data/vendor/plugins/aimpresence_sidebar/init.rb +4 -0
  379. data/vendor/plugins/aimpresence_sidebar/lib/aimpresence_sidebar.rb +21 -0
  380. data/vendor/plugins/aimpresence_sidebar/test/aimpresence_sidebar_test.rb +33 -0
  381. data/vendor/plugins/aimpresence_sidebar/views/content.rhtml +4 -0
  382. data/vendor/plugins/amazon_sidebar/init.rb +5 -0
  383. data/vendor/plugins/amazon_sidebar/lib/amazon_sidebar.rb +16 -0
  384. data/vendor/plugins/amazon_sidebar/views/content.rhtml +4 -0
  385. data/vendor/plugins/archives_sidebar/Rakefile +22 -0
  386. data/vendor/plugins/archives_sidebar/init.rb +5 -0
  387. data/{components/plugins/sidebars/archives_controller.rb → vendor/plugins/archives_sidebar/lib/archives_sidebar.rb} +7 -6
  388. data/vendor/plugins/archives_sidebar/test/archives_sidebar_test.rb +8 -0
  389. data/{components/plugins/sidebars/archives → vendor/plugins/archives_sidebar/views}/content.rhtml +2 -2
  390. data/vendor/plugins/audioscrobbler_sidebar/Rakefile +22 -0
  391. data/vendor/plugins/audioscrobbler_sidebar/init.rb +5 -0
  392. data/{app/models/aggregations → vendor/plugins/audioscrobbler_sidebar/lib}/audioscrobbler.rb +0 -0
  393. data/{components/plugins/sidebars/audioscrobbler_controller.rb → vendor/plugins/audioscrobbler_sidebar/lib/audioscrobbler_sidebar.rb} +7 -4
  394. data/vendor/plugins/audioscrobbler_sidebar/test/audioscrobbler_sidebar_test.rb +8 -0
  395. data/{components/plugins/sidebars/audioscrobbler → vendor/plugins/audioscrobbler_sidebar/views}/content.rhtml +4 -4
  396. data/vendor/plugins/backpack_sidebar/Rakefile +22 -0
  397. data/vendor/plugins/backpack_sidebar/init.rb +5 -0
  398. data/{app/models/aggregations → vendor/plugins/backpack_sidebar/lib}/backpack.rb +0 -0
  399. data/{components/plugins/sidebars/backpack_controller.rb → vendor/plugins/backpack_sidebar/lib/backpack_sidebar.rb} +6 -3
  400. data/vendor/plugins/backpack_sidebar/test/backpack_sidebar_test.rb +8 -0
  401. data/{components/plugins/sidebars/backpack → vendor/plugins/backpack_sidebar/views}/content.rhtml +4 -4
  402. data/vendor/plugins/category_sidebar/Rakefile +22 -0
  403. data/vendor/plugins/category_sidebar/init.rb +5 -0
  404. data/{components/plugins/sidebars/category_controller.rb → vendor/plugins/category_sidebar/lib/category_sidebar.rb} +3 -5
  405. data/vendor/plugins/category_sidebar/test/category_sidebar_test.rb +8 -0
  406. data/vendor/plugins/category_sidebar/views/content.rhtml +10 -0
  407. data/vendor/plugins/delicious_sidebar/Rakefile +22 -0
  408. data/vendor/plugins/delicious_sidebar/init.rb +5 -0
  409. data/{app/models/aggregations → vendor/plugins/delicious_sidebar/lib}/delicious.rb +0 -0
  410. data/{components/plugins/sidebars/delicious_controller.rb → vendor/plugins/delicious_sidebar/lib/delicious_sidebar.rb} +16 -10
  411. data/vendor/plugins/delicious_sidebar/test/delicious_sidebar_test.rb +8 -0
  412. data/vendor/plugins/delicious_sidebar/views/content.rhtml +20 -0
  413. data/vendor/plugins/flickr_sidebar/Rakefile +22 -0
  414. data/vendor/plugins/flickr_sidebar/init.rb +5 -0
  415. data/{app/models/aggregations → vendor/plugins/flickr_sidebar/lib}/flickr.rb +1 -1
  416. data/vendor/plugins/flickr_sidebar/lib/flickr_sidebar.rb +15 -0
  417. data/vendor/plugins/flickr_sidebar/test/flickr_sidebar_test.rb +8 -0
  418. data/{components/plugins/sidebars/flickr → vendor/plugins/flickr_sidebar/views}/content.rhtml +5 -5
  419. data/vendor/plugins/fortythree_sidebar/Rakefile +22 -0
  420. data/vendor/plugins/fortythree_sidebar/init.rb +5 -0
  421. data/{app/models/aggregations → vendor/plugins/fortythree_sidebar/lib}/fortythree.rb +0 -0
  422. data/{components/plugins/sidebars/fortythree_controller.rb → vendor/plugins/fortythree_sidebar/lib/fortythree_sidebar.rb} +5 -4
  423. data/vendor/plugins/fortythree_sidebar/test/fortythree_sidebar_test.rb +8 -0
  424. data/vendor/plugins/fortythree_sidebar/views/content.rhtml +8 -0
  425. data/vendor/plugins/fortythreeplaces_sidebar/Rakefile +22 -0
  426. data/vendor/plugins/fortythreeplaces_sidebar/init.rb +5 -0
  427. data/vendor/plugins/fortythreeplaces_sidebar/lib/fortythree.rb +62 -0
  428. data/{components/plugins/sidebars/fortythreeplaces_controller.rb → vendor/plugins/fortythreeplaces_sidebar/lib/fortythreeplaces_sidebar.rb} +5 -4
  429. data/vendor/plugins/fortythreeplaces_sidebar/test/fortythreeplaces_sidebar_test.rb +8 -0
  430. data/vendor/plugins/fortythreeplaces_sidebar/views/content.rhtml +8 -0
  431. data/vendor/plugins/haml/MIT-LICENSE +20 -0
  432. data/vendor/plugins/haml/REFERENCE +662 -0
  433. data/vendor/plugins/haml/Rakefile +171 -0
  434. data/vendor/plugins/haml/VERSION +1 -0
  435. data/vendor/plugins/haml/bin/haml +18 -0
  436. data/vendor/plugins/haml/init.rb +3 -0
  437. data/vendor/plugins/haml/lib/haml/buffer.rb +224 -0
  438. data/vendor/plugins/haml/lib/haml/engine.rb +557 -0
  439. data/vendor/plugins/haml/lib/haml/helpers.rb +220 -0
  440. data/vendor/plugins/haml/lib/haml/helpers/action_view_mods.rb +54 -0
  441. data/vendor/plugins/haml/lib/haml/template.rb +138 -0
  442. data/vendor/plugins/haml/test/benchmark.rb +62 -0
  443. data/vendor/plugins/haml/test/engine_test.rb +93 -0
  444. data/vendor/plugins/haml/test/helper_test.rb +105 -0
  445. data/vendor/plugins/haml/test/mocks/article.rb +6 -0
  446. data/vendor/plugins/haml/test/profile.rb +45 -0
  447. data/vendor/plugins/haml/test/results/content_for_layout.xhtml +16 -0
  448. data/vendor/plugins/haml/test/results/eval_suppressed.xhtml +2 -0
  449. data/vendor/plugins/haml/test/results/helpers.xhtml +50 -0
  450. data/vendor/plugins/haml/test/results/helpful.xhtml +5 -0
  451. data/vendor/plugins/haml/test/results/just_stuff.xhtml +38 -0
  452. data/vendor/plugins/haml/test/results/list.xhtml +12 -0
  453. data/vendor/plugins/haml/test/results/original_engine.xhtml +24 -0
  454. data/vendor/plugins/haml/test/results/partials.xhtml +20 -0
  455. data/vendor/plugins/haml/test/results/silent_script.xhtml +74 -0
  456. data/vendor/plugins/haml/test/results/standard.xhtml +42 -0
  457. data/vendor/plugins/haml/test/results/tag_parsing.xhtml +28 -0
  458. data/vendor/plugins/haml/test/results/very_basic.xhtml +7 -0
  459. data/vendor/plugins/haml/test/results/whitespace_handling.xhtml +51 -0
  460. data/vendor/plugins/haml/test/rhtml/standard.rhtml +51 -0
  461. data/vendor/plugins/haml/test/runner.rb +15 -0
  462. data/vendor/plugins/haml/test/template_test.rb +137 -0
  463. data/vendor/plugins/haml/test/templates/_partial.haml +7 -0
  464. data/vendor/plugins/haml/test/templates/_text_area.haml +3 -0
  465. data/vendor/plugins/haml/test/templates/content_for_layout.haml +10 -0
  466. data/vendor/plugins/haml/test/templates/eval_suppressed.haml +5 -0
  467. data/vendor/plugins/haml/test/templates/helpers.haml +39 -0
  468. data/vendor/plugins/haml/test/templates/helpful.haml +6 -0
  469. data/vendor/plugins/haml/test/templates/just_stuff.haml +34 -0
  470. data/vendor/plugins/haml/test/templates/list.haml +12 -0
  471. data/vendor/plugins/haml/test/templates/original_engine.haml +17 -0
  472. data/vendor/plugins/haml/test/templates/partialize.haml +1 -0
  473. data/vendor/plugins/haml/test/templates/partials.haml +12 -0
  474. data/vendor/plugins/haml/test/templates/silent_script.haml +40 -0
  475. data/vendor/plugins/haml/test/templates/standard.haml +40 -0
  476. data/vendor/plugins/haml/test/templates/tag_parsing.haml +24 -0
  477. data/vendor/plugins/haml/test/templates/very_basic.haml +4 -0
  478. data/vendor/plugins/haml/test/templates/whitespace_handling.haml +66 -0
  479. data/vendor/plugins/localization/CHANGELOG +1 -0
  480. data/vendor/plugins/localization/README +85 -0
  481. data/vendor/plugins/localization/init.rb +3 -0
  482. data/vendor/plugins/localization/lib/localization.rb +46 -0
  483. data/vendor/plugins/magnolia_sidebar/Rakefile +22 -0
  484. data/vendor/plugins/magnolia_sidebar/init.rb +5 -0
  485. data/{app/models/aggregations/magnolia.rb → vendor/plugins/magnolia_sidebar/lib/magnolia_aggregation.rb} +0 -0
  486. data/vendor/plugins/magnolia_sidebar/lib/magnolia_sidebar.rb +16 -0
  487. data/vendor/plugins/magnolia_sidebar/test/magnolia_sidebar_test.rb +8 -0
  488. data/vendor/plugins/magnolia_sidebar/views/content.rhtml +12 -0
  489. data/vendor/plugins/recent_comments_sidebar/Rakefile +22 -0
  490. data/vendor/plugins/recent_comments_sidebar/init.rb +5 -0
  491. data/vendor/plugins/recent_comments_sidebar/lib/recent_comments_sidebar.rb +16 -0
  492. data/vendor/plugins/recent_comments_sidebar/test/recent_comments_sidebar_test.rb +8 -0
  493. data/{components/plugins/sidebars/recent_comments → vendor/plugins/recent_comments_sidebar/views}/content.rhtml +2 -2
  494. data/vendor/plugins/static_sidebar/init.rb +4 -0
  495. data/{components/plugins/sidebars/static_controller.rb → vendor/plugins/static_sidebar/lib/static_sidebar.rb} +4 -7
  496. data/vendor/plugins/static_sidebar/views/content.rhtml +2 -0
  497. data/vendor/plugins/tada_sidebar/Rakefile +22 -0
  498. data/vendor/plugins/tada_sidebar/init.rb +5 -0
  499. data/{app/models/aggregations → vendor/plugins/tada_sidebar/lib}/tada.rb +0 -0
  500. data/{components/plugins/sidebars/tada_controller.rb → vendor/plugins/tada_sidebar/lib/tada_sidebar.rb} +8 -4
  501. data/vendor/plugins/tada_sidebar/test/tada_sidebar_test.rb +8 -0
  502. data/{components/plugins/sidebars/tada → vendor/plugins/tada_sidebar/views}/content.rhtml +4 -4
  503. data/vendor/plugins/tag_sidebar/Rakefile +22 -0
  504. data/vendor/plugins/tag_sidebar/init.rb +5 -0
  505. data/vendor/plugins/tag_sidebar/lib/tag_sidebar.rb +24 -0
  506. data/vendor/plugins/tag_sidebar/test/tag_sidebar_test.rb +8 -0
  507. data/vendor/plugins/tag_sidebar/views/content.rhtml +8 -0
  508. data/vendor/plugins/technorati_sidebar/Rakefile +22 -0
  509. data/vendor/plugins/technorati_sidebar/init.rb +5 -0
  510. data/{app/models/aggregations → vendor/plugins/technorati_sidebar/lib}/technorati.rb +0 -0
  511. data/{components/plugins/sidebars/technorati_controller.rb → vendor/plugins/technorati_sidebar/lib/technorati_sidebar.rb} +8 -4
  512. data/vendor/plugins/technorati_sidebar/test/technorati_sidebar_test.rb +8 -0
  513. data/vendor/plugins/technorati_sidebar/views/content.rhtml +8 -0
  514. data/vendor/plugins/typo_textfilter_amazon/README +5 -0
  515. data/vendor/plugins/typo_textfilter_amazon/Rakefile +22 -0
  516. data/vendor/plugins/typo_textfilter_amazon/init.rb +4 -0
  517. data/vendor/plugins/typo_textfilter_amazon/install.rb +1 -0
  518. data/vendor/plugins/typo_textfilter_amazon/lib/typo_textfilter_amazon.rb +45 -0
  519. data/vendor/plugins/typo_textfilter_amazon/tasks/typo_textfilter_amazon_tasks.rake +4 -0
  520. data/vendor/plugins/typo_textfilter_amazon/test/typo_textfilter_amazon_test.rb +8 -0
  521. data/vendor/plugins/typo_textfilter_code/README +4 -0
  522. data/vendor/plugins/typo_textfilter_code/Rakefile +22 -0
  523. data/vendor/plugins/typo_textfilter_code/init.rb +4 -0
  524. data/vendor/plugins/typo_textfilter_code/install.rb +1 -0
  525. data/vendor/plugins/typo_textfilter_code/lib/typo_textfilter_code.rb +62 -0
  526. data/vendor/plugins/typo_textfilter_code/tasks/typo_textfilter_code_tasks.rake +4 -0
  527. data/vendor/plugins/typo_textfilter_code/test/typo_textfilter_code_test.rb +8 -0
  528. data/vendor/plugins/typo_textfilter_flickr/README +4 -0
  529. data/vendor/plugins/typo_textfilter_flickr/Rakefile +22 -0
  530. data/vendor/plugins/typo_textfilter_flickr/init.rb +4 -0
  531. data/vendor/plugins/typo_textfilter_flickr/install.rb +1 -0
  532. data/vendor/plugins/typo_textfilter_flickr/lib/typo_textfilter_flickr.rb +79 -0
  533. data/vendor/plugins/typo_textfilter_flickr/tasks/typo_textfilter_flickr_tasks.rake +4 -0
  534. data/vendor/plugins/typo_textfilter_flickr/test/typo_textfilter_flickr_test.rb +8 -0
  535. data/vendor/plugins/typo_textfilter_htmlfilter/README +4 -0
  536. data/vendor/plugins/typo_textfilter_htmlfilter/Rakefile +22 -0
  537. data/vendor/plugins/typo_textfilter_htmlfilter/init.rb +2 -0
  538. data/vendor/plugins/typo_textfilter_htmlfilter/install.rb +1 -0
  539. data/vendor/plugins/typo_textfilter_htmlfilter/lib/typo_textfilter_htmlfilter.rb +12 -0
  540. data/vendor/plugins/typo_textfilter_htmlfilter/tasks/typo_textfilter_htmlfilter_tasks.rake +4 -0
  541. data/vendor/plugins/typo_textfilter_htmlfilter/test/typo_textfilter_htmlfilter_test.rb +8 -0
  542. data/vendor/plugins/typo_textfilter_lightbox/README +4 -0
  543. data/vendor/plugins/typo_textfilter_lightbox/Rakefile +22 -0
  544. data/vendor/plugins/typo_textfilter_lightbox/init.rb +2 -0
  545. data/vendor/plugins/typo_textfilter_lightbox/install.rb +1 -0
  546. data/{components/plugins/textfilters/lightbox_controller.rb → vendor/plugins/typo_textfilter_lightbox/lib/typo_textfilter_lightbox.rb} +64 -61
  547. data/vendor/plugins/typo_textfilter_lightbox/tasks/typo_textfilter_lightbox_tasks.rake +4 -0
  548. data/vendor/plugins/typo_textfilter_lightbox/test/typo_textfilter_lightbox_test.rb +8 -0
  549. data/vendor/plugins/typo_textfilter_markdown/README +4 -0
  550. data/vendor/plugins/typo_textfilter_markdown/Rakefile +22 -0
  551. data/vendor/plugins/typo_textfilter_markdown/init.rb +2 -0
  552. data/vendor/plugins/typo_textfilter_markdown/install.rb +1 -0
  553. data/{components/plugins/textfilters/markdown_controller.rb → vendor/plugins/typo_textfilter_markdown/lib/typo_textfilter_markdown.rb} +13 -9
  554. data/vendor/plugins/typo_textfilter_markdown/tasks/typo_textfilter_markdown_tasks.rake +4 -0
  555. data/vendor/plugins/typo_textfilter_markdown/test/typo_textfilter_markdown_test.rb +8 -0
  556. data/vendor/plugins/typo_textfilter_none/README +4 -0
  557. data/vendor/plugins/typo_textfilter_none/Rakefile +22 -0
  558. data/vendor/plugins/typo_textfilter_none/init.rb +2 -0
  559. data/vendor/plugins/typo_textfilter_none/install.rb +1 -0
  560. data/vendor/plugins/typo_textfilter_none/lib/typo_textfilter_none.rb +12 -0
  561. data/vendor/plugins/typo_textfilter_none/tasks/typo_textfilter_none_tasks.rake +4 -0
  562. data/vendor/plugins/typo_textfilter_none/test/typo_textfilter_none_test.rb +8 -0
  563. data/vendor/plugins/typo_textfilter_smartypants/README +4 -0
  564. data/vendor/plugins/typo_textfilter_smartypants/Rakefile +22 -0
  565. data/vendor/plugins/typo_textfilter_smartypants/init.rb +2 -0
  566. data/vendor/plugins/typo_textfilter_smartypants/install.rb +1 -0
  567. data/vendor/plugins/typo_textfilter_smartypants/lib/typo_textfilter_smartypants.rb +12 -0
  568. data/vendor/plugins/typo_textfilter_smartypants/tasks/typo_textfilter_smartypants_tasks.rake +4 -0
  569. data/vendor/plugins/typo_textfilter_smartypants/test/typo_textfilter_smartypants_test.rb +8 -0
  570. data/vendor/plugins/typo_textfilter_sparkline/README +4 -0
  571. data/vendor/plugins/typo_textfilter_sparkline/Rakefile +22 -0
  572. data/vendor/plugins/typo_textfilter_sparkline/init.rb +2 -0
  573. data/vendor/plugins/typo_textfilter_sparkline/install.rb +1 -0
  574. data/vendor/plugins/typo_textfilter_sparkline/lib/typo_textfilter_sparkline.rb +92 -0
  575. data/vendor/plugins/typo_textfilter_sparkline/tasks/typo_textfilter_sparkline_tasks.rake +4 -0
  576. data/vendor/plugins/typo_textfilter_sparkline/test/typo_textfilter_sparkline_test.rb +8 -0
  577. data/vendor/plugins/typo_textfilter_textile/README +4 -0
  578. data/vendor/plugins/typo_textfilter_textile/Rakefile +22 -0
  579. data/vendor/plugins/typo_textfilter_textile/init.rb +2 -0
  580. data/vendor/plugins/typo_textfilter_textile/install.rb +1 -0
  581. data/vendor/plugins/typo_textfilter_textile/lib/typo_textfilter_textile.rb +18 -0
  582. data/vendor/plugins/typo_textfilter_textile/tasks/typo_textfilter_textile_tasks.rake +4 -0
  583. data/vendor/plugins/typo_textfilter_textile/test/typo_textfilter_textile_test.rb +8 -0
  584. data/vendor/plugins/typo_textfilter_textile_and_markdown/README +4 -0
  585. data/vendor/plugins/typo_textfilter_textile_and_markdown/Rakefile +22 -0
  586. data/vendor/plugins/typo_textfilter_textile_and_markdown/init.rb +2 -0
  587. data/vendor/plugins/typo_textfilter_textile_and_markdown/install.rb +1 -0
  588. data/vendor/plugins/typo_textfilter_textile_and_markdown/lib/typo_textfilter_textile_and_markdown.rb +12 -0
  589. data/vendor/plugins/typo_textfilter_textile_and_markdown/tasks/typo_textfilter_textile_and_markdown_tasks.rake +4 -0
  590. data/vendor/plugins/typo_textfilter_textile_and_markdown/test/typo_textfilter_textile_and_markdown_test.rb +8 -0
  591. data/vendor/plugins/typo_textfilter_tmcode/README +4 -0
  592. data/vendor/plugins/typo_textfilter_tmcode/Rakefile +22 -0
  593. data/vendor/plugins/typo_textfilter_tmcode/init.rb +3 -0
  594. data/vendor/plugins/typo_textfilter_tmcode/install.rb +1 -0
  595. data/vendor/plugins/typo_textfilter_tmcode/lib/typo_textfilter_tmcode.rb +86 -0
  596. data/vendor/plugins/typo_textfilter_tmcode/tasks/typo_textfilter_tmcode_tasks.rake +4 -0
  597. data/vendor/plugins/typo_textfilter_tmcode/test/typo_textfilter_tmcode_test.rb +8 -0
  598. data/vendor/plugins/upcoming_sidebar/Rakefile +22 -0
  599. data/vendor/plugins/upcoming_sidebar/init.rb +5 -0
  600. data/{app/models/aggregations → vendor/plugins/upcoming_sidebar/lib}/upcoming.rb +0 -0
  601. data/vendor/plugins/upcoming_sidebar/lib/upcoming_sidebar.rb +15 -0
  602. data/vendor/plugins/upcoming_sidebar/test/upcoming_sidebar_test.rb +8 -0
  603. data/{components/plugins/sidebars/upcoming → vendor/plugins/upcoming_sidebar/views}/content.rhtml +3 -3
  604. data/vendor/plugins/xbox_sidebar/Rakefile +22 -0
  605. data/vendor/plugins/xbox_sidebar/init.rb +5 -0
  606. data/{components/plugins/sidebars/xbox_controller.rb → vendor/plugins/xbox_sidebar/lib/xbox_sidebar.rb} +1 -1
  607. data/vendor/plugins/xbox_sidebar/test/xbox_sidebar_test.rb +8 -0
  608. data/vendor/plugins/xbox_sidebar/views/content.rhtml +2 -0
  609. data/vendor/plugins/xml_sidebar/Rakefile +22 -0
  610. data/vendor/plugins/xml_sidebar/init.rb +5 -0
  611. data/{components/plugins/sidebars/xml_controller.rb → vendor/plugins/xml_sidebar/lib/xml_sidebar.rb} +1 -1
  612. data/vendor/plugins/xml_sidebar/test/xml_sidebar_test.rb +8 -0
  613. data/vendor/plugins/xml_sidebar/views/content.rhtml +12 -0
  614. metadata +505 -101
  615. data/app/controllers/sidebar_controller.rb +0 -50
  616. data/app/models/content_observer.rb +0 -5
  617. data/components/plugins/sidebars/aimpresence/content.rhtml +0 -4
  618. data/components/plugins/sidebars/aimpresence_controller.rb +0 -10
  619. data/components/plugins/sidebars/amazon/content.rhtml +0 -4
  620. data/components/plugins/sidebars/amazon_controller.rb +0 -17
  621. data/components/plugins/sidebars/category/content.rhtml +0 -10
  622. data/components/plugins/sidebars/delicious/content.rhtml +0 -20
  623. data/components/plugins/sidebars/flickr_controller.rb +0 -16
  624. data/components/plugins/sidebars/fortythree/content.rhtml +0 -8
  625. data/components/plugins/sidebars/fortythreeplaces/content.rhtml +0 -8
  626. data/components/plugins/sidebars/magnolia/content.rhtml +0 -12
  627. data/components/plugins/sidebars/magnolia_controller.rb +0 -17
  628. data/components/plugins/sidebars/recent_comments_controller.rb +0 -23
  629. data/components/plugins/sidebars/static/content.rhtml +0 -2
  630. data/components/plugins/sidebars/tag/content.rhtml +0 -8
  631. data/components/plugins/sidebars/tag_controller.rb +0 -18
  632. data/components/plugins/sidebars/technorati/content.rhtml +0 -8
  633. data/components/plugins/sidebars/upcoming_controller.rb +0 -11
  634. data/components/plugins/sidebars/xbox/content.rhtml +0 -2
  635. data/components/plugins/sidebars/xml/content.rhtml +0 -12
  636. data/components/plugins/textfilters/amazon_controller.rb +0 -39
  637. data/components/plugins/textfilters/code_controller.rb +0 -59
  638. data/components/plugins/textfilters/flickr_controller.rb +0 -75
  639. data/components/plugins/textfilters/htmlfilter_controller.rb +0 -8
  640. data/components/plugins/textfilters/macropost_controller.rb +0 -14
  641. data/components/plugins/textfilters/macropre_controller.rb +0 -14
  642. data/components/plugins/textfilters/none_controller.rb +0 -8
  643. data/components/plugins/textfilters/smartypants_controller.rb +0 -8
  644. data/components/plugins/textfilters/sparkline_controller.rb +0 -88
  645. data/components/plugins/textfilters/textile_and_markdown_controller.rb +0 -8
  646. data/components/plugins/textfilters/textile_controller.rb +0 -14
  647. data/db/schema.mysql-v3.sql +0 -218
  648. data/lib/generators/sidebar/templates/components/plugins/sidebars/controller_template.rb +0 -20
  649. data/lib/generators/sidebar/templates/components/plugins/sidebars/views/content_template.rhtml +0 -4
  650. data/lib/rails_patch/components.rb +0 -14
  651. data/public/images/checked.gif +0 -0
  652. data/test/unit/observer_test.rb +0 -40
@@ -0,0 +1,48 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ context 'Given the results of Category.find_all_with_article_counters' do
4
+ fixtures :contents, :categories, :categorizations, :blogs
5
+
6
+ setup { @cats = Category.find_all_with_article_counters }
7
+
8
+ specify "Categories should be sorted by category.position" do
9
+ @cats.should == @cats.sort_by { |c| c.position }
10
+ end
11
+
12
+ specify "Counts should be correct" do
13
+ @cats.each do |cat|
14
+ cat.article_counter.should == cat.published_articles.size
15
+ end
16
+ end
17
+ end
18
+
19
+ context 'Given the fixtures' do
20
+ fixtures :contents, :categories, :categorizations, :blogs
21
+
22
+ specify 'find gets the order right' do
23
+ cats = Category.find(:all)
24
+ cats.should == cats.sort_by { |c| c.position }
25
+ Category.reorder(cats.reverse.collect { |c| c.id })
26
+ Category.find(:all).should == cats.reverse
27
+ end
28
+
29
+ specify 'can still override order in find' do
30
+ cats = Category.find(:all, :order => 'name ASC')
31
+
32
+ cats.should == cats.sort_by {|c| c.name}
33
+ Category.find(:all).should_not == cats
34
+ end
35
+
36
+ specify '.reorder_alpha puts categories in alphabetical order' do
37
+ Category.find(:all).should_not == Category.find(:all, :order => :name)
38
+ Category.reorder_alpha
39
+ Category.find(:all).should == Category.find(:all, :order => :name)
40
+ end
41
+
42
+ specify 'A category knows its url' do
43
+ categories(:software).permalink_url.should ==
44
+ 'http://myblog.net/articles/category/software'
45
+ end
46
+ end
47
+
48
+
@@ -0,0 +1,108 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ context 'Given a new blog' do
4
+ setup { @blog = Blog.new }
5
+
6
+ # Must find a better name for this key!
7
+ specify 'Global spam protection is not enabled' do
8
+ @blog.should_not_sp_global
9
+ end
10
+
11
+ specify '#blog_name should be My Shiny Weblog!' do
12
+ @blog.blog_name.should == 'My Shiny Weblog!'
13
+ end
14
+
15
+ specify '#blog_subtitle should be ""' do
16
+ @blog.blog_subtitle.should == ''
17
+ end
18
+
19
+ specify "#sp_article_auto_close should be 0" do
20
+ @blog.sp_article_auto_close.should == 0
21
+ end
22
+
23
+ specify "#sp_allow_non_ajax_comments should be false" do
24
+ @blog.should_sp_allow_non_ajax_comments
25
+ end
26
+
27
+ specify "#sp_url_limit should be 0" do
28
+ @blog.sp_url_limit.should_be 0
29
+ end
30
+
31
+ specify "#sp_akismet_key should be blank" do
32
+ @blog.sp_akismet_key.should == ''
33
+ end
34
+
35
+ # Another icky setting name
36
+ specify "#itunes_explicit should be false" do
37
+ @blog.itunes_explicit.should_be false
38
+ end
39
+
40
+ specify "Other itunes settings should be blank" do
41
+ %w{ author subtitle summary owner email name copyright}.each do |setting|
42
+ @blog.send("itunes_#{setting}").should == ''
43
+ end
44
+ end
45
+
46
+ specify '#text_filter and #comment_text_filter should be blank' do
47
+ @blog.text_filter.should == ''
48
+ @blog.comment_text_filter.should == ''
49
+ end
50
+
51
+ specify '#limit_article_display and #limit_rss_display should be 10' do
52
+ @blog.limit_article_display.should == 10
53
+ @blog.limit_rss_display.should == 10
54
+ end
55
+
56
+ specify 'Pings should not be allowed by default' do
57
+ @blog.should_not_default_allow_pings
58
+ end
59
+
60
+ specify 'Comments should be allowed by default' do
61
+ @blog.should_default_allow_comments
62
+ end
63
+
64
+ specify 'Should not link to author' do
65
+ @blog.should_not_link_to_author
66
+ end
67
+
68
+ specify 'Should show extended on rss' do
69
+ @blog.should_show_extended_on_rss
70
+ end
71
+
72
+ specify '#theme should be "azure"' do
73
+ @blog.theme.should == 'azure'
74
+ end
75
+
76
+ specify 'should not use gravatar' do
77
+ @blog.should_not_use_gravatar
78
+ end
79
+
80
+ # Another clumsy setting name
81
+ specify '#global_pings_disable should be false' do
82
+ @blog.global_pings_disable.should == false
83
+ @blog.should_not_global_pings_disable
84
+ end
85
+
86
+ specify 'should ping technorati, blog.gs and weblogs.com' do
87
+ @blog.ping_urls.should == "http://rpc.technorati.com/rpc/ping\nhttp://ping.blo.gs/\nhttp://rpc.weblogs.com/RPC2"
88
+ end
89
+
90
+ specify 'should send outbound pings' do
91
+ @blog.should_send_outbound_pings
92
+ end
93
+
94
+ specify '#email_from should be typo@example.com' do
95
+ @blog.email_from.should == 'typo@example.com'
96
+ end
97
+
98
+ specify 'Jabber address and password should be blank' do
99
+ @blog.jabber_address.should_be_blank
100
+ @blog.jabber_password.should_be_blank
101
+ end
102
+
103
+ specify '#is_okay should be false until #blog_name is explicitly set' do
104
+ @blog.is_ok?.should_be false
105
+ @blog.blog_name = 'Specific blog name'
106
+ @blog.is_ok?.should_be true
107
+ end
108
+ end
@@ -0,0 +1,1010 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ module ContentStateSpecHelper
4
+ def stop_the_clock
5
+ @this_instant = Time.now
6
+ Time.stub!(:now).and_return { @this_instant }
7
+ end
8
+
9
+ def should_set_content_fields(expectations = {})
10
+ expectations.each { |flag, val| @content.should_receive(:[]=).with(flag, val).and_return(val) }
11
+ end
12
+
13
+ alias_method :should_set_content_field, :should_set_content_fields
14
+
15
+ def should_change_state_to(statesym)
16
+ expected_state = case statesym
17
+ when :draft; ContentState::Draft
18
+ when :just_published; ContentState::JustPublished
19
+ when :published; ContentState::Published
20
+ when :draft; ContentState::Draft
21
+ when :publication_pending; ContentState::PublicationPending
22
+ when :withdrawn; ContentState::Withdrawn
23
+ when :just_withdrawn; ContentState::JustWithdrawn
24
+ when :unclassified; ContentState::Unclassified
25
+ when :new; ContentState::New
26
+ when :ham; ContentState::Ham
27
+ when :just_marked_as_ham; ContentState::JustMarkedAsHam
28
+ when :just_marked_as_spam; ContentState::JustMarkedAsSpam
29
+ when :spam; ContentState::Spam
30
+ when :presumed_ham; ContentState::PresumedHam
31
+ when :just_presumed_ham; ContentState::JustPresumedHam
32
+ when :presumed_spam; ContentState::PresumedSpam
33
+ else
34
+ raise "Don't recognize #{statesym.inspect} as a state"
35
+ end.instance
36
+ @content.should_receive(:state=).with(expected_state)
37
+ end
38
+ end
39
+
40
+ context 'With ContentState::New.instance and mock content' do
41
+ include ContentStateSpecHelper
42
+
43
+ setup do
44
+ @content = mock('content')
45
+ @state = ContentState::New.instance
46
+ end
47
+
48
+ specify '#just_published? should be false' do
49
+ @state.should_not_be_just_published
50
+ end
51
+
52
+ specify '#just_changed_published_status? should be false' do
53
+ @state.just_changed_published_status?.should_be false
54
+ end
55
+
56
+ specify '#enter_hook should set :published false and :published_at nil' do
57
+ should_set_content_fields :published => false, :published_at => nil
58
+
59
+ @state.enter_hook(@content)
60
+ end
61
+
62
+ specify '#before_save should set content.state to Draft' do
63
+ should_change_state_to :draft
64
+ @state.before_save(@content)
65
+ end
66
+
67
+ specify '#change_published_state => true should set published flag and change state to JustPublished' do
68
+ should_set_content_field :published => true
69
+ should_change_state_to :just_published
70
+
71
+ @state.change_published_state(@content, true)
72
+ end
73
+
74
+ specify '#change_published_state to false should set published flag' do
75
+ should_set_content_field :published => false
76
+ @state.change_published_state(@content, false)
77
+ end
78
+
79
+ specify '#set_published_at to the_future should set published_at and change to PublicationPending' do
80
+ stop_the_clock
81
+ should_set_content_field :published_at => Time.now + 10
82
+ should_change_state_to :publication_pending
83
+
84
+ @state.set_published_at(@content, Time.now + 10)
85
+ end
86
+
87
+ specify '#set_published_at now should set published_at and change to JustPublished' do
88
+ stop_the_clock
89
+ should_change_state_to :just_published
90
+ should_set_content_field :published_at => Time.now
91
+
92
+ @state.set_published_at(@content, Time.now)
93
+ end
94
+
95
+ specify '#set_published_at in the past should set published_at and change to JustPublished' do
96
+ stop_the_clock
97
+ should_change_state_to :just_published
98
+ should_set_content_field :published_at => Time.now - 10
99
+
100
+ @state.set_published_at(@content, Time.now - 10)
101
+ end
102
+
103
+ specify '#send_notifications should not send notifications' do
104
+ @content.should_not_receive(:anything)
105
+ @state.send_notifications(@content)
106
+ end
107
+
108
+ specify '#send_pings should not call back to @content.really_send_pings' do
109
+ @content.should_not_receive(:really_send_pings)
110
+
111
+ @state.send_pings(@content)
112
+ end
113
+ end
114
+
115
+ context 'With ContentState::Draft.instance and mock content' do
116
+ include ContentStateSpecHelper
117
+
118
+ setup do
119
+ @content = mock('content')
120
+ @state = ContentState::Draft.instance
121
+ end
122
+
123
+ specify '#just_published? should be false' do
124
+ @state.should_not_be_just_published
125
+ end
126
+
127
+ specify '#just_changed_published_status? should be false' do
128
+ @state.just_changed_published_status?.should_be false
129
+ end
130
+
131
+ specify '#enter_hook should set :published false and set published_at to nil' do
132
+ should_set_content_fields :published => false, :published_at => nil
133
+
134
+ @state.enter_hook(@content)
135
+ end
136
+
137
+ specify '#before_save should not do anything' do
138
+ @state.before_save(@content)
139
+ end
140
+
141
+ specify '#change_published_state => true should set published flag and change state to JustPublished' do
142
+ should_set_content_field :published => true
143
+ should_change_state_to :just_published
144
+
145
+ @state.change_published_state(@content, true)
146
+ end
147
+
148
+ specify '#change_published_state to false should set published flag' do
149
+ should_set_content_field :published => false
150
+ @state.change_published_state(@content, false)
151
+ end
152
+
153
+ specify '#set_published_at to the_future should set published_at and change to PublicationPending' do
154
+ stop_the_clock
155
+ should_set_content_field :published_at => Time.now + 10
156
+ should_change_state_to :publication_pending
157
+
158
+ @state.set_published_at(@content, Time.now + 10)
159
+ end
160
+
161
+ specify '#set_published_at <=now should discard the time and set published_at to nil' do
162
+ stop_the_clock
163
+ @content.should_receive(:[]=).with(:published_at, Time.now).ordered
164
+ @content.should_receive(:[]=).with(:published_at, nil).ordered
165
+
166
+ @state.set_published_at(@content, Time.now)
167
+ end
168
+
169
+ specify '#send_notifications should not send notifications' do
170
+ @content.should_not_receive(:anything)
171
+ @state.send_notifications(@content)
172
+ end
173
+
174
+ specify '#send_pings should not call back to @content.really_send_pings' do
175
+ @content.should_not_receive(:really_send_pings)
176
+
177
+ @state.send_pings(@content)
178
+ end
179
+ end
180
+
181
+ context 'With ContentState::Published.instance and mock content' do
182
+ include ContentStateSpecHelper
183
+
184
+ setup do
185
+ @content = mock('content')
186
+ @state = ContentState::Published.instance
187
+ end
188
+
189
+ specify '#just_published? should be false' do
190
+ @state.should_not_be_just_published
191
+ end
192
+
193
+ specify '#just_changed_published_status? should be false' do
194
+ @state.just_changed_published_status?.should_be false
195
+ end
196
+
197
+ specify '#enter_hook should set :published true and sets a nil published_at to Time.now' do
198
+ stop_the_clock
199
+ should_set_content_fields :published => true
200
+ @content.should_receive(:[]).with(:published_at).and_return nil
201
+ @content.should_receive(:[]=).with(:published_at, Time.now)
202
+
203
+ @state.enter_hook(@content)
204
+ end
205
+
206
+ specify '#before_save should just return true' do
207
+ @state.before_save(@content).should_be true
208
+ end
209
+
210
+ specify '#change_published_state => true should not do anything' do
211
+ @state.change_published_state(@content, true)
212
+ end
213
+
214
+ specify '#change_published_state to false should unset the published flag and change state to JustWithdrawn' do
215
+ should_set_content_fields :published => false, :published_at => nil
216
+ should_change_state_to :just_withdrawn
217
+ @state.change_published_state(@content, false)
218
+ end
219
+
220
+ specify '#set_published_at to the_future should set published_at and change to PublicationPending' do
221
+ stop_the_clock
222
+ should_set_content_field :published_at => Time.now + 10
223
+ should_change_state_to :publication_pending
224
+
225
+ @state.set_published_at(@content, Time.now + 10)
226
+ end
227
+
228
+ specify '#set_published_at now should set published_at' do
229
+ stop_the_clock
230
+ should_set_content_field :published_at => Time.now
231
+
232
+ @state.set_published_at(@content, Time.now)
233
+ end
234
+
235
+ specify '#set_published_at in the past should set published_at' do
236
+ stop_the_clock
237
+ should_set_content_field :published_at => Time.now - 10
238
+
239
+ @state.set_published_at(@content, Time.now - 10)
240
+ end
241
+
242
+ specify '#send_notifications should not send notifications' do
243
+ @content.should_not_receive(:anything)
244
+ @state.send_notifications(@content)
245
+ end
246
+
247
+ specify '#send_pings should not call back to @content.really_send_pings' do
248
+ @content.should_not_receive(:really_send_pings)
249
+
250
+ @state.send_pings(@content)
251
+ end
252
+ end
253
+
254
+ context 'With ContentState::JustPublished.instance and mock content' do
255
+ include ContentStateSpecHelper
256
+
257
+ setup do
258
+ @content = mock('content')
259
+ @state = ContentState::JustPublished.instance
260
+ end
261
+
262
+ specify '#just_published? should be true' do
263
+ @state.should_be_just_published
264
+ end
265
+
266
+ specify '#just_changed_published_status? should be true' do
267
+ @state.just_changed_published_status?.should_be true
268
+ end
269
+
270
+ specify '#enter_hook should set :published true and sets a nil published_at to Time.now' do
271
+ stop_the_clock
272
+ should_set_content_fields :published => true
273
+ @content.should_receive(:[]).with(:published_at).and_return nil
274
+ @content.should_receive(:[]=).with(:published_at, Time.now)
275
+
276
+ @state.enter_hook(@content)
277
+ end
278
+
279
+ specify '#before_save should just return true' do
280
+ @state.before_save(@content).should_be true
281
+ end
282
+
283
+ specify '#change_published_state => true should not do anything' do
284
+ @state.change_published_state(@content, true)
285
+ end
286
+
287
+ specify '#change_published_state to false should unset the published flag and change state to JustWithdrawn' do
288
+ should_set_content_fields :published => false, :published_at => nil
289
+ should_change_state_to :just_withdrawn
290
+ @state.change_published_state(@content, false)
291
+ end
292
+
293
+ specify '#set_published_at to the_future should set published_at and change to PublicationPending' do
294
+ stop_the_clock
295
+ should_set_content_field :published_at => Time.now + 10
296
+ should_change_state_to :publication_pending
297
+
298
+ @state.set_published_at(@content, Time.now + 10)
299
+ end
300
+
301
+ specify '#set_published_at now should set published_at' do
302
+ stop_the_clock
303
+ should_set_content_field :published_at => Time.now
304
+
305
+ @state.set_published_at(@content, Time.now)
306
+ end
307
+
308
+ specify '#set_published_at in the past should set published_at' do
309
+ stop_the_clock
310
+ should_set_content_field :published_at => Time.now - 10
311
+
312
+ @state.set_published_at(@content, Time.now - 10)
313
+ end
314
+
315
+ specify '#send_notifications should really send notifications' do
316
+ @content.should_receive(:interested_users).and_return([:bob, :jim])
317
+ @content.should_receive(:send_notification_to_user).with(:bob)
318
+ @content.should_receive(:send_notification_to_user).with(:jim)
319
+
320
+ @state.send_notifications(@content)
321
+ end
322
+
323
+ specify '#send_pings should call back to @content.really_send_pings' do
324
+ @content.should_receive(:really_send_pings)
325
+
326
+ @state.send_pings(@content)
327
+ end
328
+ end
329
+
330
+ context 'With ContentState::Withdrawn.instance and mock content' do
331
+ include ContentStateSpecHelper
332
+
333
+ setup do
334
+ @content = mock('content')
335
+ @state = ContentState::Withdrawn.instance
336
+ end
337
+
338
+ specify '#just_published? should be false' do
339
+ @state.should_not_be_just_published
340
+ end
341
+
342
+ specify '#just_changed_published_status? should be false' do
343
+ @state.just_changed_published_status?.should_be false
344
+ end
345
+
346
+ specify '#enter_hook should set :published false and set published_at to nil' do
347
+ should_set_content_field :published => false
348
+
349
+ @state.enter_hook(@content)
350
+ end
351
+
352
+ specify '#before_save should not do anything' do
353
+ @state.before_save(@content)
354
+ end
355
+
356
+ specify '#change_published_state => true should set published flag and change state to JustPublished' do
357
+ should_set_content_field :published => true
358
+ should_change_state_to :published
359
+
360
+ @state.change_published_state(@content, true)
361
+ end
362
+
363
+ specify '#change_published_state to false should not do anything' do
364
+ @content.should_not_receive(:[]=)
365
+ @state.change_published_state(@content, false)
366
+ end
367
+
368
+ specify '#set_published_at to the_future should set published_at, remove any trigger and change to PublicationPending' do
369
+ stop_the_clock
370
+ Trigger.should_receive(:remove).with(@content, :trigger_method => 'publish!')
371
+ should_set_content_field :published_at => Time.now + 10
372
+ should_change_state_to :publication_pending
373
+
374
+ @state.set_published_at(@content, Time.now + 10)
375
+ end
376
+
377
+ specify '#set_published_at <=now should change the publication time and remove any trigger' do
378
+ stop_the_clock
379
+ Trigger.should_receive(:remove).with(@content, :trigger_method => 'publish!')
380
+ @content.should_receive(:[]=).with(:published_at, Time.now).ordered
381
+
382
+ @state.set_published_at(@content, Time.now)
383
+ end
384
+
385
+ specify '#send_notifications should not send notifications' do
386
+ @content.should_not_receive(:anything)
387
+ @state.send_notifications(@content)
388
+ end
389
+
390
+ specify '#send_pings should not call back to @content.really_send_pings' do
391
+ @content.should_not_receive(:really_send_pings)
392
+
393
+ @state.send_pings(@content)
394
+ end
395
+ end
396
+
397
+ context 'With ContentState::JustWithdrawn.instance and mock content' do
398
+ include ContentStateSpecHelper
399
+
400
+ setup do
401
+ @content = mock('content')
402
+ @state = ContentState::JustWithdrawn.instance
403
+ end
404
+
405
+ specify '#just_published? should be false' do
406
+ @state.should_not_be_just_published
407
+ end
408
+
409
+ specify '#just_changed_published_status? should be true' do
410
+ @state.just_changed_published_status?.should_be true
411
+ end
412
+
413
+ specify '#enter_hook should set :published false' do
414
+ should_set_content_field :published => false
415
+
416
+ @state.enter_hook(@content)
417
+ end
418
+
419
+ specify '#before_save should not do anything' do
420
+ @content.should_not_receive(:[]=)
421
+ @state.before_save(@content)
422
+ end
423
+
424
+ specify '#change_published_state => true should set published flag and change state to Published' do
425
+ should_set_content_field :published => true
426
+ should_change_state_to :published
427
+
428
+ @state.change_published_state(@content, true)
429
+ end
430
+
431
+ specify '#change_published_state to false should not do anything' do
432
+ @content.should_not_receive(:[]=)
433
+ @state.change_published_state(@content, false)
434
+ end
435
+
436
+ specify '#set_published_at to the_future should set published_at, remove any trigger and change to PublicationPending' do
437
+ stop_the_clock
438
+ Trigger.should_receive(:remove).with(@content, :trigger_method => 'publish!')
439
+ should_set_content_field :published_at => Time.now + 10
440
+ should_change_state_to :publication_pending
441
+
442
+ @state.set_published_at(@content, Time.now + 10)
443
+ end
444
+
445
+ specify '#set_published_at <=now should change the publication time and remove any trigger' do
446
+ stop_the_clock
447
+ Trigger.should_receive(:remove).with(@content, :trigger_method => 'publish!')
448
+ @content.should_receive(:[]=).with(:published_at, Time.now).ordered
449
+
450
+ @state.set_published_at(@content, Time.now)
451
+ end
452
+
453
+ specify '#send_notifications should not send notifications' do
454
+ @content.should_not_receive(:anything)
455
+ @state.send_notifications(@content)
456
+ end
457
+
458
+ specify '#send_pings should not call back to @content.really_send_pings' do
459
+ @content.should_not_receive(:really_send_pings)
460
+
461
+ @state.send_pings(@content)
462
+ end
463
+ end
464
+
465
+ context 'With ContentState::PublicationPending.instance and mock content' do
466
+ include ContentStateSpecHelper
467
+
468
+ setup do
469
+ @content = mock('content')
470
+ @state = ContentState::PublicationPending.instance
471
+ end
472
+
473
+ specify '#just_published? should be false' do
474
+ @state.should_not_be_just_published
475
+ end
476
+
477
+ specify '#just_changed_published_status? should be false' do
478
+ @state.just_changed_published_status?.should_be false
479
+ end
480
+
481
+ specify '#enter_hook should set :published false for a new record' do
482
+ @content.should_receive(:new_record?).and_return true
483
+ should_set_content_field :published => false
484
+
485
+ @state.enter_hook(@content)
486
+ end
487
+
488
+ specify '#enter_hook should not touch an existing record' do
489
+ @content.should_receive(:new_record?).and_return false
490
+ @content.should_not_receive(:[]=)
491
+
492
+ @state.enter_hook(@content)
493
+ end
494
+
495
+ specify '#before_save should not do anything' do
496
+ @state.before_save(@content)
497
+ end
498
+
499
+ # I don't quite understand why this works like this... just port the test for now.
500
+ specify '#change_published_state => true should set published flag and change to JustPublished if published_at is in the past' do
501
+ stop_the_clock
502
+ @content.should_receive(:published_at).and_return(Time.now - 10)
503
+ should_change_state_to :just_published
504
+
505
+ should_set_content_field :published => true
506
+
507
+ @state.change_published_state(@content, true)
508
+ end
509
+
510
+ specify '#change_published_state => true should just set the published flag if published_at is in the future' do
511
+ stop_the_clock
512
+ @content.should_receive(:published_at).and_return(Time.now + 10)
513
+
514
+ should_set_content_field :published => true
515
+
516
+ @state.change_published_state(@content, true)
517
+ end
518
+
519
+
520
+ specify '#change_published_state to false should unset the flag' do
521
+ should_set_content_field :published => false
522
+ @state.change_published_state(@content, false)
523
+ end
524
+
525
+ specify '#set_published_at to the_future should set published_at, remove any trigger and change to PublicationPending' do
526
+ stop_the_clock
527
+ Trigger.should_receive(:remove).with(@content, :trigger_method => 'publish!')
528
+ should_set_content_field :published_at => Time.now + 10
529
+
530
+ @state.set_published_at(@content, Time.now + 10)
531
+ end
532
+
533
+ specify '#set_published_at <=now should change the publication time and remove any trigger' do
534
+ stop_the_clock
535
+ Trigger.should_receive(:remove).with(@content, :trigger_method => 'publish!')
536
+ should_set_content_field :published_at => Time.now - 10
537
+ should_change_state_to :just_published
538
+
539
+ @state.set_published_at(@content, Time.now - 10)
540
+ end
541
+
542
+ specify '#set_published_at <= nil should nil the publication time and change state to Draft' do
543
+ Trigger.should_receive(:remove).with(@content, :trigger_method => 'publish!')
544
+ should_set_content_field :published_at => nil
545
+ should_change_state_to :draft
546
+
547
+ @state.set_published_at(@content, nil)
548
+ end
549
+
550
+ specify '#send_notifications should not send notifications' do
551
+ @content.should_not_receive(:anything)
552
+ @state.send_notifications(@content)
553
+ end
554
+
555
+ specify '#send_pings should not call back to @content.really_send_pings' do
556
+ @content.should_not_receive(:really_send_pings)
557
+
558
+ @state.send_pings(@content)
559
+ end
560
+ end
561
+
562
+ context 'With ContentState::Unclassified.instance and mock content' do
563
+ include ContentStateSpecHelper
564
+
565
+ setup do
566
+ @content = mock('content')
567
+ @state = ContentState::Unclassified.instance
568
+ end
569
+
570
+ specify 'state should stringify as "Unclassified"' do
571
+ @state.to_s.should == 'Unclassified'
572
+ end
573
+
574
+ specify '#just_published? should be false' do
575
+ @state.should_not_be_just_published
576
+ end
577
+
578
+ specify '#published? should force content classification' do
579
+ should_force_classification(:published?)
580
+ end
581
+
582
+ specify '#just_changed_published_status? should be false' do
583
+ @state.just_changed_published_status?.should_be false
584
+ end
585
+
586
+ specify '#mark_as_spam should change to JustMarkedAsSpam' do
587
+ should_change_state_to :just_marked_as_spam
588
+ @state.mark_as_spam(@content)
589
+ end
590
+
591
+ specify '#mark_as_ham should change state to JustMarkedAsHam' do
592
+ should_change_state_to :just_marked_as_ham
593
+ @state.mark_as_ham(@content)
594
+ end
595
+
596
+
597
+ specify '#is_spam? should force content classification' do
598
+ should_force_classification(:is_spam?)
599
+ end
600
+
601
+ specify '#enter_hook should set :published and :status_confirmed to false' do
602
+ should_set_content_fields :published => false, :status_confirmed => false
603
+
604
+ @state.enter_hook(@content)
605
+ end
606
+
607
+ specify '#before_save should force classification' do
608
+ should_force_classification(:before_save)
609
+ end
610
+
611
+ specify '#after_save should not do anything' do
612
+ @content.should_not_receive(:anything)
613
+ @state.after_save(@content).should_be true
614
+ end
615
+
616
+ specify '#send_notifications should not do anything' do
617
+ @content.should_not_receive(:anything)
618
+ @state.send_notifications(@content)
619
+ end
620
+
621
+ specify '#send_pings should not do anything' do
622
+ @content.should_not_receive(:anything)
623
+ @state.send_pings(@content)
624
+ end
625
+
626
+ def should_force_classification(state_method, expected_result = :ham)
627
+ @content.should_receive(:classify).and_return(expected_result)
628
+ new_state = case expected_result
629
+ when :ham; ContentState::JustPresumedHam.instance
630
+ when :spam; ContentState::JustPresumedSpam.instance
631
+ else ContentState::JustPresumedSpam.instance
632
+ end
633
+ @content.should_receive(:state=).and_return(new_state)
634
+ @state.send(state_method, @content)
635
+ end
636
+
637
+
638
+
639
+ end
640
+
641
+ context 'With ContentState::JustPresumedHam.instance and mock content' do
642
+ include ContentStateSpecHelper
643
+
644
+ setup do
645
+ @content = mock('content')
646
+ @state = ContentState::JustPresumedHam.instance
647
+ end
648
+
649
+ specify '#just_published? should be true' do
650
+ @state.should_be_just_published
651
+ end
652
+
653
+ specify '#published? should be true' do
654
+ @state.should_be_published(@content)
655
+ end
656
+
657
+ specify '#just_changed_published_status? should be true' do
658
+ @state.just_changed_published_status?.should_be true
659
+ end
660
+
661
+ specify '#enter_hook should set :published to true and :status_confirmed to false' do
662
+ should_set_content_fields :published => true, :status_confirmed => false
663
+
664
+ @state.enter_hook(@content)
665
+ end
666
+
667
+ specify '#after_save should not do anything' do
668
+ @content.should_not_receive(:anything)
669
+ @state.after_save(@content).should_be true
670
+ end
671
+
672
+ specify '#before_save should not do anything' do
673
+ @content.should_not_receive(:anything)
674
+ @state.before_save(@content).should_be true
675
+ end
676
+
677
+ specify '#mark_as_spam should change state to ContentState::JustMarkedAsSpam' do
678
+ should_change_state_to :just_marked_as_spam
679
+ @state.mark_as_spam(@content)
680
+ end
681
+
682
+ specify '#mark_as_ham should change state to ContentState::Ham' do
683
+ should_change_state_to :ham
684
+ @state.mark_as_ham(@content)
685
+ end
686
+
687
+ specify 'state should stringify as "Ham?"' do
688
+ @state.to_s.should == 'Ham?'
689
+ end
690
+
691
+ specify '#send_notifications should send notifications to interested users' do
692
+ @content.should_receive(:interested_users).and_return([:tom, :dick, :harry])
693
+ @content.should_receive(:send_notification_to_user).with(:tom)
694
+ @content.should_receive(:send_notification_to_user).with(:dick)
695
+ @content.should_receive(:send_notification_to_user).with(:harry)
696
+
697
+ @state.send_notifications(@content)
698
+ end
699
+
700
+ specify '#send_pings should really send pings' do
701
+ @content.should_receive(:really_send_pings)
702
+ @state.send_pings(@content)
703
+ end
704
+ end
705
+
706
+
707
+ context 'With ContentState::PresumedHam.instance and mock content' do
708
+ include ContentStateSpecHelper
709
+
710
+ setup do
711
+ @content = mock('content')
712
+ @state = ContentState::PresumedHam.instance
713
+ end
714
+
715
+ specify '#just_published? should be false' do
716
+ @state.should_not_be_just_published
717
+ end
718
+
719
+ specify '#published? should be true' do
720
+ @state.should_be_published(@content)
721
+ end
722
+
723
+ specify '#just_changed_published_status? should be false' do
724
+ @state.just_changed_published_status?.should_be false
725
+ end
726
+
727
+ specify '#enter_hook should set :published to true and :status_confirmed to false' do
728
+ should_set_content_fields :published => true, :status_confirmed => false
729
+
730
+ @state.enter_hook(@content)
731
+ end
732
+
733
+ specify '#after_save should not do anything' do
734
+ @content.should_not_receive(:anything)
735
+ @state.after_save(@content).should_be true
736
+ end
737
+
738
+ specify '#before_save should not do anything' do
739
+ @content.should_not_receive(:anything)
740
+ @state.before_save(@content).should_be true
741
+ end
742
+
743
+ specify '#mark_as_spam should change state to ContentState::JustMarkedAsSpam' do
744
+ should_change_state_to :just_marked_as_spam
745
+ @state.mark_as_spam(@content)
746
+ end
747
+
748
+ specify '#mark_as_ham should change state to ContentState::Ham' do
749
+ should_change_state_to :ham
750
+ @state.mark_as_ham(@content)
751
+ end
752
+
753
+ specify 'state should stringify as "Ham?"' do
754
+ @state.to_s.should == 'Ham?'
755
+ end
756
+
757
+ specify '#send_notifications should not send any notifications' do
758
+ @content.should_not_receive(:anything)
759
+ @state.send_notifications(@content)
760
+ end
761
+
762
+ specify '#send_pings should not send pings' do
763
+ @content.should_not_receive(:really_send_pings)
764
+ @state.send_pings(@content)
765
+ end
766
+ end
767
+
768
+ context 'With ContentState::Ham.instance and mock content' do
769
+ include ContentStateSpecHelper
770
+
771
+ setup do
772
+ @content = mock('content')
773
+ @state = ContentState::Ham.instance
774
+ end
775
+
776
+ specify '#just_published? should be false' do
777
+ @state.should_not_be_just_published
778
+ end
779
+
780
+ specify '#published? should be true' do
781
+ @state.should_be_published(@content)
782
+ end
783
+
784
+ specify '#just_changed_published_status? should be false' do
785
+ @state.just_changed_published_status?.should_be false
786
+ end
787
+
788
+ specify '#enter_hook should set :published and :status_confirmed to true' do
789
+ should_set_content_fields :published => true, :status_confirmed => true
790
+
791
+ @state.enter_hook(@content)
792
+ end
793
+
794
+ specify '#after_save should not do anything' do
795
+ @content.should_not_receive(:anything)
796
+ @state.after_save(@content).should_be true
797
+ end
798
+
799
+ specify '#before_save should not do anything' do
800
+ @content.should_receive(:report_as_ham)
801
+ @state.before_save(@content).should_be true
802
+ end
803
+
804
+ specify '#mark_as_spam should change state to ContentState::JustMarkedAsSpam' do
805
+ should_change_state_to :just_marked_as_spam
806
+ @state.mark_as_spam(@content)
807
+ end
808
+
809
+ specify '#mark_as_ham should not do anything' do
810
+ @content.should_not_receive(:anything)
811
+ @state.mark_as_ham(@content)
812
+ end
813
+
814
+ specify 'state should stringify as "Ham"' do
815
+ @state.to_s.should == 'Ham'
816
+ end
817
+
818
+ specify '#send_notifications should not send any notifications' do
819
+ @content.should_not_receive(:anything)
820
+ @state.send_notifications(@content)
821
+ end
822
+
823
+ specify '#send_pings should not send pings' do
824
+ @content.should_not_receive(:really_send_pings)
825
+ @state.send_pings(@content)
826
+ end
827
+ end
828
+
829
+ context 'With ContentState::PresumedSpam.instance and mock content' do
830
+ include ContentStateSpecHelper
831
+
832
+ setup do
833
+ @content = mock('content')
834
+ @state = ContentState::PresumedSpam.instance
835
+ end
836
+
837
+ specify '#just_published? should be false' do
838
+ @state.should_not_be_just_published
839
+ end
840
+
841
+ specify '#published? should be false' do
842
+ @state.should_not_be_published(@content)
843
+ end
844
+
845
+ specify '#just_changed_published_status? should be false' do
846
+ @state.just_changed_published_status?.should_be false
847
+ end
848
+
849
+ specify '#enter_hook should set :published and :status_confirmed to false' do
850
+ should_set_content_fields :published => false, :status_confirmed => false
851
+
852
+ @state.enter_hook(@content)
853
+ end
854
+
855
+ specify '#after_save should not do anything' do
856
+ @content.should_not_receive(:anything)
857
+ @state.after_save(@content).should_be true
858
+ end
859
+
860
+ specify '#before_save should not do anything' do
861
+ @content.should_not_receive(:anything)
862
+ @state.before_save(@content).should_be true
863
+ end
864
+
865
+ specify '#mark_as_spam should change state to ContentState::Spam' do
866
+ should_change_state_to :spam
867
+ @state.mark_as_spam(@content)
868
+ end
869
+
870
+ specify '#mark_as_ham should change state to ContentState::JustMarkedAsHam' do
871
+ should_change_state_to :just_marked_as_ham
872
+ @state.mark_as_ham(@content)
873
+ end
874
+
875
+ specify 'state should stringify as "Spam?"' do
876
+ @state.to_s.should == 'Spam?'
877
+ end
878
+
879
+ specify '#send_notifications should not send any notifications' do
880
+ @content.should_not_receive(:anything)
881
+ @state.send_notifications(@content)
882
+ end
883
+
884
+ specify '#send_pings should not send pings' do
885
+ @content.should_not_receive(:really_send_pings)
886
+ @state.send_pings(@content)
887
+ end
888
+ end
889
+
890
+ context 'With ContentState::JustMarkedAsSpam.instance and mock content' do
891
+ include ContentStateSpecHelper
892
+
893
+ setup do
894
+ @content = mock('content')
895
+ @state = ContentState::JustMarkedAsSpam.instance
896
+ end
897
+
898
+ specify '#just_published? should be false' do
899
+ @state.should_not_be_just_published
900
+ end
901
+
902
+ specify '#published? should be false' do
903
+ @state.should_not_be_published(@content)
904
+ end
905
+
906
+ specify '#just_changed_published_status? should be true' do
907
+ @state.just_changed_published_status?.should_be true
908
+ end
909
+
910
+ specify '#enter_hook should set :published false and :status_confirmed to true' do
911
+ should_set_content_fields :published => false, :status_confirmed => true
912
+
913
+ @state.enter_hook(@content)
914
+ end
915
+
916
+ specify '#after_save should report the feedback as spam' do
917
+ @content.should_receive(:report_as_spam)
918
+ @state.after_save(@content).should_be true
919
+ end
920
+
921
+ specify '#before_save should not do anything' do
922
+ @content.should_not_receive(:anything)
923
+ @state.before_save(@content).should_be true
924
+ end
925
+
926
+ specify '#mark_as_spam should not do anything' do
927
+ @content.should_not_receive(:anything)
928
+ @state.mark_as_spam(@content)
929
+ end
930
+
931
+ specify '#mark_as_ham should change state to ContentState::JustMarkedAsHam' do
932
+ should_change_state_to :just_marked_as_ham
933
+ @state.mark_as_ham(@content)
934
+ end
935
+
936
+ specify 'state should stringify as "Spam"' do
937
+ @state.to_s.should == 'Spam'
938
+ end
939
+
940
+ specify '#send_notifications should not send any notifications' do
941
+ @content.should_not_receive(:anything)
942
+ @state.send_notifications(@content)
943
+ end
944
+
945
+ specify '#send_pings should not send pings' do
946
+ @content.should_not_receive(:really_send_pings)
947
+ @state.send_pings(@content)
948
+ end
949
+ end
950
+
951
+ context 'With ContentState::Spam.instance and mock content' do
952
+ include ContentStateSpecHelper
953
+
954
+ setup do
955
+ @content = mock('content')
956
+ @state = ContentState::Spam.instance
957
+ end
958
+
959
+ specify '#just_published? should be false' do
960
+ @state.should_not_be_just_published
961
+ end
962
+
963
+ specify '#published? should be false' do
964
+ @state.should_not_be_published(@content)
965
+ end
966
+
967
+ specify '#just_changed_published_status? should be false' do
968
+ @state.just_changed_published_status?.should_be false
969
+ end
970
+
971
+ specify '#enter_hook should set :published false and :status_confirmed to true' do
972
+ should_set_content_fields :published => false, :status_confirmed => true
973
+
974
+ @state.enter_hook(@content)
975
+ end
976
+
977
+ specify '#after_save should do nothing' do
978
+ @content.should_not_receive(:anything)
979
+ @state.after_save(@content).should_be true
980
+ end
981
+
982
+ specify '#before_save should not do anything' do
983
+ @content.should_not_receive(:anything)
984
+ @state.before_save(@content).should_be true
985
+ end
986
+
987
+ specify '#mark_as_spam should not do anything' do
988
+ @content.should_not_receive(:anything)
989
+ @state.mark_as_spam(@content)
990
+ end
991
+
992
+ specify '#mark_as_ham should change state to ContentState::JustMarkedAsHam' do
993
+ should_change_state_to :just_marked_as_ham
994
+ @state.mark_as_ham(@content)
995
+ end
996
+
997
+ specify 'state should stringify as "Spam"' do
998
+ @state.to_s.should == 'Spam'
999
+ end
1000
+
1001
+ specify '#send_notifications should not send any notifications' do
1002
+ @content.should_not_receive(:anything)
1003
+ @state.send_notifications(@content)
1004
+ end
1005
+
1006
+ specify '#send_pings should not send pings' do
1007
+ @content.should_not_receive(:really_send_pings)
1008
+ @state.send_pings(@content)
1009
+ end
1010
+ end