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,67 @@
1
+ require_dependency "proclaim/application_controller"
2
+
3
+ module Proclaim
4
+ class SubscriptionsController < ApplicationController
5
+ after_action :verify_authorized, except: [:subscribed, :unsubscribed]
6
+ before_action :set_subscription, only: [:unsubscribe, :destroy]
7
+
8
+ def new
9
+ @subscription = Subscription.new
10
+ authorize @subscription
11
+ end
12
+
13
+ def subscribed
14
+ end
15
+
16
+ def unsubscribe
17
+ authorize @subscription
18
+ end
19
+
20
+ def unsubscribed
21
+ end
22
+
23
+ def create
24
+ @subscription = Subscription.new(subscription_params)
25
+
26
+ authorize @subscription
27
+
28
+ if antispam_params[:answer] == antispam_params[:solution]
29
+ respond_to do |format|
30
+ if @subscription.save
31
+ format.html { redirect_to subscribed_path }
32
+ else
33
+ format.html { render :new }
34
+ end
35
+ end
36
+ else
37
+ @subscription.errors.add(:base, "Antispam question wasn't answered correctly")
38
+ respond_to do |format|
39
+ format.html { render :new }
40
+ end
41
+ end
42
+ end
43
+
44
+ def destroy
45
+ authorize @subscription
46
+
47
+ @subscription.destroy
48
+ redirect_to unsubscribed_path, notice: "Successfully unsubscribed."
49
+ end
50
+
51
+ private
52
+
53
+ def set_subscription
54
+ @subscription = Subscription.from_token(params[:token])
55
+ end
56
+
57
+ # Only allow a trusted parameter "white list" through.
58
+ def subscription_params
59
+ params.require(:subscription).permit(:email)
60
+ end
61
+
62
+ def antispam_params
63
+ params.require(:antispam).permit(:solution,
64
+ :answer)
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,34 @@
1
+ module Proclaim
2
+ module ApplicationHelper
3
+ def comments_tree_for(comments)
4
+ comments.map do |comment, nested_comments|
5
+ commentHtml = render(partial: "proclaim/comments/comment",
6
+ formats: [:html],
7
+ locals: {
8
+ comment: comment,
9
+ target: "#comment_#{comment.id}_replies"
10
+ })
11
+
12
+ nestedComments = ""
13
+ if nested_comments.size > 0
14
+ nestedComments = comments_tree_for(nested_comments)
15
+ end
16
+
17
+ repliesHtml = content_tag(:div, nestedComments,
18
+ id: "comment_#{comment.id}_replies",
19
+ class: "replies")
20
+
21
+ content_tag(:div, commentHtml + repliesHtml, class: "discussion")
22
+ end.join.html_safe
23
+ end
24
+
25
+ # def timeago(time, options = {})
26
+ # options[:class] ||= "timeago"
27
+ # if time
28
+ # content_tag(:time,
29
+ # time.to_s,
30
+ # options.merge(datetime: time.getutc.iso8601))
31
+ # end
32
+ # end
33
+ end
34
+ end
@@ -0,0 +1,4 @@
1
+ module Proclaim
2
+ module CommentsHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Proclaim
2
+ module ImagesHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Proclaim
2
+ module PostsHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Proclaim
2
+ module SubscriptionsHelper
3
+ end
4
+ end
@@ -0,0 +1,43 @@
1
+ module Proclaim
2
+ class SubscriptionMailer < ActionMailer::Base
3
+ default from: "from@example.com"
4
+
5
+ def welcome_email(subscription)
6
+ @subscription = subscription
7
+
8
+ message = Premailer.new(render_to_string, with_html_string: true, base_url: root_url)
9
+ base_url = root_url.gsub(/\A.*:\/\//, '').gsub(/\A(.*?)\/*\z/, '\1')
10
+
11
+ mail to: @subscription.email, subject: "Welcome to #{base_url}!" do |format|
12
+ format.html { message.to_inline_css }
13
+ format.text { message.to_plain_text }
14
+ end
15
+ end
16
+
17
+ def new_comment_notification_email(subscription, comment)
18
+ @subscription = subscription
19
+ @comment = comment
20
+
21
+ message = Premailer.new(render_to_string, with_html_string: true, base_url: root_url)
22
+
23
+ mail to: @subscription.email,
24
+ subject: "New Comment On \"#{@comment.post.title}\"" do |format|
25
+ format.html { message.to_inline_css }
26
+ format.text { message.to_plain_text }
27
+ end
28
+ end
29
+
30
+ def new_post_notification_email(subscription, post)
31
+ @subscription = subscription
32
+ @post = post
33
+
34
+ message = Premailer.new(render_to_string, with_html_string: true, base_url: root_url)
35
+
36
+ mail to: @subscription.email,
37
+ subject: "New Post: #{@post.title}" do |format|
38
+ format.html { message.to_inline_css }
39
+ format.text { message.to_plain_text }
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,35 @@
1
+ # == Schema Information
2
+ #
3
+ # Table name: proclaim_comments
4
+ #
5
+ # id :integer not null, primary key
6
+ # post_id :integer
7
+ # parent_id :integer
8
+ # author :string
9
+ # body :text
10
+ # created_at :datetime not null
11
+ # updated_at :datetime not null
12
+ #
13
+
14
+ module Proclaim
15
+ class Comment < ActiveRecord::Base
16
+ acts_as_tree order: 'created_at ASC', dependent: :destroy
17
+ belongs_to :post, inverse_of: :comments
18
+ after_initialize :maintainPost
19
+ after_create :notifyPostSubscribers
20
+
21
+ validates_presence_of :body, :author, :post
22
+
23
+ private
24
+
25
+ def maintainPost
26
+ if parent
27
+ self.post = parent.post
28
+ end
29
+ end
30
+
31
+ def notifyPostSubscribers
32
+ post.notifyPostSubscribers(self)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,19 @@
1
+ # == Schema Information
2
+ #
3
+ # Table name: proclaim_images
4
+ #
5
+ # id :integer not null, primary key
6
+ # post_id :integer
7
+ # image :string
8
+ # created_at :datetime not null
9
+ # updated_at :datetime not null
10
+ #
11
+
12
+ module Proclaim
13
+ class Image < ActiveRecord::Base
14
+ belongs_to :post, inverse_of: :images
15
+ mount_uploader :image, ImageUploader
16
+
17
+ validates_presence_of :post, :image
18
+ end
19
+ end
@@ -0,0 +1,133 @@
1
+ # == Schema Information
2
+ #
3
+ # Table name: proclaim_posts
4
+ #
5
+ # id :integer not null, primary key
6
+ # author_id :integer
7
+ # title :string default(""), not null
8
+ # body :text default(""), not null
9
+ # published :boolean default("f"), not null
10
+ # publication_date :datetime
11
+ # created_at :datetime not null
12
+ # updated_at :datetime not null
13
+ #
14
+
15
+ module Proclaim
16
+ class Post < ActiveRecord::Base
17
+ belongs_to :author, class_name: Proclaim.author_class
18
+ has_many :comments, inverse_of: :post, dependent: :destroy
19
+ has_many :subscriptions, inverse_of: :post, dependent: :destroy
20
+ has_many :images, inverse_of: :post, dependent: :destroy
21
+ accepts_nested_attributes_for :images, allow_destroy: true
22
+
23
+ include AASM
24
+
25
+ aasm column: :state, no_direct_assignment: true do
26
+ state :draft, initial: true
27
+ state :published
28
+
29
+ event :publish do
30
+ transitions from: :draft, to: :published
31
+
32
+ before do
33
+ self.published_at = DateTime.now
34
+ end
35
+ end
36
+ end
37
+
38
+ validates_presence_of :published_at, if: :published?
39
+ validates :published_at, absence: true, unless: :published?
40
+
41
+ validates_presence_of :title, :body, :author
42
+ validate :verifyBodyHtml
43
+
44
+ after_save :notifyBlogSubscribersIfPublished
45
+
46
+ attr_writer :excerpt_length
47
+ def excerpt_length
48
+ @excerpt_length || Proclaim.excerpt_length
49
+ end
50
+
51
+ def body_plaintext
52
+ Rails::Html::FullSanitizer.new.sanitize(body.gsub(/\r\n?/, ' '))
53
+ end
54
+
55
+ def excerpt
56
+ document = Nokogiri::HTML.fragment(body)
57
+
58
+ unless document.text.empty?
59
+ takeExcerptOf first_block_element_text(document)
60
+ else
61
+ ""
62
+ end
63
+ end
64
+
65
+ def notifyPostSubscribers(newComment)
66
+ subscriptions.each do | subscription |
67
+ subscription.deliver_new_comment_notification_email(newComment)
68
+ end
69
+ end
70
+
71
+ private
72
+
73
+ def verifyBodyHtml
74
+ if not errors.messages.include?(:body) and
75
+ body_plaintext.strip.empty? and
76
+ Nokogiri::HTML.fragment(body).css("img").empty?
77
+ errors.add :body, :empty
78
+ end
79
+ end
80
+
81
+ def takeExcerptOf(text)
82
+ if excerpt_length >= text.length
83
+ return text
84
+ end
85
+
86
+ excerpt = text.slice(0, excerpt_length)
87
+
88
+ if text.slice(excerpt_length) =~ /\s/
89
+ return excerpt.strip
90
+ end
91
+
92
+ # Make sure words aren't interrupted
93
+ excerpt.slice(0, excerpt.rindex(/\s/, excerpt.length)).strip
94
+ end
95
+
96
+ def first_block_element_text(nokogiri_node)
97
+ if nokogiri_node.text?
98
+ return block_element_text(nokogiri_node.parent)
99
+ end
100
+
101
+ nokogiri_node.children.each do |child|
102
+ result = first_block_element_text(child)
103
+ if result
104
+ return result
105
+ end
106
+ end
107
+
108
+ nil
109
+ end
110
+
111
+ def block_element_text(nokogiri_block_element)
112
+ text = String.new
113
+ nokogiri_block_element.children.each do | child |
114
+ if child.text? or (child.description.try(:inline?))
115
+ text += child.text
116
+ else
117
+ break # Stop at the first non-inline non-text element
118
+ end
119
+ end
120
+
121
+ return text
122
+ end
123
+
124
+ def notifyBlogSubscribersIfPublished
125
+ # If we just published this post, notify the subscribers
126
+ if published? and state_changed?
127
+ Subscription.blog_subscriptions.each do | subscription |
128
+ subscription.deliver_new_post_notification_email(self)
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,63 @@
1
+ # == Schema Information
2
+ #
3
+ # Table name: proclaim_subscriptions
4
+ #
5
+ # id :integer not null, primary key
6
+ # post_id :integer
7
+ # email :string
8
+ # created_at :datetime not null
9
+ # updated_at :datetime not null
10
+ #
11
+
12
+ module Proclaim
13
+ class Subscription < ActiveRecord::Base
14
+ scope :blog_subscriptions, -> { where(post_id: nil) }
15
+ belongs_to :post, inverse_of: :subscriptions
16
+
17
+ after_create :deliver_welcome_email
18
+
19
+ validates :email, uniqueness: { scope: :post_id, case_sensitive: false }, format: { with: /@/ }
20
+
21
+ # RFC-compliant email addresses are way nasty to match with regex, so why
22
+ # try? We'll be sending them an email anyway-- if they don't get it, they
23
+ # can re-subscribe. We'll just do an easy validation match here.
24
+ #validates_format_of :email, :with => /@/
25
+
26
+ # Subscriptions aren't required to belong to a post, but if we're given
27
+ # one it had better be valid
28
+ validates_presence_of :post, if: :post_id
29
+
30
+ def deliver_welcome_email
31
+ SubscriptionMailer.welcome_email(self).deliver_later
32
+ end
33
+
34
+ def deliver_new_post_notification_email(post)
35
+ SubscriptionMailer.new_post_notification_email(self, post).deliver_later
36
+ end
37
+
38
+ def deliver_new_comment_notification_email(comment)
39
+ SubscriptionMailer.new_comment_notification_email(self, comment).deliver_later
40
+ end
41
+
42
+ def token
43
+ Subscription.create_token(self)
44
+ end
45
+
46
+ def self.verifier
47
+ ActiveSupport::MessageVerifier.new(Rails.application.secrets.secret_key_base)
48
+ end
49
+
50
+ def self.from_token(token)
51
+ begin
52
+ id = verifier.verify(token)
53
+ Subscription.find_by_id(id)
54
+ rescue ActiveSupport::MessageVerifier::InvalidSignature
55
+ nil
56
+ end
57
+ end
58
+
59
+ def self.create_token(subscription)
60
+ verifier.generate(subscription.id)
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,53 @@
1
+ class ApplicationPolicy
2
+ attr_reader :user, :record
3
+
4
+ def initialize(user, record)
5
+ @user = user
6
+ @record = record
7
+ end
8
+
9
+ def index?
10
+ false
11
+ end
12
+
13
+ def show?
14
+ false
15
+ end
16
+
17
+ def create?
18
+ false
19
+ end
20
+
21
+ def new?
22
+ create?
23
+ end
24
+
25
+ def update?
26
+ false
27
+ end
28
+
29
+ def edit?
30
+ update?
31
+ end
32
+
33
+ def destroy?
34
+ false
35
+ end
36
+
37
+ def scope
38
+ Pundit.policy_scope!(user, record.class)
39
+ end
40
+
41
+ class Scope
42
+ attr_reader :user, :scope
43
+
44
+ def initialize(user, scope)
45
+ @user = user
46
+ @scope = scope
47
+ end
48
+
49
+ def resolve
50
+ scope
51
+ end
52
+ end
53
+ end