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,3 @@
1
+ # Place all the behaviors and hooks related to the matching controller here.
2
+ # All this logic will automatically be available in application.js.
3
+ # You can use CoffeeScript in this file: http://coffeescript.org/
@@ -0,0 +1,3 @@
1
+ # Place all the behaviors and hooks related to the matching controller here.
2
+ # All this logic will automatically be available in application.js.
3
+ # You can use CoffeeScript in this file: http://coffeescript.org/
@@ -0,0 +1,28 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any styles
10
+ * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
11
+ * file per style scope.
12
+ *
13
+ *= require font-awesome
14
+ *= require medium-editor/medium-editor
15
+ *= require medium-editor/themes/mani
16
+ *= require medium-editor-insert-plugin.min
17
+ *= require_tree .
18
+ *= require_self
19
+ */
20
+
21
+ div.loading
22
+ {
23
+ width: 100%;
24
+ height: 32px;
25
+ background-image: image_url("ajax_loader.gif");
26
+ background-repeat: no-repeat;
27
+ background-position: center;
28
+ }
@@ -0,0 +1,14 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
5
+
6
+ .replies
7
+ {
8
+ margin-left: 50px;
9
+ }
10
+
11
+ p.comment_author
12
+ {
13
+ font-style: italic;
14
+ }
@@ -0,0 +1,3 @@
1
+ // Place all the styles related to the Images controller here.
2
+ // They will automatically be included in application.css.
3
+ // You can use Sass (SCSS) here: http://sass-lang.com/
@@ -0,0 +1,77 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
5
+
6
+ h1.post_title
7
+ {
8
+ text-align: center;
9
+ padding-bottom: 10px;
10
+ font-weight: bold;
11
+ border-bottom: solid 1px #ddd;
12
+ }
13
+
14
+ div.post_information
15
+ {
16
+ border-top: solid 1px #ddd;
17
+ border-bottom: solid 1px #ddd;
18
+ padding: 10px;
19
+ clear: both;
20
+ }
21
+
22
+ div.post_excerpt_information
23
+ {
24
+ font-size: 13px;
25
+ color: rgba(0, 0, 0, 0.3);
26
+ margin-top: 10px;
27
+ }
28
+
29
+ input.datetime_picker
30
+ {
31
+ cursor: pointer;
32
+ }
33
+
34
+ .editable
35
+ {
36
+ &:focus
37
+ {
38
+ outline: none;
39
+ }
40
+ }
41
+
42
+ .mediumInsert
43
+ {
44
+ margin: -1em 0 0 0;
45
+ }
46
+
47
+ div.post_body.show .mediumInsert
48
+ {
49
+ margin: 0px !important;
50
+
51
+ .mediumInsert-images img
52
+ {
53
+ margin: 0px;
54
+ }
55
+
56
+ }
57
+
58
+ figure.mediumInsert-images
59
+ {
60
+ text-align: center;
61
+ }
62
+
63
+ .medium-editor-insert-plugin p
64
+ {
65
+ margin: 0px 0px 10px;
66
+ box-sizing: border-box;
67
+ }
68
+
69
+ .medium-editor-placeholder:after
70
+ {
71
+ position: relative;
72
+ }
73
+
74
+ h1.post_title.editable:after
75
+ {
76
+ text-align: center;
77
+ }
@@ -0,0 +1,3 @@
1
+ // Place all the styles related to the Subscriptions controller here.
2
+ // They will automatically be included in application.css.
3
+ // You can use Sass (SCSS) here: http://sass-lang.com/
@@ -0,0 +1,44 @@
1
+ class Proclaim::ApplicationController < ApplicationController
2
+ include Pundit
3
+
4
+ rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized
5
+
6
+ private
7
+
8
+ def user_not_authorized
9
+ flash[:error] = "You are not authorized to perform this action."
10
+ redirect_to(request.referrer || root_path)
11
+ end
12
+
13
+ def authenticate_author
14
+ begin
15
+ send(Proclaim.authentication_method)
16
+ rescue NoMethodError
17
+ raise "Proclaim doesn't know how to authenticate users! Please" \
18
+ " ensure that `Proclaim.authentication_path` is valid."
19
+ end
20
+ end
21
+
22
+ def current_author
23
+ begin
24
+ send(Proclaim.current_author_method)
25
+ rescue NoMethodError
26
+ raise "Proclaim doesn't know how to get the current author! Please" \
27
+ " ensure that `Proclaim.current_author_method` is valid."
28
+ end
29
+ end
30
+
31
+ def pundit_user
32
+ current_author
33
+ end
34
+
35
+ def image_id_and_name_from_url(url)
36
+ match = url.match(/([^\/]*?)\/([^\/]*)\z/)
37
+
38
+ return match[1], match[2]
39
+ end
40
+
41
+ def cache_name_from_url(url)
42
+ url.match(/[^\/]*?\/[^\/]*\z/)
43
+ end
44
+ end
@@ -0,0 +1,128 @@
1
+ require_dependency "proclaim/application_controller"
2
+
3
+ module Proclaim
4
+ class CommentsController < ApplicationController
5
+ before_action :authenticate_author, only: [:destroy]
6
+ after_action :verify_authorized
7
+ before_action :set_comment, only: [:update, :destroy]
8
+
9
+ def create
10
+ @comment = Comment.new(comment_params)
11
+
12
+ begin
13
+ authorize @comment
14
+
15
+ if antispam_params[:answer] == antispam_params[:solution]
16
+ subscription = nil
17
+ params = subscription_params
18
+ if params and params[:subscribe]
19
+ subscription = Subscription.new(email: params[:email], post: @comment.post)
20
+ end
21
+
22
+ respond_to do |format|
23
+ begin
24
+ Comment.transaction do
25
+ @comment.save!
26
+
27
+ if subscription
28
+ subscription.save!
29
+ end
30
+
31
+ format.json { render_comment_json(@comment) }
32
+ end
33
+ rescue ActiveRecord::RecordInvalid
34
+ errorMessages = Array.new
35
+ errorMessages += @comment.errors.full_messages
36
+
37
+ if subscription
38
+ errorMessages += subscription.errors.full_messages
39
+ end
40
+
41
+ format.json { render json: errorMessages, status: :unprocessable_entity }
42
+ end
43
+ end
44
+ else
45
+ respond_to do |format|
46
+ format.json { render json: ["Antispam question wasn't answered correctly"], status: :unprocessable_entity }
47
+ end
48
+ end
49
+ rescue Pundit::NotAuthorizedError
50
+ respond_to do |format|
51
+ # Don't leak that the post actually exists. Turn the
52
+ # "unauthorized" into a "not found"
53
+ format.json { render json: true, status: :not_found }
54
+ end
55
+ end
56
+ end
57
+
58
+ def update
59
+ begin
60
+ authorize @comment
61
+
62
+ respond_to do |format|
63
+ if @comment.update(comment_params)
64
+ format.json { render_comment_json(@comment) }
65
+ else
66
+ format.json { render json: @comment.errors.full_messages, status: :unprocessable_entity }
67
+ end
68
+ end
69
+ rescue Pundit::NotAuthorizedError
70
+ respond_to do |format|
71
+ format.json { render json: true, status: :unauthorized }
72
+ end
73
+ end
74
+ end
75
+
76
+ def destroy
77
+ begin
78
+ authorize @comment
79
+
80
+ respond_to do |format|
81
+ @comment.destroy
82
+ format.json { render json: true, status: :ok }
83
+ end
84
+ rescue Pundit::NotAuthorizedError
85
+ respond_to do |format|
86
+ format.json { render json: true, status: :unauthorized }
87
+ end
88
+ end
89
+ end
90
+
91
+ private
92
+
93
+ def set_comment
94
+ @comment = Comment.find(params[:id])
95
+ end
96
+
97
+ def render_comment_json(comment)
98
+ render json: {
99
+ id: comment.id,
100
+ html: comment_to_html(comment)
101
+ }
102
+ end
103
+
104
+ def comment_to_html(comment)
105
+ view_context.comments_tree_for(comment.hash_tree)
106
+ end
107
+
108
+ # Only allow a trusted parameter "white list" through.
109
+ def comment_params
110
+ params.require(:comment).permit(:body,
111
+ :author,
112
+ :post_id,
113
+ :parent_id)
114
+ end
115
+
116
+ def subscription_params
117
+ if params[:subscription]
118
+ params.require(:subscription).permit(:subscribe,
119
+ :email)
120
+ end
121
+ end
122
+
123
+ def antispam_params
124
+ params.require(:antispam).permit(:solution,
125
+ :answer)
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,108 @@
1
+ require_dependency "proclaim/application_controller"
2
+
3
+ module Proclaim
4
+ class ImagesController < ApplicationController
5
+ after_action :verify_authorized
6
+
7
+ def create
8
+ @image = Image.new(post_id: image_params[:post_id])
9
+
10
+ begin
11
+ authorize @image
12
+
13
+ @image.image = image_params[:image]
14
+
15
+ respond_to do |format|
16
+ if @image.save
17
+ format.json { render json: @image.image.url }
18
+ else
19
+ format.json { render json: @image.errors.full_messages, status: :unprocessable_entity }
20
+ end
21
+ end
22
+ rescue Pundit::NotAuthorizedError
23
+ respond_to do |format|
24
+ format.json { render json: true, status: :unauthorized }
25
+ end
26
+ end
27
+ end
28
+
29
+ def cache
30
+ @image = Image.new
31
+
32
+ begin
33
+ authorize @image
34
+
35
+ @image.image = file_params[:file]
36
+
37
+ respond_to do |format|
38
+ format.json { render json: @image.image.url }
39
+ end
40
+ rescue Pundit::NotAuthorizedError
41
+ respond_to do |format|
42
+ format.json { render json: true, status: :unauthorized }
43
+ end
44
+ end
45
+ end
46
+
47
+ def discard
48
+ url = file_params[:file]
49
+ image_id = nil
50
+
51
+ # Is this a cached image?
52
+ if (url.include? Proclaim::ImageUploader.cache_dir)
53
+ # If so, retrieve it from the cache
54
+ @image = Image.new
55
+ @image.image.retrieve_from_cache!(cache_name_from_url(url))
56
+ else
57
+ # If not, retrieve it from the database
58
+ image_id, image_name = image_id_and_name_from_url(url)
59
+ @image = Image.find(image_id)
60
+ end
61
+
62
+ begin
63
+ authorize @image
64
+
65
+ if @image.new_record?
66
+ @image.image.remove!
67
+ end
68
+
69
+ respond_to do |format|
70
+ format.json { render json: {id: image_id}, status: :ok }
71
+ end
72
+ rescue Pundit::NotAuthorizedError
73
+ respond_to do |format|
74
+ format.json { render json: true, status: :unauthorized }
75
+ end
76
+ end
77
+ end
78
+
79
+ def destroy
80
+ @image = Image.find(params[:id])
81
+
82
+ begin
83
+ authorize @image
84
+
85
+ respond_to do |format|
86
+ @image.destroy
87
+ format.json { render json: true, status: :ok }
88
+ end
89
+ rescue Pundit::NotAuthorizedError
90
+ respond_to do |format|
91
+ format.json { render json: true, status: :unauthorized }
92
+ end
93
+ end
94
+ end
95
+
96
+ private
97
+
98
+ # Only allow a trusted parameter "white list" through.
99
+ def image_params
100
+ params.require(:image).permit(:post_id,
101
+ :image)
102
+ end
103
+
104
+ def file_params
105
+ params.permit(:file)
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,131 @@
1
+ require_dependency "proclaim/application_controller"
2
+
3
+ module Proclaim
4
+ class PostsController < ApplicationController
5
+ before_action :authenticate_author, except: [:index, :show]
6
+ after_action :verify_authorized, except: :index
7
+ after_action :verify_policy_scoped, only: :index
8
+ before_action :set_post, only: [:show, :edit, :update, :destroy]
9
+
10
+ # GET /posts
11
+ def index
12
+ @posts = policy_scope(Post)
13
+ authorize Post
14
+ end
15
+
16
+ # GET /posts/1
17
+ def show
18
+ begin
19
+ authorize @post
20
+ rescue Pundit::NotAuthorizedError
21
+ # Don't leak that this resource actually exists. Turn the
22
+ # "permission denied" into a "not found"
23
+ raise ActiveRecord::RecordNotFound
24
+ end
25
+ end
26
+
27
+ # GET /posts/new
28
+ def new
29
+ @post = Post.new(author: current_author)
30
+ authorize @post
31
+ end
32
+
33
+ # GET /posts/1/edit
34
+ def edit
35
+ authorize @post
36
+ end
37
+
38
+ # POST /posts
39
+ def create
40
+ @post = Post.new(post_params)
41
+ @post.author = current_author
42
+
43
+ if params[:publish] == "true"
44
+ @post.publish
45
+ end
46
+
47
+ authorize @post
48
+
49
+ if @post.valid?
50
+ # Save and rewrite each image in Carrierwave's cache
51
+ @post.body = saved_and_rewrite_cached_images(@post.body)
52
+
53
+ @post.save
54
+
55
+ redirect_to @post, notice: 'Post was successfully created.'
56
+ else
57
+ render :new
58
+ end
59
+ end
60
+
61
+ # PATCH/PUT /posts/1
62
+ def update
63
+ @post.assign_attributes(post_params)
64
+
65
+ if (params[:publish] == "true") and not @post.published?
66
+ @post.publish
67
+ @post.author = current_author # Reassign author when it's published
68
+ end
69
+
70
+ authorize @post
71
+
72
+ if @post.valid?
73
+ # Save and rewrite each image in Carrierwave's cache
74
+ @post.body = saved_and_rewrite_cached_images(@post.body)
75
+
76
+ @post.save
77
+
78
+ redirect_to @post, notice: 'Post was successfully updated.'
79
+ else
80
+ render :edit
81
+ end
82
+ end
83
+
84
+ # DELETE /posts/1
85
+ def destroy
86
+ authorize @post
87
+
88
+ @post.destroy
89
+ redirect_to posts_url, notice: 'Post was successfully destroyed.'
90
+ end
91
+
92
+ private
93
+
94
+ # Use callbacks to share common setup or constraints between actions.
95
+ def set_post
96
+ @post = Post.find(params[:id])
97
+ end
98
+
99
+ # Only allow a trusted parameter "white list" through.
100
+ def post_params
101
+ # Ensure post title is sanitized of all HTML
102
+ if params[:post].include? :title
103
+ params[:post][:title] = Rails::Html::FullSanitizer.new.sanitize(params[:post][:title])
104
+ end
105
+
106
+ params.require(:post).permit(:title,
107
+ :body,
108
+ images_attributes: [:id, :image, :_destroy])
109
+ end
110
+
111
+ def saved_and_rewrite_cached_images(body)
112
+ document = Nokogiri::HTML.fragment(body)
113
+ cache_path = ImageUploader.cache_dir
114
+ document.css("img").each do |image_tag|
115
+ url = image_tag.attributes["src"].value
116
+ if url.include? cache_path
117
+ cache_name = cache_name_from_url(url)
118
+ if cache_name
119
+ image = @post.images.build
120
+ image.image.retrieve_from_cache!(cache_name)
121
+ image.save
122
+
123
+ image_tag.attributes["src"].value = image.image.url
124
+ end
125
+ end
126
+ end
127
+
128
+ document.inner_html
129
+ end
130
+ end
131
+ end