proclaim 0.1.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 (265) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +6 -0
  3. data/Gemfile +14 -0
  4. data/LICENSE +674 -0
  5. data/README.md +137 -0
  6. data/Rakefile +65 -0
  7. data/VERSION +1 -0
  8. data/app/assets/images/ajax_loader.gif +0 -0
  9. data/app/assets/javascripts/proclaim.js +18 -0
  10. data/app/assets/javascripts/proclaim/comments_handler.js.coffee +192 -0
  11. data/app/assets/javascripts/proclaim/editor.js.coffee +50 -0
  12. data/app/assets/javascripts/proclaim/images.js.coffee +3 -0
  13. data/app/assets/javascripts/proclaim/subscriptions.js.coffee +3 -0
  14. data/app/assets/stylesheets/proclaim.css.scss +28 -0
  15. data/app/assets/stylesheets/proclaim/comments.css.scss +14 -0
  16. data/app/assets/stylesheets/proclaim/images.scss +3 -0
  17. data/app/assets/stylesheets/proclaim/posts.css.scss +77 -0
  18. data/app/assets/stylesheets/proclaim/subscriptions.css.scss +3 -0
  19. data/app/controllers/proclaim/application_controller.rb +44 -0
  20. data/app/controllers/proclaim/comments_controller.rb +128 -0
  21. data/app/controllers/proclaim/images_controller.rb +108 -0
  22. data/app/controllers/proclaim/posts_controller.rb +131 -0
  23. data/app/controllers/proclaim/subscriptions_controller.rb +67 -0
  24. data/app/helpers/proclaim/application_helper.rb +34 -0
  25. data/app/helpers/proclaim/comments_helper.rb +4 -0
  26. data/app/helpers/proclaim/images_helper.rb +4 -0
  27. data/app/helpers/proclaim/posts_helper.rb +4 -0
  28. data/app/helpers/proclaim/subscriptions_helper.rb +4 -0
  29. data/app/mailers/proclaim/subscription_mailer.rb +43 -0
  30. data/app/models/proclaim/comment.rb +35 -0
  31. data/app/models/proclaim/image.rb +19 -0
  32. data/app/models/proclaim/post.rb +133 -0
  33. data/app/models/proclaim/subscription.rb +63 -0
  34. data/app/policies/application_policy.rb +53 -0
  35. data/app/policies/proclaim/comment_policy.rb +27 -0
  36. data/app/policies/proclaim/image_policy.rb +29 -0
  37. data/app/policies/proclaim/post_policy.rb +38 -0
  38. data/app/policies/proclaim/subscription_policy.rb +32 -0
  39. data/app/uploaders/proclaim/image_uploader.rb +82 -0
  40. data/app/views/layouts/proclaim/subscription_mailer.html.erb +133 -0
  41. data/app/views/proclaim/comments/_comment.html.erb +33 -0
  42. data/app/views/proclaim/comments/_form.html.erb +51 -0
  43. data/app/views/proclaim/posts/_form.html.erb +67 -0
  44. data/app/views/proclaim/posts/edit.html.erb +3 -0
  45. data/app/views/proclaim/posts/index.html.erb +30 -0
  46. data/app/views/proclaim/posts/new.html.erb +3 -0
  47. data/app/views/proclaim/posts/show.html.erb +46 -0
  48. data/app/views/proclaim/subscription_mailer/new_comment_notification_email.html.erb +11 -0
  49. data/app/views/proclaim/subscription_mailer/new_post_notification_email.html.erb +15 -0
  50. data/app/views/proclaim/subscription_mailer/welcome_email.html.erb +25 -0
  51. data/app/views/proclaim/subscriptions/_form.html.erb +32 -0
  52. data/app/views/proclaim/subscriptions/new.html.erb +8 -0
  53. data/app/views/proclaim/subscriptions/subscribed.html.erb +7 -0
  54. data/app/views/proclaim/subscriptions/unsubscribe.html.erb +7 -0
  55. data/app/views/proclaim/subscriptions/unsubscribed.html.erb +3 -0
  56. data/config/routes.rb +18 -0
  57. data/db/migrate/20141108222616_create_proclaim_posts.rb +15 -0
  58. data/db/migrate/20141114235359_create_proclaim_comments.rb +15 -0
  59. data/db/migrate/20141115022230_create_proclaim_comment_hierarchies.rb +26 -0
  60. data/db/migrate/20141210234057_create_proclaim_subscriptions.rb +17 -0
  61. data/db/migrate/20141222224905_create_proclaim_images.rb +12 -0
  62. data/lib/generators/proclaim/install_generator.rb +23 -0
  63. data/lib/generators/proclaim/templates/README +27 -0
  64. data/lib/generators/proclaim/templates/initialize_proclaim.rb +22 -0
  65. data/lib/generators/proclaim/views_generator.rb +24 -0
  66. data/lib/proclaim.rb +22 -0
  67. data/lib/proclaim/engine.rb +39 -0
  68. data/lib/proclaim/version.rb +3 -0
  69. data/lib/tasks/proclaim_tasks.rake +4 -0
  70. data/proclaim.gemspec +46 -0
  71. data/test/controllers/proclaim/comments_controller_test.rb +228 -0
  72. data/test/controllers/proclaim/images_controller_test.rb +123 -0
  73. data/test/controllers/proclaim/posts_controller_test.rb +303 -0
  74. data/test/controllers/proclaim/subscriptions_controller_test.rb +93 -0
  75. data/test/dummy/README.rdoc +28 -0
  76. data/test/dummy/Rakefile +6 -0
  77. data/test/dummy/app/assets/javascripts/application.js +14 -0
  78. data/test/dummy/app/assets/stylesheets/application.css +16 -0
  79. data/test/dummy/app/controllers/application_controller.rb +15 -0
  80. data/test/dummy/app/helpers/application_helper.rb +28 -0
  81. data/test/dummy/app/models/user.rb +7 -0
  82. data/test/dummy/app/views/layouts/application.html.erb +16 -0
  83. data/test/dummy/bin/bundle +3 -0
  84. data/test/dummy/bin/rails +4 -0
  85. data/test/dummy/bin/rake +4 -0
  86. data/test/dummy/config.ru +4 -0
  87. data/test/dummy/config/application.rb +24 -0
  88. data/test/dummy/config/boot.rb +5 -0
  89. data/test/dummy/config/database.yml +25 -0
  90. data/test/dummy/config/environment.rb +5 -0
  91. data/test/dummy/config/environments/development.rb +45 -0
  92. data/test/dummy/config/environments/production.rb +80 -0
  93. data/test/dummy/config/environments/test.rb +49 -0
  94. data/test/dummy/config/initializers/assets.rb +8 -0
  95. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  96. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  97. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  98. data/test/dummy/config/initializers/inflections.rb +16 -0
  99. data/test/dummy/config/initializers/mime_types.rb +4 -0
  100. data/test/dummy/config/initializers/session_store.rb +3 -0
  101. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  102. data/test/dummy/config/locales/en.yml +23 -0
  103. data/test/dummy/config/routes.rb +5 -0
  104. data/test/dummy/config/secrets.yml +22 -0
  105. data/test/dummy/db/migrate/20141117214323_create_users.rb +10 -0
  106. data/test/dummy/db/schema.rb +75 -0
  107. data/test/dummy/log/development.log +131 -0
  108. data/test/dummy/log/test.log +25961 -0
  109. data/test/dummy/public/404.html +67 -0
  110. data/test/dummy/public/422.html +67 -0
  111. data/test/dummy/public/500.html +66 -0
  112. data/test/dummy/public/favicon.ico +0 -0
  113. data/test/dummy/tmp/cache/assets/test/sass/0b69f7cc441d56def3a51688e6a7a8474dc476d1/proclaim.css.scssc +0 -0
  114. data/test/dummy/tmp/cache/assets/test/sass/12a97df611d5fb0e395afda829edf8b9372acde7/comments.css.scssc +0 -0
  115. data/test/dummy/tmp/cache/assets/test/sass/12a97df611d5fb0e395afda829edf8b9372acde7/images.scssc +0 -0
  116. data/test/dummy/tmp/cache/assets/test/sass/12a97df611d5fb0e395afda829edf8b9372acde7/posts.css.scssc +0 -0
  117. data/test/dummy/tmp/cache/assets/test/sass/12a97df611d5fb0e395afda829edf8b9372acde7/subscriptions.css.scssc +0 -0
  118. data/test/dummy/tmp/cache/assets/test/sprockets/04adcece63bc645379e6de797e7998f8 +0 -0
  119. data/test/dummy/tmp/cache/assets/test/sprockets/06620fc450f0a9b4a482a7bc08387711 +0 -0
  120. data/test/dummy/tmp/cache/assets/test/sprockets/076dd0d567a92c34163b3b98af1d48ba +0 -0
  121. data/test/dummy/tmp/cache/assets/test/sprockets/09fc2eadf6d6062b2cc135a44e4e73db +0 -0
  122. data/test/dummy/tmp/cache/assets/test/sprockets/09fe8c62e8ae706e01058b4b4d056c8e +0 -0
  123. data/test/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  124. data/test/dummy/tmp/cache/assets/test/sprockets/142fd040033525acb73ad2ccf1406aea +0 -0
  125. data/test/dummy/tmp/cache/assets/test/sprockets/1762aeeaf38da3b8d989a5b66b088004 +0 -0
  126. data/test/dummy/tmp/cache/assets/test/sprockets/194ac1a695334e303516614579b3926d +0 -0
  127. data/test/dummy/tmp/cache/assets/test/sprockets/197ea008934db3e7ea8045302d206b92 +0 -0
  128. data/test/dummy/tmp/cache/assets/test/sprockets/19eba2635fec0895379c3e38f81ada84 +0 -0
  129. data/test/dummy/tmp/cache/assets/test/sprockets/1c2ebe72fcd7ff1379a561552ca30f85 +0 -0
  130. data/test/dummy/tmp/cache/assets/test/sprockets/1f42c80faacb651f670ec2b0998e49dc +0 -0
  131. data/test/dummy/tmp/cache/assets/test/sprockets/2243230e778a749ecbf0415a52e75be0 +0 -0
  132. data/test/dummy/tmp/cache/assets/test/sprockets/23ad87e715c70312aa61dde4fbb4bfe1 +0 -0
  133. data/test/dummy/tmp/cache/assets/test/sprockets/245b8735db4ea90bcaa91c011a1f447e +0 -0
  134. data/test/dummy/tmp/cache/assets/test/sprockets/26a42dac0cec64483f4126d2de4b0c9e +0 -0
  135. data/test/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  136. data/test/dummy/tmp/cache/assets/test/sprockets/30151c8f6d93717f06fa12774612ddf4 +0 -0
  137. data/test/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  138. data/test/dummy/tmp/cache/assets/test/sprockets/3c623d200214a5334aaf170537db087f +0 -0
  139. data/test/dummy/tmp/cache/assets/test/sprockets/3ec36650a50759fd4b75794cb253936f +0 -0
  140. data/test/dummy/tmp/cache/assets/test/sprockets/40431cdcc10c75ba1f275ecfe42623d3 +0 -0
  141. data/test/dummy/tmp/cache/assets/test/sprockets/4226218a4b06608115b21063353370ea +0 -0
  142. data/test/dummy/tmp/cache/assets/test/sprockets/437901953eb8707af6c27ca59cf65d91 +0 -0
  143. data/test/dummy/tmp/cache/assets/test/sprockets/461885b8ad31ef6a94c9a4f2e332b7eb +0 -0
  144. data/test/dummy/tmp/cache/assets/test/sprockets/4792f46317cda92ccd5b278ec61f9ac5 +0 -0
  145. data/test/dummy/tmp/cache/assets/test/sprockets/4dcb3434b91b1c62f897a1741c6d398b +0 -0
  146. data/test/dummy/tmp/cache/assets/test/sprockets/5101cda93cf70f0fc0837713be587780 +0 -0
  147. data/test/dummy/tmp/cache/assets/test/sprockets/52d8c61de0703e0d7cf97d0f7b0cca7a +0 -0
  148. data/test/dummy/tmp/cache/assets/test/sprockets/57f3d19a9bd484ac68c46f962a8684b2 +0 -0
  149. data/test/dummy/tmp/cache/assets/test/sprockets/587e7c1332c8d8b69746dd85164e2cef +0 -0
  150. data/test/dummy/tmp/cache/assets/test/sprockets/5934d5d0d1ac6657842708e85c73cf51 +0 -0
  151. data/test/dummy/tmp/cache/assets/test/sprockets/5af081799d7da2f04ead6a516c6015ad +0 -0
  152. data/test/dummy/tmp/cache/assets/test/sprockets/69ee5af8d9a655898a67bc538ca1c7e7 +0 -0
  153. data/test/dummy/tmp/cache/assets/test/sprockets/6d1c56259648b0383bc438c875a448c3 +0 -0
  154. data/test/dummy/tmp/cache/assets/test/sprockets/6e7de35055967df848aa490830043e51 +0 -0
  155. data/test/dummy/tmp/cache/assets/test/sprockets/70bc59560ee544af7bb2f727247db307 +0 -0
  156. data/test/dummy/tmp/cache/assets/test/sprockets/728cb566999910549092ff0a98e2853b +0 -0
  157. data/test/dummy/tmp/cache/assets/test/sprockets/72b5f0d35e9d69b744a156edad98f983 +0 -0
  158. data/test/dummy/tmp/cache/assets/test/sprockets/72ffa34d552e3fd02f28a6f845a5ac5b +0 -0
  159. data/test/dummy/tmp/cache/assets/test/sprockets/7369d324e84bc872c42b3e717ff4ad6c +0 -0
  160. data/test/dummy/tmp/cache/assets/test/sprockets/749a8b0e45b11df748a256dd04ceb1f7 +0 -0
  161. data/test/dummy/tmp/cache/assets/test/sprockets/77fb9f62552d9b786f9407ef11cc9a09 +0 -0
  162. data/test/dummy/tmp/cache/assets/test/sprockets/797823842565e01fc989ad8df0bd4254 +0 -0
  163. data/test/dummy/tmp/cache/assets/test/sprockets/7c139afa2296ac17483520109aecd449 +0 -0
  164. data/test/dummy/tmp/cache/assets/test/sprockets/7fb99e2b35af65c4f58bfb92dd4185b4 +0 -0
  165. data/test/dummy/tmp/cache/assets/test/sprockets/819de31c63b704f9ddf4865587a91d41 +0 -0
  166. data/test/dummy/tmp/cache/assets/test/sprockets/8604b464bf846e5223da37ef2f29b524 +0 -0
  167. data/test/dummy/tmp/cache/assets/test/sprockets/88fc815613b473e98e9307b1d423918d +0 -0
  168. data/test/dummy/tmp/cache/assets/test/sprockets/8bc4341aa4060b8646e8134722cf3b11 +0 -0
  169. data/test/dummy/tmp/cache/assets/test/sprockets/8cf8fd5ff8eae12211a88f971af30236 +0 -0
  170. data/test/dummy/tmp/cache/assets/test/sprockets/8da3b4a9f17aafff49eb263bdb758f44 +0 -0
  171. data/test/dummy/tmp/cache/assets/test/sprockets/9168e513bae02f041dbb806d6dbe94ac +0 -0
  172. data/test/dummy/tmp/cache/assets/test/sprockets/920c1322be1212a54b7c4f2751d5e7bf +0 -0
  173. data/test/dummy/tmp/cache/assets/test/sprockets/92205679a36afd387a2ba5c585a5a62c +0 -0
  174. data/test/dummy/tmp/cache/assets/test/sprockets/940566ebcae2d4e5c56a881ab66f2cf0 +0 -0
  175. data/test/dummy/tmp/cache/assets/test/sprockets/976967e07e2944a7ecc7403667f1f96b +0 -0
  176. data/test/dummy/tmp/cache/assets/test/sprockets/99bdde70cefa71745279232be575f14e +0 -0
  177. data/test/dummy/tmp/cache/assets/test/sprockets/9a8e402a7e32063e46647403b43553a5 +0 -0
  178. data/test/dummy/tmp/cache/assets/test/sprockets/9b09ad72f8cc33503878b01c713d92d0 +0 -0
  179. data/test/dummy/tmp/cache/assets/test/sprockets/a20dbdfebf37fe50e832a6273c972553 +0 -0
  180. data/test/dummy/tmp/cache/assets/test/sprockets/a3c6189fad6cb9ae955f6d5a43a61d51 +0 -0
  181. data/test/dummy/tmp/cache/assets/test/sprockets/abb54e11ff057a3e22a5a97d27cc4fa3 +0 -0
  182. data/test/dummy/tmp/cache/assets/test/sprockets/ad18e3875541d4298b1df133d494b93f +0 -0
  183. data/test/dummy/tmp/cache/assets/test/sprockets/b9b7c575c22943d49734d52381c5ee16 +0 -0
  184. data/test/dummy/tmp/cache/assets/test/sprockets/ba269a52f100d3d6cffda81e82e1ed49 +0 -0
  185. data/test/dummy/tmp/cache/assets/test/sprockets/bc7a0846b4881b0832d41de2b1724dba +0 -0
  186. data/test/dummy/tmp/cache/assets/test/sprockets/bcb2df87f9611d3cc3ef8a5575e54fb8 +0 -0
  187. data/test/dummy/tmp/cache/assets/test/sprockets/bcf33791d3286af3ba2cdf6a6756c89e +0 -0
  188. data/test/dummy/tmp/cache/assets/test/sprockets/be32d0a530ce861537d6abfa41333df9 +0 -0
  189. data/test/dummy/tmp/cache/assets/test/sprockets/c8270a6f07dccc5f00e6b2b43f10efd2 +0 -0
  190. data/test/dummy/tmp/cache/assets/test/sprockets/cd82cd410a50bffcfb6e21e3c49a85c9 +0 -0
  191. data/test/dummy/tmp/cache/assets/test/sprockets/ce4ccaa06bdee6426486224bc7e54187 +0 -0
  192. data/test/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  193. data/test/dummy/tmp/cache/assets/test/sprockets/d0bdb8592e4eed80aa2341e37f20dbc9 +0 -0
  194. data/test/dummy/tmp/cache/assets/test/sprockets/d4b784b16fa1b1dfcca6590689a8c157 +0 -0
  195. data/test/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  196. data/test/dummy/tmp/cache/assets/test/sprockets/d968bd38a69bbf5c0065e2df3d30cfd3 +0 -0
  197. data/test/dummy/tmp/cache/assets/test/sprockets/daa4d4b8a5ce46d6c4ecf031e0c61cfe +0 -0
  198. data/test/dummy/tmp/cache/assets/test/sprockets/dc2effd195334219a7e4acfdc7ec7974 +0 -0
  199. data/test/dummy/tmp/cache/assets/test/sprockets/de36ab6c3b1a9b62a586d98373dd569c +0 -0
  200. data/test/dummy/tmp/cache/assets/test/sprockets/e3aec457d5c753090d6521f2bb2d91b6 +0 -0
  201. data/test/dummy/tmp/cache/assets/test/sprockets/e8d6158b1fed2f574242b55856a3953d +0 -0
  202. data/test/dummy/tmp/cache/assets/test/sprockets/ea82f6aececcf81eef3e2e15a9225e66 +0 -0
  203. data/test/dummy/tmp/cache/assets/test/sprockets/ed9f5c17f71ec75de10b1bb029ebd7a2 +0 -0
  204. data/test/dummy/tmp/cache/assets/test/sprockets/f2984adaeaa5322e3a040705c6d40622 +0 -0
  205. data/test/dummy/tmp/cache/assets/test/sprockets/f62fd0cf9f5e7e077ec9c4daeccb06ae +0 -0
  206. data/test/dummy/tmp/cache/assets/test/sprockets/f78ea69bdbba5738c052e9eb04e6c208 +0 -0
  207. data/test/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  208. data/test/dummy/tmp/cache/assets/test/sprockets/f864e553f706456dbdf168319970ec2e +0 -0
  209. data/test/dummy/tmp/cache/assets/test/sprockets/fb0f641bfcbb0101c040da9ff736447b +0 -0
  210. data/test/dummy/tmp/cache/assets/test/sprockets/fe426a44cf23cf82032091cbffff898c +0 -0
  211. data/test/dummy/tmp/cache/assets/test/sprockets/ff732ea47a86c449582b2a81ef2930da +0 -0
  212. data/test/dummy/tmp/cache/assets/test/sprockets/ffc4980851addaacf12abeebfa63e07f +0 -0
  213. data/test/dummy/tmp/generators/config/initializers/proclaim.rb +22 -0
  214. data/test/factories/proclaim/comment.rb +11 -0
  215. data/test/factories/proclaim/image.rb +6 -0
  216. data/test/factories/proclaim/post.rb +14 -0
  217. data/test/factories/proclaim/subscription.rb +13 -0
  218. data/test/factories/user.rb +6 -0
  219. data/test/helpers/proclaim/comments_helper_test.rb +6 -0
  220. data/test/helpers/proclaim/posts_helper_test.rb +6 -0
  221. data/test/helpers/proclaim/subscriptions_helper_test.rb +6 -0
  222. data/test/integration/with_javascript/comment_test.rb +353 -0
  223. data/test/integration/with_javascript/post_form_test.rb +179 -0
  224. data/test/integration/with_javascript/post_subscription_test.rb +273 -0
  225. data/test/integration/without_javascript/blog_subscription_test.rb +87 -0
  226. data/test/integration/without_javascript/post_test.rb +140 -0
  227. data/test/integration/without_javascript/subscription_email_test.rb +95 -0
  228. data/test/integration/without_javascript/unsubscribe_test.rb +32 -0
  229. data/test/mailers/previews/proclaim/subscription_mailer_preview.rb +22 -0
  230. data/test/mailers/proclaim/subscription_mailer_test.rb +87 -0
  231. data/test/models/proclaim/comment_test.rb +41 -0
  232. data/test/models/proclaim/image_test.rb +70 -0
  233. data/test/models/proclaim/post_test.rb +127 -0
  234. data/test/models/proclaim/subscription_test.rb +66 -0
  235. data/test/policies/proclaim/comment_policy_test.rb +71 -0
  236. data/test/policies/proclaim/post_policy_test.rb +87 -0
  237. data/test/policies/proclaim/subscription_policy_test.rb +91 -0
  238. data/test/proclaim_test.rb +7 -0
  239. data/test/support/images/test.jpg +0 -0
  240. data/test/support/pages/posts/edit_page.rb +5 -0
  241. data/test/support/pages/posts/show_page.rb +47 -0
  242. data/test/support/wait_for_ajax.rb +11 -0
  243. data/test/test_helper.rb +56 -0
  244. data/vendor/assets/images/link.png +0 -0
  245. data/vendor/assets/images/remove.png +0 -0
  246. data/vendor/assets/images/resize-bigger.png +0 -0
  247. data/vendor/assets/images/resize-smaller.png +0 -0
  248. data/vendor/assets/images/unlink.png +0 -0
  249. data/vendor/assets/javascripts/addons/medium-editor-insert-embeds.js +197 -0
  250. data/vendor/assets/javascripts/addons/medium-editor-insert-embeds.min.js +10 -0
  251. data/vendor/assets/javascripts/addons/medium-editor-insert-images.js +572 -0
  252. data/vendor/assets/javascripts/addons/medium-editor-insert-images.min.js +10 -0
  253. data/vendor/assets/javascripts/addons/medium-editor-insert-maps.js +50 -0
  254. data/vendor/assets/javascripts/addons/medium-editor-insert-maps.min.js +10 -0
  255. data/vendor/assets/javascripts/addons/medium-editor-insert-plugin.js +496 -0
  256. data/vendor/assets/javascripts/addons/medium-editor-insert-plugin.min.js +10 -0
  257. data/vendor/assets/javascripts/addons/medium-editor-insert-tables.js +132 -0
  258. data/vendor/assets/javascripts/addons/medium-editor-insert-tables.min.js +10 -0
  259. data/vendor/assets/javascripts/medium-editor-insert-plugin.all.js +1415 -0
  260. data/vendor/assets/javascripts/medium-editor-insert-plugin.all.min.js +10 -0
  261. data/vendor/assets/stylesheets/medium-editor-insert-plugin-frontend.css +55 -0
  262. data/vendor/assets/stylesheets/medium-editor-insert-plugin-frontend.min.css +10 -0
  263. data/vendor/assets/stylesheets/medium-editor-insert-plugin.css +277 -0
  264. data/vendor/assets/stylesheets/medium-editor-insert-plugin.min.css +10 -0
  265. metadata +791 -0
