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.
- checksums.yaml +7 -0
- data/CHANGELOG +6 -0
- data/Gemfile +14 -0
- data/LICENSE +674 -0
- data/README.md +137 -0
- data/Rakefile +65 -0
- data/VERSION +1 -0
- data/app/assets/images/ajax_loader.gif +0 -0
- data/app/assets/javascripts/proclaim.js +18 -0
- data/app/assets/javascripts/proclaim/comments_handler.js.coffee +192 -0
- data/app/assets/javascripts/proclaim/editor.js.coffee +50 -0
- data/app/assets/javascripts/proclaim/images.js.coffee +3 -0
- data/app/assets/javascripts/proclaim/subscriptions.js.coffee +3 -0
- data/app/assets/stylesheets/proclaim.css.scss +28 -0
- data/app/assets/stylesheets/proclaim/comments.css.scss +14 -0
- data/app/assets/stylesheets/proclaim/images.scss +3 -0
- data/app/assets/stylesheets/proclaim/posts.css.scss +77 -0
- data/app/assets/stylesheets/proclaim/subscriptions.css.scss +3 -0
- data/app/controllers/proclaim/application_controller.rb +44 -0
- data/app/controllers/proclaim/comments_controller.rb +128 -0
- data/app/controllers/proclaim/images_controller.rb +108 -0
- data/app/controllers/proclaim/posts_controller.rb +131 -0
- data/app/controllers/proclaim/subscriptions_controller.rb +67 -0
- data/app/helpers/proclaim/application_helper.rb +34 -0
- data/app/helpers/proclaim/comments_helper.rb +4 -0
- data/app/helpers/proclaim/images_helper.rb +4 -0
- data/app/helpers/proclaim/posts_helper.rb +4 -0
- data/app/helpers/proclaim/subscriptions_helper.rb +4 -0
- data/app/mailers/proclaim/subscription_mailer.rb +43 -0
- data/app/models/proclaim/comment.rb +35 -0
- data/app/models/proclaim/image.rb +19 -0
- data/app/models/proclaim/post.rb +133 -0
- data/app/models/proclaim/subscription.rb +63 -0
- data/app/policies/application_policy.rb +53 -0
- data/app/policies/proclaim/comment_policy.rb +27 -0
- data/app/policies/proclaim/image_policy.rb +29 -0
- data/app/policies/proclaim/post_policy.rb +38 -0
- data/app/policies/proclaim/subscription_policy.rb +32 -0
- data/app/uploaders/proclaim/image_uploader.rb +82 -0
- data/app/views/layouts/proclaim/subscription_mailer.html.erb +133 -0
- data/app/views/proclaim/comments/_comment.html.erb +33 -0
- data/app/views/proclaim/comments/_form.html.erb +51 -0
- data/app/views/proclaim/posts/_form.html.erb +67 -0
- data/app/views/proclaim/posts/edit.html.erb +3 -0
- data/app/views/proclaim/posts/index.html.erb +30 -0
- data/app/views/proclaim/posts/new.html.erb +3 -0
- data/app/views/proclaim/posts/show.html.erb +46 -0
- data/app/views/proclaim/subscription_mailer/new_comment_notification_email.html.erb +11 -0
- data/app/views/proclaim/subscription_mailer/new_post_notification_email.html.erb +15 -0
- data/app/views/proclaim/subscription_mailer/welcome_email.html.erb +25 -0
- data/app/views/proclaim/subscriptions/_form.html.erb +32 -0
- data/app/views/proclaim/subscriptions/new.html.erb +8 -0
- data/app/views/proclaim/subscriptions/subscribed.html.erb +7 -0
- data/app/views/proclaim/subscriptions/unsubscribe.html.erb +7 -0
- data/app/views/proclaim/subscriptions/unsubscribed.html.erb +3 -0
- data/config/routes.rb +18 -0
- data/db/migrate/20141108222616_create_proclaim_posts.rb +15 -0
- data/db/migrate/20141114235359_create_proclaim_comments.rb +15 -0
- data/db/migrate/20141115022230_create_proclaim_comment_hierarchies.rb +26 -0
- data/db/migrate/20141210234057_create_proclaim_subscriptions.rb +17 -0
- data/db/migrate/20141222224905_create_proclaim_images.rb +12 -0
- data/lib/generators/proclaim/install_generator.rb +23 -0
- data/lib/generators/proclaim/templates/README +27 -0
- data/lib/generators/proclaim/templates/initialize_proclaim.rb +22 -0
- data/lib/generators/proclaim/views_generator.rb +24 -0
- data/lib/proclaim.rb +22 -0
- data/lib/proclaim/engine.rb +39 -0
- data/lib/proclaim/version.rb +3 -0
- data/lib/tasks/proclaim_tasks.rake +4 -0
- data/proclaim.gemspec +46 -0
- data/test/controllers/proclaim/comments_controller_test.rb +228 -0
- data/test/controllers/proclaim/images_controller_test.rb +123 -0
- data/test/controllers/proclaim/posts_controller_test.rb +303 -0
- data/test/controllers/proclaim/subscriptions_controller_test.rb +93 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/javascripts/application.js +14 -0
- data/test/dummy/app/assets/stylesheets/application.css +16 -0
- data/test/dummy/app/controllers/application_controller.rb +15 -0
- data/test/dummy/app/helpers/application_helper.rb +28 -0
- data/test/dummy/app/models/user.rb +7 -0
- data/test/dummy/app/views/layouts/application.html.erb +16 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +24 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +45 -0
- data/test/dummy/config/environments/production.rb +80 -0
- data/test/dummy/config/environments/test.rb +49 -0
- data/test/dummy/config/initializers/assets.rb +8 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +5 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/db/migrate/20141117214323_create_users.rb +10 -0
- data/test/dummy/db/schema.rb +75 -0
- data/test/dummy/log/development.log +131 -0
- data/test/dummy/log/test.log +25961 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/0b69f7cc441d56def3a51688e6a7a8474dc476d1/proclaim.css.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/12a97df611d5fb0e395afda829edf8b9372acde7/comments.css.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/12a97df611d5fb0e395afda829edf8b9372acde7/images.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/12a97df611d5fb0e395afda829edf8b9372acde7/posts.css.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/12a97df611d5fb0e395afda829edf8b9372acde7/subscriptions.css.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/04adcece63bc645379e6de797e7998f8 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/06620fc450f0a9b4a482a7bc08387711 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/076dd0d567a92c34163b3b98af1d48ba +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/09fc2eadf6d6062b2cc135a44e4e73db +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/09fe8c62e8ae706e01058b4b4d056c8e +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/142fd040033525acb73ad2ccf1406aea +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/1762aeeaf38da3b8d989a5b66b088004 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/194ac1a695334e303516614579b3926d +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/197ea008934db3e7ea8045302d206b92 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/19eba2635fec0895379c3e38f81ada84 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/1c2ebe72fcd7ff1379a561552ca30f85 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/1f42c80faacb651f670ec2b0998e49dc +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/2243230e778a749ecbf0415a52e75be0 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/23ad87e715c70312aa61dde4fbb4bfe1 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/245b8735db4ea90bcaa91c011a1f447e +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/26a42dac0cec64483f4126d2de4b0c9e +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/30151c8f6d93717f06fa12774612ddf4 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/3c623d200214a5334aaf170537db087f +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/3ec36650a50759fd4b75794cb253936f +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/40431cdcc10c75ba1f275ecfe42623d3 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/4226218a4b06608115b21063353370ea +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/437901953eb8707af6c27ca59cf65d91 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/461885b8ad31ef6a94c9a4f2e332b7eb +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/4792f46317cda92ccd5b278ec61f9ac5 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/4dcb3434b91b1c62f897a1741c6d398b +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/5101cda93cf70f0fc0837713be587780 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/52d8c61de0703e0d7cf97d0f7b0cca7a +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/57f3d19a9bd484ac68c46f962a8684b2 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/587e7c1332c8d8b69746dd85164e2cef +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/5934d5d0d1ac6657842708e85c73cf51 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/5af081799d7da2f04ead6a516c6015ad +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/69ee5af8d9a655898a67bc538ca1c7e7 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/6d1c56259648b0383bc438c875a448c3 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/6e7de35055967df848aa490830043e51 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/70bc59560ee544af7bb2f727247db307 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/728cb566999910549092ff0a98e2853b +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/72b5f0d35e9d69b744a156edad98f983 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/72ffa34d552e3fd02f28a6f845a5ac5b +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/7369d324e84bc872c42b3e717ff4ad6c +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/749a8b0e45b11df748a256dd04ceb1f7 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/77fb9f62552d9b786f9407ef11cc9a09 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/797823842565e01fc989ad8df0bd4254 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/7c139afa2296ac17483520109aecd449 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/7fb99e2b35af65c4f58bfb92dd4185b4 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/819de31c63b704f9ddf4865587a91d41 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/8604b464bf846e5223da37ef2f29b524 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/88fc815613b473e98e9307b1d423918d +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/8bc4341aa4060b8646e8134722cf3b11 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/8cf8fd5ff8eae12211a88f971af30236 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/8da3b4a9f17aafff49eb263bdb758f44 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/9168e513bae02f041dbb806d6dbe94ac +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/920c1322be1212a54b7c4f2751d5e7bf +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/92205679a36afd387a2ba5c585a5a62c +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/940566ebcae2d4e5c56a881ab66f2cf0 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/976967e07e2944a7ecc7403667f1f96b +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/99bdde70cefa71745279232be575f14e +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/9a8e402a7e32063e46647403b43553a5 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/9b09ad72f8cc33503878b01c713d92d0 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/a20dbdfebf37fe50e832a6273c972553 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/a3c6189fad6cb9ae955f6d5a43a61d51 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/abb54e11ff057a3e22a5a97d27cc4fa3 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/ad18e3875541d4298b1df133d494b93f +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/b9b7c575c22943d49734d52381c5ee16 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/ba269a52f100d3d6cffda81e82e1ed49 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/bc7a0846b4881b0832d41de2b1724dba +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/bcb2df87f9611d3cc3ef8a5575e54fb8 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/bcf33791d3286af3ba2cdf6a6756c89e +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/be32d0a530ce861537d6abfa41333df9 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/c8270a6f07dccc5f00e6b2b43f10efd2 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/cd82cd410a50bffcfb6e21e3c49a85c9 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/ce4ccaa06bdee6426486224bc7e54187 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/d0bdb8592e4eed80aa2341e37f20dbc9 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/d4b784b16fa1b1dfcca6590689a8c157 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/d968bd38a69bbf5c0065e2df3d30cfd3 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/daa4d4b8a5ce46d6c4ecf031e0c61cfe +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/dc2effd195334219a7e4acfdc7ec7974 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/de36ab6c3b1a9b62a586d98373dd569c +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/e3aec457d5c753090d6521f2bb2d91b6 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/e8d6158b1fed2f574242b55856a3953d +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/ea82f6aececcf81eef3e2e15a9225e66 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/ed9f5c17f71ec75de10b1bb029ebd7a2 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/f2984adaeaa5322e3a040705c6d40622 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/f62fd0cf9f5e7e077ec9c4daeccb06ae +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/f78ea69bdbba5738c052e9eb04e6c208 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/f864e553f706456dbdf168319970ec2e +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/fb0f641bfcbb0101c040da9ff736447b +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/fe426a44cf23cf82032091cbffff898c +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/ff732ea47a86c449582b2a81ef2930da +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/ffc4980851addaacf12abeebfa63e07f +0 -0
- data/test/dummy/tmp/generators/config/initializers/proclaim.rb +22 -0
- data/test/factories/proclaim/comment.rb +11 -0
- data/test/factories/proclaim/image.rb +6 -0
- data/test/factories/proclaim/post.rb +14 -0
- data/test/factories/proclaim/subscription.rb +13 -0
- data/test/factories/user.rb +6 -0
- data/test/helpers/proclaim/comments_helper_test.rb +6 -0
- data/test/helpers/proclaim/posts_helper_test.rb +6 -0
- data/test/helpers/proclaim/subscriptions_helper_test.rb +6 -0
- data/test/integration/with_javascript/comment_test.rb +353 -0
- data/test/integration/with_javascript/post_form_test.rb +179 -0
- data/test/integration/with_javascript/post_subscription_test.rb +273 -0
- data/test/integration/without_javascript/blog_subscription_test.rb +87 -0
- data/test/integration/without_javascript/post_test.rb +140 -0
- data/test/integration/without_javascript/subscription_email_test.rb +95 -0
- data/test/integration/without_javascript/unsubscribe_test.rb +32 -0
- data/test/mailers/previews/proclaim/subscription_mailer_preview.rb +22 -0
- data/test/mailers/proclaim/subscription_mailer_test.rb +87 -0
- data/test/models/proclaim/comment_test.rb +41 -0
- data/test/models/proclaim/image_test.rb +70 -0
- data/test/models/proclaim/post_test.rb +127 -0
- data/test/models/proclaim/subscription_test.rb +66 -0
- data/test/policies/proclaim/comment_policy_test.rb +71 -0
- data/test/policies/proclaim/post_policy_test.rb +87 -0
- data/test/policies/proclaim/subscription_policy_test.rb +91 -0
- data/test/proclaim_test.rb +7 -0
- data/test/support/images/test.jpg +0 -0
- data/test/support/pages/posts/edit_page.rb +5 -0
- data/test/support/pages/posts/show_page.rb +47 -0
- data/test/support/wait_for_ajax.rb +11 -0
- data/test/test_helper.rb +56 -0
- data/vendor/assets/images/link.png +0 -0
- data/vendor/assets/images/remove.png +0 -0
- data/vendor/assets/images/resize-bigger.png +0 -0
- data/vendor/assets/images/resize-smaller.png +0 -0
- data/vendor/assets/images/unlink.png +0 -0
- data/vendor/assets/javascripts/addons/medium-editor-insert-embeds.js +197 -0
- data/vendor/assets/javascripts/addons/medium-editor-insert-embeds.min.js +10 -0
- data/vendor/assets/javascripts/addons/medium-editor-insert-images.js +572 -0
- data/vendor/assets/javascripts/addons/medium-editor-insert-images.min.js +10 -0
- data/vendor/assets/javascripts/addons/medium-editor-insert-maps.js +50 -0
- data/vendor/assets/javascripts/addons/medium-editor-insert-maps.min.js +10 -0
- data/vendor/assets/javascripts/addons/medium-editor-insert-plugin.js +496 -0
- data/vendor/assets/javascripts/addons/medium-editor-insert-plugin.min.js +10 -0
- data/vendor/assets/javascripts/addons/medium-editor-insert-tables.js +132 -0
- data/vendor/assets/javascripts/addons/medium-editor-insert-tables.min.js +10 -0
- data/vendor/assets/javascripts/medium-editor-insert-plugin.all.js +1415 -0
- data/vendor/assets/javascripts/medium-editor-insert-plugin.all.min.js +10 -0
- data/vendor/assets/stylesheets/medium-editor-insert-plugin-frontend.css +55 -0
- data/vendor/assets/stylesheets/medium-editor-insert-plugin-frontend.min.css +10 -0
- data/vendor/assets/stylesheets/medium-editor-insert-plugin.css +277 -0
- data/vendor/assets/stylesheets/medium-editor-insert-plugin.min.css +10 -0
- 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
|
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
|