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,39 @@
1
+ require 'rails'
2
+ require 'coffee-rails'
3
+ require 'sass-rails'
4
+ require 'jquery-rails'
5
+ require 'closure_tree'
6
+ require 'font-awesome-rails'
7
+ require 'medium-editor-rails'
8
+ require 'carrierwave'
9
+ require 'aasm'
10
+ require 'rails-timeago'
11
+ require 'pundit'
12
+ require 'premailer'
13
+
14
+ module Proclaim
15
+ class Engine < ::Rails::Engine
16
+ isolate_namespace Proclaim
17
+
18
+ initializer :assets do
19
+ Rails.application.config.assets.precompile += %w{ link.png remove.png resize-bigger.png resize-smaller.png unlink.png }
20
+ end
21
+
22
+ initializer :append_migrations do |app|
23
+ engine_root = Pathname(root)
24
+ application_root = Pathname(app.root)
25
+ within_engine = false
26
+ application_root.ascend {|f| within_engine = true and break if f == engine_root}
27
+
28
+ unless within_engine # Don't run migrations twice for dummy app
29
+ config.paths["db/migrate"].expanded.each do |expanded_path|
30
+ app.config.paths["db/migrate"] << expanded_path
31
+ end
32
+ end
33
+ end
34
+
35
+ config.generators do |g|
36
+ g.fixture_replacement :factory_girl, :dir => 'test/factories'
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,3 @@
1
+ module Proclaim
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :proclaim do
3
+ # # Task goes here
4
+ # end
data/proclaim.gemspec ADDED
@@ -0,0 +1,46 @@
1
+ $:.push File.expand_path("../lib", __FILE__)
2
+
3
+ require "proclaim/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "proclaim"
7
+ s.version = Proclaim::VERSION
8
+ s.authors = ["Kyle Fazzari"]
9
+ s.email = ["proclaim@status.e4ward.com"]
10
+ s.homepage = "https://github.com/kyle-f/proclaim"
11
+ s.summary = "A Rails blogging engine that simplifies your life."
12
+ s.description = <<-EOF
13
+ Most Rails blogging tools include everything you could ever want,
14
+ including things you don't. Proclaim tries to provide the simplest (yet
15
+ beautiful) implementation of a blog via a mountable engine; if more
16
+ functionality is desired, it can easily be combined with other engines.
17
+ EOF
18
+ s.license = "GPLv3"
19
+
20
+ s.files = Dir["{app,config,db,lib,vendor,test}/**/*", "LICENSE", "Rakefile", "README.md", "Gemfile", "proclaim.gemspec", "CHANGELOG", "VERSION"]
21
+ s.test_files = Dir["test/**/*"]
22
+
23
+ s.add_dependency "rails", "~> 4.2"
24
+ s.add_dependency "coffee-rails", "~> 4.1"
25
+ s.add_dependency "sass-rails", "~> 5.0"
26
+ s.add_dependency "jquery-rails", "~> 4.0"
27
+ s.add_dependency "nokogiri", "~> 1.6"
28
+ s.add_dependency "premailer", "~> 1.8"
29
+ s.add_dependency "closure_tree", "~> 5.2"
30
+ s.add_dependency "font-awesome-rails", "~> 4.2"
31
+ s.add_dependency "medium-editor-rails", "~> 0.13"
32
+ s.add_dependency "carrierwave", "~> 0.10"
33
+ s.add_dependency "aasm", "~> 4.0"
34
+ s.add_dependency "rails-timeago", "~> 2.11"
35
+ s.add_dependency "pundit", "~> 0.3"
36
+
37
+ s.add_development_dependency "sqlite3", "~> 1.3"
38
+ s.add_development_dependency "factory_girl_rails", "~> 4.5"
39
+ s.add_development_dependency "mocha", "~> 1.1"
40
+ s.add_development_dependency "annotate", "~> 2.6"
41
+ s.add_development_dependency "capybara", "~> 2.4"
42
+ s.add_development_dependency "selenium-webdriver", "~> 2.44"
43
+ s.add_development_dependency "database_cleaner", "~> 1.3"
44
+ s.add_development_dependency "faker", "~> 1.4"
45
+ s.add_development_dependency "test_after_commit", "~> 0.4"
46
+ end
@@ -0,0 +1,228 @@
1
+ require 'test_helper'
2
+
3
+ module Proclaim
4
+ class CommentsControllerTest < ActionController::TestCase
5
+ setup do
6
+ @routes = Engine.routes
7
+
8
+ @controller.stubs(:current_user).returns(nil)
9
+ @controller.stubs(:authenticate_user).returns(false)
10
+ end
11
+
12
+ test "should create root comment if logged in" do
13
+ user = FactoryGirl.create(:user)
14
+ sign_in user
15
+
16
+ # Users should be able to make comments on unpublished posts
17
+ newComment = FactoryGirl.build(:comment)
18
+ assert_create_comment newComment
19
+
20
+ # Users should also be able to make comments on published posts
21
+ newComment = FactoryGirl.build(:published_comment)
22
+ assert_create_comment newComment
23
+ end
24
+
25
+ test "should create reply if logged in" do
26
+ user = FactoryGirl.create(:user)
27
+ sign_in user
28
+
29
+ # Users should be able to make replies to comments on unpublished posts
30
+ parent = FactoryGirl.create(:comment)
31
+ reply = FactoryGirl.build(:comment,
32
+ post: parent.post,
33
+ parent: parent)
34
+ assert_create_comment reply, 1, 1, parent
35
+
36
+ # Users should be able to make replies to comments on published posts
37
+ parent = FactoryGirl.create(:published_comment)
38
+ reply = FactoryGirl.build(:published_comment,
39
+ post: parent.post,
40
+ parent: parent)
41
+ assert_create_comment reply, 1, 1, parent
42
+ end
43
+
44
+ test "should create root comment if not logged in" do
45
+ # Guests should not be able to make comments on unpublished comments
46
+ newComment = FactoryGirl.build(:comment)
47
+ refute_create_comment newComment
48
+
49
+ # Guests should be able to make comments on published comments
50
+ newComment = FactoryGirl.build(:published_comment)
51
+ assert_create_comment newComment
52
+ end
53
+
54
+ test "should create reply if not logged in" do
55
+ # Guests should not be able to make replies to comments on unpublished posts
56
+ parent = FactoryGirl.create(:comment)
57
+ reply = FactoryGirl.build(:comment,
58
+ post: parent.post,
59
+ parent: parent)
60
+ refute_create_comment reply, 1, 1, parent
61
+
62
+ # Guests should be able to make replies to comments on published posts
63
+ parent = FactoryGirl.create(:published_comment)
64
+ reply = FactoryGirl.build(:published_comment,
65
+ post: parent.post,
66
+ parent: parent)
67
+ assert_create_comment reply, 1, 1, parent
68
+ end
69
+
70
+ test "should not create root comment if spammy" do
71
+ newComment = FactoryGirl.build(:published_comment)
72
+ refute_create_comment newComment, 1, 2
73
+ end
74
+
75
+ test "should not create reply if spammy" do
76
+ parent = FactoryGirl.create(:published_comment)
77
+ reply = FactoryGirl.build(:published_comment,
78
+ post: parent.post,
79
+ parent: parent)
80
+ refute_create_comment reply, 3, 4, parent
81
+ end
82
+
83
+ test "should update root comment if logged in" do
84
+ user = FactoryGirl.create(:user)
85
+ sign_in user
86
+
87
+ newComment = FactoryGirl.create(:comment)
88
+ assert_update_comment newComment
89
+ end
90
+
91
+ test "should not root update comment if not logged in" do
92
+ newComment = FactoryGirl.create(:comment)
93
+ refute_update_comment newComment
94
+ end
95
+
96
+ test "should destroy root comment if logged in" do
97
+ user = FactoryGirl.create(:user)
98
+ sign_in user
99
+
100
+ newComment = FactoryGirl.create(:comment)
101
+
102
+ assert_difference('Comment.count', -1) do
103
+ delete :destroy, format: :json, id: newComment
104
+ end
105
+ end
106
+
107
+ test "should not destroy root comment if not logged in" do
108
+ newComment = FactoryGirl.create(:comment)
109
+
110
+ assert_no_difference('Comment.count') do
111
+ delete :destroy, format: :json, id: newComment
112
+ end
113
+
114
+ assert_response :unauthorized
115
+ end
116
+
117
+ private
118
+
119
+ def assert_create_comment(comment, antispam_solution = 1,
120
+ antispam_answer = 1, parent = nil,
121
+ subscription = nil)
122
+ subscription_params = nil
123
+ if subscription
124
+ subscription_params = {
125
+ subscribe: true,
126
+ email: subscription.email
127
+ }
128
+ end
129
+
130
+ antispam_params = nil
131
+ if antispam_solution and antispam_answer
132
+ antispam_params = {
133
+ solution: antispam_solution,
134
+ answer: antispam_answer
135
+ }
136
+ end
137
+
138
+ assert_difference('Comment.count', 1,
139
+ "A comment should have been created") do
140
+ post :create, format: :json,
141
+ comment: {
142
+ author: comment.author,
143
+ body: comment.body,
144
+ post_id: comment.post_id,
145
+ parent_id: comment.parent_id
146
+ },
147
+ subscription: subscription_params,
148
+ antispam: antispam_params
149
+ end
150
+
151
+ if parent
152
+ parent.reload # Refresh parent to pull in new associations
153
+ assert_equal 1, parent.children.count,
154
+ "The parent should have a child!"
155
+
156
+ newComment = parent.children.first
157
+ assert_equal comment.author, newComment.author
158
+ assert_equal comment.body, newComment.body
159
+ end
160
+
161
+ json = JSON.parse(@response.body)
162
+ assert_not_nil json["id"], "The returned JSON should include the ID!"
163
+ assert_not_nil json["html"],
164
+ "The returned JSON should include the HTML containing the comment!"
165
+ end
166
+
167
+ def refute_create_comment(comment, antispam_solution = 1,
168
+ antispam_answer = 1, parent = nil,
169
+ subscription = nil)
170
+ subscription_params = nil
171
+ if subscription
172
+ subscription_params = {
173
+ subscribe: true,
174
+ email: subscription.email
175
+ }
176
+ end
177
+
178
+ antispam_params = nil
179
+ if antispam_solution and antispam_answer
180
+ antispam_params = {
181
+ solution: antispam_solution,
182
+ answer: antispam_answer
183
+ }
184
+ end
185
+
186
+ assert_no_difference('Comment.count',
187
+ "A comment should not be created!") do
188
+ post :create, format: :json,
189
+ comment: {
190
+ author: comment.author,
191
+ body: comment.body,
192
+ post_id: comment.post_id,
193
+ parent_id: comment.parent_id
194
+ },
195
+ subscription: subscription_params,
196
+ antispam: antispam_params
197
+ end
198
+
199
+ if antispam_solution == antispam_answer
200
+ assert_response :not_found
201
+ else
202
+ assert_response :unprocessable_entity
203
+ end
204
+ end
205
+
206
+ def assert_update_comment(comment)
207
+ patch :update, format: :json, id: comment, comment: {
208
+ author: comment.author,
209
+ body: comment.body,
210
+ post_id: comment.post_id
211
+ }
212
+
213
+ json = JSON.parse(@response.body)
214
+ assert_not_nil json["id"]
215
+ assert_not_nil json["html"]
216
+ end
217
+
218
+ def refute_update_comment(comment)
219
+ patch :update, format: :json, id: comment, comment: {
220
+ author: comment.author,
221
+ body: comment.body,
222
+ post_id: comment.post_id
223
+ }
224
+
225
+ assert_response :unauthorized
226
+ end
227
+ end
228
+ end
@@ -0,0 +1,123 @@
1
+ require 'test_helper'
2
+
3
+ module Proclaim
4
+ class ImagesControllerTest < ActionController::TestCase
5
+ setup do
6
+ @routes = Engine.routes
7
+
8
+ @controller.stubs(:current_user).returns(nil)
9
+ @controller.stubs(:authenticate_user).returns(false)
10
+ end
11
+
12
+ teardown do
13
+ image = FactoryGirl.build(:image, image: nil)
14
+ FileUtils.rm_rf(File.join(Rails.public_path, image.image.cache_dir))
15
+ FileUtils.rm_rf(File.join(Rails.public_path, image.image.store_dir))
16
+ end
17
+
18
+ test "should create image if logged in" do
19
+ user = FactoryGirl.create(:user)
20
+ sign_in user
21
+
22
+ image = FactoryGirl.build(:image, image: nil)
23
+
24
+ assert_difference('Image.count') do
25
+ post :create, format: :json, image: {
26
+ post_id: image.post_id,
27
+ image: Rack::Test::UploadedFile.new(File.join(Rails.root, '../', 'support', 'images', 'test.jpg'))
28
+ }
29
+ end
30
+
31
+ # Response should be the URL to the newly stored image
32
+ assert_match image.image.store_dir, @response.body
33
+ end
34
+
35
+ test "should not create image if not logged in" do
36
+ image = FactoryGirl.build(:image, image: nil)
37
+
38
+ assert_no_difference('Image.count') do
39
+ post :create, format: :json, image: {
40
+ post_id: image.post_id,
41
+ image: Rack::Test::UploadedFile.new(File.join(Rails.root, '../', 'support', 'images', 'test.jpg'))
42
+ }
43
+ end
44
+
45
+ assert_response :unauthorized
46
+ end
47
+
48
+ test "should cache image if logged in" do
49
+ user = FactoryGirl.create(:user)
50
+ sign_in user
51
+
52
+ image = FactoryGirl.build(:image, image: nil)
53
+
54
+ # This is only caching! No new image should be inserted into the database
55
+ assert_no_difference('Image.count', "Caching shouldn't create new images!") do
56
+ post :cache, format: :json, file: Rack::Test::UploadedFile.new(test_image_file_path)
57
+ end
58
+
59
+ # Response should be the URL to the newly cached image
60
+ assert_match image.image.cache_dir, @response.body
61
+ end
62
+
63
+ test "should not cache image if not logged in" do
64
+ assert_no_difference('Image.count') do
65
+ post :cache, format: :json, file: Rack::Test::UploadedFile.new(test_image_file_path)
66
+ end
67
+
68
+ assert_response :unauthorized
69
+ end
70
+
71
+ test "should discard image if logged in" do
72
+ user = FactoryGirl.create(:user)
73
+ sign_in user
74
+
75
+ image = FactoryGirl.build(:image)
76
+
77
+ # This is only discarding from the cache! No images should be removed
78
+ # from the database.
79
+ assert_no_difference('Image.count', "Discarding shouldn't remove images!") do
80
+ post :discard, format: :json, file: image.image.url
81
+ end
82
+
83
+ assert_response :success
84
+ end
85
+
86
+ test "should not discard image if not logged in" do
87
+ image = FactoryGirl.build(:image)
88
+
89
+ assert_no_difference('Image.count') do
90
+ post :discard, format: :json, file: image.image.url
91
+ end
92
+
93
+ assert_response :unauthorized
94
+ end
95
+
96
+ test "should not destroy image if logged in but return ID" do
97
+ user = FactoryGirl.create(:user)
98
+ sign_in user
99
+
100
+ image = FactoryGirl.create(:image)
101
+
102
+ assert_no_difference('Image.count', -1) do
103
+ post :discard, format: :json, file: image.image.url
104
+ end
105
+
106
+ assert_response :success
107
+ assert_not_nil @response.body
108
+ json = JSON.parse(@response.body)
109
+
110
+ assert_equal image.id.to_s, json["id"]
111
+ end
112
+
113
+ test "should not destroy image if not logged in" do
114
+ image = FactoryGirl.create(:image)
115
+
116
+ assert_no_difference('Image.count') do
117
+ post :discard, format: :json, file: image.image.url
118
+ end
119
+
120
+ assert_response :unauthorized
121
+ end
122
+ end
123
+ end