@@ -0,0 +1,87 @@
1
+ require 'test_helper'
2
+
3
+ class BlogSubscriptionTest < ActionDispatch::IntegrationTest
4
+ setup do
5
+ ApplicationController.any_instance.stubs(:current_user).returns(nil)
6
+ ApplicationController.any_instance.stubs(:authenticate_user).returns(false)
7
+
8
+ ActionMailer::Base.deliveries.clear
9
+ end
10
+
11
+ test "should be able to create new blog subscription while logged in" do
12
+ user = FactoryGirl.create(:user)
13
+ sign_in user
14
+
15
+ visit proclaim.new_subscription_path
16
+
17
+ within('#new_subscription') do
18
+ fill_in 'Email', with: "example@example.com"
19
+ fill_in 'What is', with: antispam_solution
20
+ end
21
+
22
+ assert_difference('Proclaim::Subscription.count', 1,
23
+ "Should have successfully created subscription!") do
24
+ find('#new_subscription input[type=submit]').click
25
+ end
26
+
27
+ assert page.has_text?("Welcome"), "Should be shown the welcome page!"
28
+ end
29
+
30
+ test "should be able to create new blog subscription while not logged in" do
31
+ visit proclaim.new_subscription_path
32
+
33
+ within('#new_subscription') do
34
+ fill_in 'Email', with: "example@example.com"
35
+ fill_in 'What is', with: antispam_solution
36
+ end
37
+
38
+ assert_difference('Proclaim::Subscription.count', 1,
39
+ "Should have successfully created subscription!") do
40
+ find('#new_subscription input[type=submit]').click
41
+ end
42
+
43
+ assert page.has_text?("Welcome"), "Should be shown the welcome page!"
44
+ end
45
+
46
+ test "should not be able to create new blog subscription if spammy" do
47
+ user = FactoryGirl.create(:user)
48
+ sign_in user
49
+
50
+ visit proclaim.new_subscription_path
51
+
52
+ within('#new_subscription') do
53
+ fill_in 'Email', with: "example@example.com"
54
+ fill_in 'What is', with: "wrong answer"
55
+ end
56
+
57
+ assert_no_difference('Proclaim::Subscription.count',
58
+ "Should have failed antispam questions!") do
59
+ find('#new_subscription input[type=submit]').click
60
+ end
61
+
62
+ assert page.has_css?('div#error_explanation'),
63
+ "Should be shown errors since the antispam questions failed!"
64
+ end
65
+
66
+ test "catch bad email address" do
67
+ visit proclaim.new_subscription_path
68
+
69
+ within('#new_subscription') do
70
+ fill_in 'Email', with: "bad_email_address"
71
+ fill_in 'What is', with: antispam_solution
72
+ end
73
+
74
+ assert_no_difference('Proclaim::Subscription.count',
75
+ "Should have caught bad email address!") do
76
+ find('#new_subscription input[type=submit]').click
77
+ end
78
+
79
+ assert page.has_css?('div#error_explanation')
80
+ end
81
+
82
+ private
83
+
84
+ def antispam_solution
85
+ find('input#antispam_solution', visible: false).value
86
+ end
87
+ end
@@ -0,0 +1,140 @@
1
+ require 'test_helper'
2
+
3
+ class PostTest < ActionDispatch::IntegrationTest
4
+ setup do
5
+ ApplicationController.any_instance.stubs(:current_user).returns(nil)
6
+ ApplicationController.any_instance.stubs(:authenticate_user).returns(false)
7
+
8
+ @edit_page = EditPage.new
9
+ end
10
+
11
+ test "index should give option to create new post if logged in" do
12
+ user = FactoryGirl.create(:user)
13
+ sign_in user
14
+
15
+ visit proclaim.posts_path
16
+
17
+ assert page.has_css? "a", text: "New Post"
18
+ end
19
+
20
+ test "index should not give option to create new post if not logged in" do
21
+ visit proclaim.posts_path
22
+
23
+ assert page.has_no_css? "a", text: "New Post"
24
+ end
25
+
26
+ test "index should give option to edit post if logged in" do
27
+ user = FactoryGirl.create(:user)
28
+ sign_in user
29
+
30
+ post = FactoryGirl.create(:published_post)
31
+
32
+ visit proclaim.posts_path
33
+
34
+ assert page.has_css? "a", text: "Edit"
35
+ end
36
+
37
+ test "index should not give option to edit post if not logged in" do
38
+ post = FactoryGirl.create(:published_post)
39
+
40
+ visit proclaim.posts_path
41
+
42
+ assert page.has_no_css? "a", text: "Edit"
43
+ end
44
+
45
+ test "index should give option to delete post if logged in" do
46
+ user = FactoryGirl.create(:user)
47
+ sign_in user
48
+
49
+ post = FactoryGirl.create(:published_post)
50
+
51
+ visit proclaim.posts_path
52
+
53
+ assert page.has_css? "a", text: "Delete"
54
+ end
55
+
56
+ test "index should not give option to delete post if not logged in" do
57
+ post = FactoryGirl.create(:published_post)
58
+
59
+ visit proclaim.posts_path
60
+
61
+ assert page.has_no_css? "a", text: "Delete"
62
+ end
63
+
64
+ test "index should show post titles" do
65
+ post1 = FactoryGirl.create(:published_post)
66
+ post2 = FactoryGirl.create(:published_post)
67
+
68
+ visit proclaim.posts_path
69
+
70
+ assert page.has_text? post1.title
71
+ assert page.has_text? post2.title
72
+ end
73
+
74
+ test "index should show authors" do
75
+ post1 = FactoryGirl.create(:published_post)
76
+ post2 = FactoryGirl.create(:published_post)
77
+
78
+ visit proclaim.posts_path
79
+
80
+ assert page.has_text? post1.author.send(Proclaim.author_name_method)
81
+ assert page.has_text? post2.author.send(Proclaim.author_name_method)
82
+ end
83
+
84
+ test "index should show excerpts" do
85
+ post1Body = Faker::Lorem.paragraph(50)
86
+
87
+ post1 = FactoryGirl.create(:published_post,
88
+ body: post1Body)
89
+ post2 = FactoryGirl.create(:published_post,
90
+ body: "foo")
91
+
92
+ visit proclaim.posts_path
93
+
94
+ post1RenderedBody = page.find("#post_#{post1.id} span.excerpt")
95
+ post2RenderedBody = page.find("#post_#{post2.id} span.excerpt")
96
+
97
+ # Make sure the render text from the post is only the excerpt-- no more
98
+ assert_equal post1.excerpt, post1RenderedBody.text
99
+ assert_equal post2.body, post2RenderedBody.text
100
+ end
101
+
102
+ test "index should show more link" do
103
+ post1Body = Faker::Lorem.paragraph(50)
104
+
105
+ post1 = FactoryGirl.create(:published_post,
106
+ body: post1Body)
107
+ post2 = FactoryGirl.create(:published_post,
108
+ body: "foo")
109
+
110
+ visit proclaim.posts_path
111
+
112
+ assert page.has_css?("#post_#{post1.id} a", text: "(more)"),
113
+ "Post 1 should contain a link to view more"
114
+ assert page.has_no_css?("#post_#{post2.id} a", text: "(more)"),
115
+ "Post 2 should not contain a link to see more"
116
+ end
117
+
118
+ test "show should show author name" do
119
+ post = FactoryGirl.create(:published_post)
120
+
121
+ visit proclaim.post_path(post)
122
+
123
+ assert page.has_text? post.author.send(Proclaim.author_name_method)
124
+ end
125
+
126
+ test "image should have relative source path" do
127
+ user = FactoryGirl.create(:user)
128
+ sign_in user
129
+
130
+ image = FactoryGirl.create(:image)
131
+ image.post.body = @edit_page.medium_inserted_image_html(image)
132
+ image.post.save
133
+
134
+ image_tags = Nokogiri::HTML.fragment(image.post.body).css("img")
135
+
136
+ assert_equal 1, image_tags.length
137
+ refute_match root_url, image_tags[0].attribute("src"),
138
+ "Images should have relative paths"
139
+ end
140
+ end
@@ -0,0 +1,95 @@
1
+ require 'test_helper'
2
+
3
+ class SubscriptionEmailTest < ActionDispatch::IntegrationTest
4
+ setup do
5
+ ApplicationController.any_instance.stubs(:current_user).returns(nil)
6
+ ApplicationController.any_instance.stubs(:authenticate_user).returns(false)
7
+
8
+ ActionMailer::Base.deliveries.clear
9
+ end
10
+
11
+ test "should email welcome to post subscriber upon subscription" do
12
+ post = FactoryGirl.create(:published_post)
13
+ subscription = FactoryGirl.create(:subscription, post: post)
14
+
15
+ # Make sure subscriber was sent a welcome email
16
+ assert_equal [subscription.email], ActionMailer::Base.deliveries.last.to
17
+ assert_match "Welcome", ActionMailer::Base.deliveries.last.subject
18
+ end
19
+
20
+ test "should email notification to post subscriber when new comment is made" do
21
+ post = FactoryGirl.create(:published_post)
22
+ subscription = FactoryGirl.create(:subscription, post: post)
23
+
24
+ # Clear out emails-- new subscription probably sent a welcome email
25
+ ActionMailer::Base.deliveries.clear
26
+
27
+ comment = FactoryGirl.create(:comment, post: post)
28
+
29
+ # Make sure subscriber was notified of new comment
30
+ assert_equal [subscription.email], ActionMailer::Base.deliveries.last.to
31
+ assert_equal "New Comment On \"#{post.title}\"", ActionMailer::Base.deliveries.last.subject
32
+ end
33
+
34
+ test "should not email post subscriber when old comment is edited" do
35
+ post = FactoryGirl.create(:published_post)
36
+ subscription = FactoryGirl.create(:subscription, post: post)
37
+ comment = FactoryGirl.create(:comment, post: post)
38
+
39
+ # Clear out emails that were just sent
40
+ ActionMailer::Base.deliveries.clear
41
+
42
+ comment.author = "Edit Author"
43
+ comment.body = "Edit Body"
44
+ comment.save
45
+
46
+ # Make sure no email was sent after update
47
+ assert_empty ActionMailer::Base.deliveries
48
+ end
49
+
50
+ test "should email notification to blog subscriber when post is published" do
51
+ subscription = FactoryGirl.create(:subscription)
52
+
53
+ # Clear out emails-- new subscription probably sent a welcome email
54
+ ActionMailer::Base.deliveries.clear
55
+
56
+ post = FactoryGirl.create(:published_post)
57
+
58
+ # Make sure subscriber was notified of new post
59
+ assert_equal [subscription.email], ActionMailer::Base.deliveries.last.to
60
+ assert_equal "New Post: #{post.title}", ActionMailer::Base.deliveries.last.subject
61
+ end
62
+
63
+ test "should not email notification to blog subscriber when post is updated" do
64
+ subscription = FactoryGirl.create(:subscription)
65
+ post = FactoryGirl.create(:published_post)
66
+
67
+ # Clear out all emails
68
+ ActionMailer::Base.deliveries.clear
69
+
70
+ post.title = "Edit Title"
71
+ post.body = "Edit Body"
72
+
73
+ # Make sure no email was sent after update
74
+ assert_empty ActionMailer::Base.deliveries
75
+ end
76
+
77
+ test "should not email notification to blog subscriber if post is not published" do
78
+ subscription = FactoryGirl.create(:subscription)
79
+
80
+ # Clear out emails-- new subscription probably sent a welcome email
81
+ ActionMailer::Base.deliveries.clear
82
+
83
+ post = FactoryGirl.create(:post)
84
+
85
+ # Make sure no email was sent after update
86
+ assert_empty ActionMailer::Base.deliveries
87
+
88
+ post.publish
89
+ assert post.save
90
+
91
+ # Make sure subscriber was notified of newly published post
92
+ assert_equal [subscription.email], ActionMailer::Base.deliveries.last.to
93
+ assert_equal "New Post: #{post.title}", ActionMailer::Base.deliveries.last.subject
94
+ end
95
+ end
@@ -0,0 +1,32 @@
1
+ require 'test_helper'
2
+
3
+ class UnsubscribeTest < ActionDispatch::IntegrationTest
4
+ setup do
5
+ ApplicationController.any_instance.stubs(:current_user).returns(nil)
6
+ ApplicationController.any_instance.stubs(:authenticate_user).returns(false)
7
+ end
8
+
9
+ test "should be able to unsubscribe from blog" do
10
+ subscription = FactoryGirl.create(:subscription)
11
+
12
+ visit proclaim.unsubscribe_path(subscription.token)
13
+
14
+ assert_difference('Proclaim::Subscription.count', -1) do
15
+ click_link "unsubscribe"
16
+ end
17
+
18
+ assert_equal proclaim.unsubscribed_path, current_path
19
+ end
20
+
21
+ test "should be able to unsubscribe from post" do
22
+ subscription = FactoryGirl.create(:published_post_subscription)
23
+
24
+ visit proclaim.unsubscribe_path(subscription.token)
25
+
26
+ assert_difference('Proclaim::Subscription.count', -1) do
27
+ click_link "unsubscribe"
28
+ end
29
+
30
+ assert_equal proclaim.unsubscribed_path, current_path
31
+ end
32
+ end
@@ -0,0 +1,22 @@
1
+ module Proclaim
2
+ # Preview all emails at http://localhost:3000/rails/mailers/subscription_mailer
3
+ class SubscriptionMailerPreview < ActionMailer::Preview
4
+ def welcome_email
5
+ subscription = Subscription.first
6
+ SubscriptionMailer.welcome_email(subscription)
7
+ end
8
+
9
+ def new_post_notification_email
10
+ subscription = Subscription.first
11
+ post = Post.first
12
+ SubscriptionMailer.new_post_notification_email(subscription, post)
13
+ end
14
+
15
+ def new_comment_notification_email
16
+ subscription = Subscription.where("post_id <> ''").first
17
+ comment = subscription.post.comments.first
18
+
19
+ SubscriptionMailer.new_comment_notification_email(subscription, comment)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,87 @@
1
+ require 'test_helper'
2
+
3
+ module Proclaim
4
+ class SubscriptionMailerTest < ActionMailer::TestCase
5
+ include Rails.application.routes.url_helpers
6
+ include Rails.application.routes.mounted_helpers
7
+
8
+ def default_url_options
9
+ Rails.application.config.action_mailer.default_url_options
10
+ end
11
+
12
+ setup do
13
+ @edit_page = EditPage.new
14
+ end
15
+
16
+ test "welcome email" do
17
+ subscription = FactoryGirl.create(:subscription)
18
+
19
+ mail = SubscriptionMailer.welcome_email(subscription)
20
+ assert_match "Welcome", mail.subject
21
+ assert_equal [subscription.email], mail.to
22
+ assert_equal ["from@example.com"], mail.from
23
+ assert_equal 2, mail.body.parts.length # Ensure multipart: text and HTML
24
+
25
+ # Verify the email includes an unsubscription URL
26
+ assert_match proclaim.unsubscribe_url(subscription.token), get_text_part(mail)
27
+ assert_match proclaim.unsubscribe_url(subscription.token), get_html_part(mail)
28
+ end
29
+
30
+ test "new comment notification email" do
31
+ subscription = FactoryGirl.create(:post_subscription)
32
+ comment = FactoryGirl.create(:comment)
33
+
34
+ mail = SubscriptionMailer.new_comment_notification_email(subscription, comment)
35
+ assert_equal "New Comment On \"#{comment.post.title}\"", mail.subject
36
+ assert_equal [subscription.email], mail.to
37
+ assert_equal ["from@example.com"], mail.from
38
+ assert_equal 2, mail.body.parts.length # Ensure multipart: text and HTML
39
+
40
+ # Verify the email includes an unsubscription URL
41
+ assert_match proclaim.unsubscribe_url(subscription.token), get_text_part(mail)
42
+ assert_match proclaim.unsubscribe_url(subscription.token), get_html_part(mail)
43
+ end
44
+
45
+ test "new post notification email" do
46
+ subscription = FactoryGirl.create(:subscription)
47
+ post = FactoryGirl.create(:published_post)
48
+
49
+ mail = SubscriptionMailer.new_post_notification_email(subscription, post)
50
+ assert_equal "New Post: #{post.title}", mail.subject
51
+ assert_equal [subscription.email], mail.to
52
+ assert_equal ["from@example.com"], mail.from
53
+ assert_equal 2, mail.body.parts.length # Ensure multipart: text and HTML
54
+
55
+ # Verify the email includes an unsubscription URL
56
+ assert_match proclaim.unsubscribe_url(subscription.token), get_text_part(mail)
57
+ assert_match proclaim.unsubscribe_url(subscription.token), get_html_part(mail)
58
+ end
59
+
60
+ test "images in new post notification email should have absolute URLs" do
61
+ subscription = FactoryGirl.create(:subscription)
62
+
63
+ image = FactoryGirl.create(:image)
64
+ image.post.body = @edit_page.medium_inserted_image_html(image)
65
+ image.post.publish
66
+ image.post.save
67
+
68
+ mail = SubscriptionMailer.new_post_notification_email(subscription, image.post)
69
+
70
+ image_tags = Nokogiri::HTML(get_html_part(mail)).css("img")
71
+
72
+ assert_equal 1, image_tags.length
73
+ assert_match root_url, image_tags[0].attribute("src"),
74
+ "Images should have absolute URLs in emails"
75
+ end
76
+
77
+ private
78
+
79
+ def get_text_part(mail)
80
+ mail.body.parts.find {|p| p.content_type.match /plain/}.body.raw_source
81
+ end
82
+
83
+ def get_html_part(mail)
84
+ mail.body.parts.find {|p| p.content_type.match /html/}.body.raw_source
85
+ end
86
+ end
87
+ end