gossiper 0.1.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/application.js +13 -0
  3. data/app/assets/javascripts/bootstrap.js +4 -0
  4. data/app/assets/javascripts/gossiper/application.js +2 -0
  5. data/app/assets/javascripts/gossiper/notifications.js +2 -0
  6. data/app/assets/stylesheets/application.css +7 -0
  7. data/app/assets/stylesheets/bootstrap_and_overrides.css.less +30 -0
  8. data/app/assets/stylesheets/gossiper/application.css +1 -0
  9. data/app/assets/stylesheets/gossiper/notifications.css +4 -0
  10. data/app/controllers/gossiper/application_controller.rb +18 -0
  11. data/app/controllers/gossiper/notifications_controller.rb +28 -0
  12. data/app/helpers/gossiper/notifications_helper.rb +4 -0
  13. data/app/views/gossiper/notifications/dummy_notification_notification.html.erb +0 -0
  14. data/app/views/gossiper/notifications/index.html.erb +40 -0
  15. data/app/views/gossiper/notifications/show.html.erb +31 -0
  16. data/app/views/kaminari/_first_page.html.erb +3 -0
  17. data/app/views/kaminari/_gap.html.erb +3 -0
  18. data/app/views/kaminari/_last_page.html.erb +3 -0
  19. data/app/views/kaminari/_next_page.html.erb +3 -0
  20. data/app/views/kaminari/_page.html.erb +3 -0
  21. data/app/views/kaminari/_paginator.html.erb +17 -0
  22. data/app/views/kaminari/_prev_page.html.erb +3 -0
  23. data/app/views/kaminari/gossiper/_first_page.html.erb +3 -0
  24. data/app/views/kaminari/gossiper/_gap.html.erb +3 -0
  25. data/app/views/kaminari/gossiper/_last_page.html.erb +3 -0
  26. data/app/views/kaminari/gossiper/_next_page.html.erb +3 -0
  27. data/app/views/kaminari/gossiper/_page.html.erb +3 -0
  28. data/app/views/kaminari/gossiper/_paginator.html.erb +17 -0
  29. data/app/views/kaminari/gossiper/_prev_page.html.erb +3 -0
  30. data/app/views/layouts/gossiper/application.html.erb +36 -12
  31. data/config/locales/en.bootstrap.yml +18 -0
  32. data/config/routes.rb +7 -0
  33. data/lib/generators/gossiper/install/install_generator.rb +2 -2
  34. data/lib/generators/gossiper/install/templates/initializer.rb +24 -6
  35. data/lib/generators/gossiper/install/templates/locale.en.yml +11 -0
  36. data/lib/generators/gossiper/notification_type/USAGE +3 -1
  37. data/lib/generators/gossiper/notification_type/notification_type_generator.rb +9 -0
  38. data/lib/generators/gossiper/notification_type/templates/notification_type_template.rb +18 -0
  39. data/lib/gossiper/configuration.rb +6 -2
  40. data/lib/gossiper/email_config.rb +11 -8
  41. data/lib/gossiper/mailer.rb +6 -1
  42. data/lib/gossiper/notification_decorator.rb +70 -0
  43. data/lib/gossiper/version.rb +1 -1
  44. data/lib/gossiper.rb +2 -1
  45. metadata +80 -30
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e3cee602077f8193490a6c88820bfb282bc91e4d
4
- data.tar.gz: f8880ec0eba28ba87c3b813632868918170c250b
3
+ metadata.gz: e3716407ac00419742e5e27b7ca519d8c917db74
4
+ data.tar.gz: aef5ae17de79516eb899b82e511b3f2968638dff
5
5
  SHA512:
6
- metadata.gz: 597cc48ab2c7454143814fe67b1c83ac9b8d63ce0c8a99c2ff70cf468391e747c8cfbac106d42508c1cdae4d81493df2cc5f41250267503a65000c0fc8e0d32e
7
- data.tar.gz: a5c247cb2bcc91f797fd1776088e98baf30a84065156e3ce5f7bed32cae3bec5c7356021927582f07b9a5bd3cd83cefa5bc8fa1887bc8a7e994a42db1b7c9922
6
+ metadata.gz: 5c8a47020bd298bc4c7839b8697d73165d393084a4c948378a21f2d2139584484b53899372acbaacbb1c359eca762bf4a2f6a322ab7186d54f78f0f00ab735b0
7
+ data.tar.gz: 194baa36496e0d7cd375ba98f687c3410a413654de0ff1b78507c52a6796225819a52aa5b126f6588d2e946dda43d5c08acbe275f5c13eabbe496094a215728c
@@ -0,0 +1,13 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file.
9
+ //
10
+ // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require_tree .
@@ -0,0 +1,4 @@
1
+ jQuery(function() {
2
+ $("a[rel~=popover], .has-popover").popover();
3
+ $("a[rel~=tooltip], .has-tooltip").tooltip();
4
+ });
@@ -11,3 +11,5 @@
11
11
  // about supported directives.
12
12
  //
13
13
  //= require_tree .
14
+ //= require jquery
15
+ //= require jquery_ujs
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.
@@ -0,0 +1,7 @@
1
+ /*
2
+ * This is a manifest file that'll automatically include all the stylesheets available in this directory
3
+ * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
4
+ * the top of the compiled file, but it's generally better to create a new file per style scope.
5
+ *= require_self
6
+ *= require_tree .
7
+ */
@@ -0,0 +1,30 @@
1
+ @import "twitter/bootstrap/bootstrap";
2
+ @import "twitter/bootstrap/responsive";
3
+
4
+ // Set the correct sprite paths
5
+ @iconSpritePath: image-url("twitter/bootstrap/glyphicons-halflings.png");
6
+ @iconWhiteSpritePath: image-url("twitter/bootstrap/glyphicons-halflings-white.png");
7
+
8
+ // Set the Font Awesome (Font Awesome is default. You can disable by commenting below lines)
9
+ @fontAwesomeEotPath: asset-url("fontawesome-webfont.eot");
10
+ @fontAwesomeEotPath_iefix: asset-url("fontawesome-webfont.eot?#iefix");
11
+ @fontAwesomeWoffPath: asset-url("fontawesome-webfont.woff");
12
+ @fontAwesomeTtfPath: asset-url("fontawesome-webfont.ttf");
13
+ @fontAwesomeSvgPath: asset-url("fontawesome-webfont.svg#fontawesomeregular");
14
+
15
+ // Font Awesome
16
+ @import "fontawesome/font-awesome";
17
+
18
+ // Glyphicons
19
+ //@import "twitter/bootstrap/sprites.less";
20
+
21
+ // Your custom LESS stylesheets goes here
22
+ //
23
+ // Since bootstrap was imported above you have access to its mixins which
24
+ // you may use and inherit here
25
+ //
26
+ // If you'd like to override bootstrap's own variables, you can do so here as well
27
+ // See http://twitter.github.com/bootstrap/customize.html#variables for their names and documentation
28
+ //
29
+ // Example:
30
+ // @linkColor: #ff0000;
@@ -10,4 +10,5 @@
10
10
  *
11
11
  *= require_self
12
12
  *= require_tree .
13
+ *= require bootstrap_and_overrides
13
14
  */
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -1,4 +1,22 @@
1
1
  module Gossiper
2
2
  class ApplicationController < ActionController::Base
3
+
4
+ if respond_to?(:before_action)
5
+ before_action :gossiper_authorization
6
+ else
7
+ before_filter :gossiper_authorization
8
+ end
9
+
10
+ def gossiper_authorization
11
+ instance_eval(&Gossiper.configuration.authorize_with)
12
+ end
13
+
14
+ def page
15
+ params[:page].presence || 1
16
+ end
17
+
18
+ def per_page
19
+ params[:per_page].presence || 25
20
+ end
3
21
  end
4
22
  end
@@ -0,0 +1,28 @@
1
+ require_dependency "gossiper/application_controller"
2
+
3
+ module Gossiper
4
+ class NotificationsController < ApplicationController
5
+ respond_to :html
6
+
7
+ def index
8
+ @notifications = Notification.order('id desc').page(page).per(per_page)
9
+ respond_with(@notifications)
10
+ end
11
+
12
+ def show
13
+ respond_with(notification)
14
+ end
15
+
16
+ def deliver
17
+ notification.deliver!
18
+ respond_with(notification) do |format|
19
+ format.html { redirect_to :notifications, notice: t('.delivered') }
20
+ end
21
+ end
22
+
23
+ private
24
+ def notification
25
+ @notification ||= Notification.find(params[:id])
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,4 @@
1
+ module Gossiper
2
+ module NotificationsHelper
3
+ end
4
+ end
@@ -0,0 +1,40 @@
1
+ <h1><%= Gossiper::Notification.model_name.human.pluralize %></h1>
2
+
3
+ <% if notice.present? %>
4
+ <div class="alert alert-success"><%= notice %></div>
5
+ <% end %>
6
+
7
+ <table class="table table-striped table-bordered">
8
+ <tr>
9
+ <th><%= t('.kind') %></th>
10
+ <th><%= t('.email') %></th>
11
+ <th><%= t('.delivered_at') %></th>
12
+ <th><%= t('.status') %></th>
13
+ <th><%= t('.read') %></th>
14
+ <th><%= t('.actions') %></th>
15
+ </tr>
16
+ <% @notifications.each do |notification| %>
17
+ <% decorator = Gossiper::NotificationDecorator.new(notification) %>
18
+ <tr>
19
+ <td><%= decorator.kind %></td>
20
+ <td><%= decorator.user.email %></td>
21
+ <td><%= decorator.delivered_at %></td>
22
+ <td><%= decorator.status %></td>
23
+ <td><%= decorator.read? %></td>
24
+ <td class="actions">
25
+ <%= link_to(
26
+ t('.deliver', default: 'Deliver'),
27
+ deliver_notification_path(notification),
28
+ data: {
29
+ confirm: t('.confirm_delivery', default: t('gossiper.notifications.confirm_delivery')),
30
+ method: :post,
31
+ },
32
+ class: 'btn pull-right'
33
+ ) %>
34
+ <%= link_to(t('.show', default: t('gossiper.notifications.show')), notification, class: 'btn pull-right') %>
35
+ </td>
36
+ </tr>
37
+ <% end %>
38
+ </table>
39
+
40
+ <%= paginate(@notifications, theme: :gossiper) %>
@@ -0,0 +1,31 @@
1
+ <% decorator = Gossiper::NotificationDecorator.new(@notification) %>
2
+
3
+ <h1><%= Gossiper::Notification.model_name.human.pluralize %></h1>
4
+
5
+ <table class="table table-striped table-bordered">
6
+ <% %w(kind subject to user_class user_id delivered_at status read created_at updated_at).each do |attribute| %>
7
+ <tr>
8
+ <th class="title"><%= Gossiper::Notification.human_attribute_name(attribute) rescue t(".#{attribute}") %></th>
9
+ <td><%= decorator.send(attribute) %></td>
10
+ </tr>
11
+ <% end %>
12
+
13
+ <tr>
14
+ <th class="title"><%= Gossiper::Notification.human_attribute_name('email_body') rescue t("email_body") %></th>
15
+ <td><pre><%= decorator.email_object %></pre></td>
16
+ </tr>
17
+
18
+ </table>
19
+
20
+ <div class="form-actions">
21
+ <%= link_to(
22
+ t('.deliver', default: 'Deliver'),
23
+ deliver_notification_path(@notification),
24
+ data: {
25
+ confirm: t('.confirm_delivery', default: t('gossiper.notifications.confirm_delivery')),
26
+ method: :post,
27
+ },
28
+ class: 'btn pull-right'
29
+ ) %>
30
+ <%= link_to(t('.back', default: t('gossiper.notifications.back')), :notifications, class: "btn pull-right") %>
31
+ </div>
@@ -0,0 +1,3 @@
1
+ <li>
2
+ <%= link_to_unless current_page.first?, raw(t 'views.pagination.first'), url, :remote => remote %>
3
+ </li>
@@ -0,0 +1,3 @@
1
+ <li class="disabled">
2
+ <%= link_to raw(t 'views.pagination.truncate'), '#' %>
3
+ </li>
@@ -0,0 +1,3 @@
1
+ <li>
2
+ <%= link_to_unless current_page.last?, raw(t 'views.pagination.last'), url, {:remote => remote} %>
3
+ </li>
@@ -0,0 +1,3 @@
1
+ <li>
2
+ <%= link_to_unless current_page.last?, raw(t 'views.pagination.next'), url, :rel => 'next', :remote => remote %>
3
+ </li>
@@ -0,0 +1,3 @@
1
+ <li class="<%= 'active' if page.current? %>">
2
+ <%= link_to page, page.current? ? '#' : url, {:remote => remote, :rel => page.next? ? 'next' : page.prev? ? 'prev' : nil} %>
3
+ </li>
@@ -0,0 +1,17 @@
1
+ <%= paginator.render do -%>
2
+ <div class="pagination">
3
+ <ul>
4
+ <%= first_page_tag unless current_page.first? %>
5
+ <%= prev_page_tag unless current_page.first? %>
6
+ <% each_page do |page| -%>
7
+ <% if page.left_outer? || page.right_outer? || page.inside_window? -%>
8
+ <%= page_tag page %>
9
+ <% elsif !page.was_truncated? -%>
10
+ <%= gap_tag %>
11
+ <% end -%>
12
+ <% end -%>
13
+ <%= next_page_tag unless current_page.last? %>
14
+ <%= last_page_tag unless current_page.last? %>
15
+ </ul>
16
+ </div>
17
+ <% end -%>
@@ -0,0 +1,3 @@
1
+ <li>
2
+ <%= link_to_unless current_page.first?, raw(t 'views.pagination.previous'), url, :rel => 'prev', :remote => remote %>
3
+ </li>
@@ -0,0 +1,3 @@
1
+ <li>
2
+ <%= link_to_unless current_page.first?, raw(t 'views.pagination.first'), url, :remote => remote %>
3
+ </li>
@@ -0,0 +1,3 @@
1
+ <li class="disabled">
2
+ <%= link_to raw(t 'views.pagination.truncate'), '#' %>
3
+ </li>
@@ -0,0 +1,3 @@
1
+ <li>
2
+ <%= link_to_unless current_page.last?, raw(t 'views.pagination.last'), url, {:remote => remote} %>
3
+ </li>
@@ -0,0 +1,3 @@
1
+ <li>
2
+ <%= link_to_unless current_page.last?, raw(t 'views.pagination.next'), url, :rel => 'next', :remote => remote %>
3
+ </li>
@@ -0,0 +1,3 @@
1
+ <li class="<%= 'active' if page.current? %>">
2
+ <%= link_to page, page.current? ? '#' : url, {:remote => remote, :rel => page.next? ? 'next' : page.prev? ? 'prev' : nil} %>
3
+ </li>
@@ -0,0 +1,17 @@
1
+ <%= paginator.render do -%>
2
+ <div class="pagination">
3
+ <ul>
4
+ <%= first_page_tag unless current_page.first? %>
5
+ <%= prev_page_tag unless current_page.first? %>
6
+ <% each_page do |page| -%>
7
+ <% if page.left_outer? || page.right_outer? || page.inside_window? -%>
8
+ <%= page_tag page %>
9
+ <% elsif !page.was_truncated? -%>
10
+ <%= gap_tag %>
11
+ <% end -%>
12
+ <% end -%>
13
+ <%= next_page_tag unless current_page.last? %>
14
+ <%= last_page_tag unless current_page.last? %>
15
+ </ul>
16
+ </div>
17
+ <% end -%>
@@ -0,0 +1,3 @@
1
+ <li>
2
+ <%= link_to_unless current_page.first?, raw(t 'views.pagination.previous'), url, :rel => 'prev', :remote => remote %>
3
+ </li>
@@ -1,14 +1,38 @@
1
1
  <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Gossiper</title>
5
- <%= stylesheet_link_tag "gossiper/application", media: "all" %>
6
- <%= javascript_include_tag "gossiper/application" %>
7
- <%= csrf_meta_tags %>
8
- </head>
9
- <body>
10
-
11
- <%= yield %>
12
-
13
- </body>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title><%= content_for?(:title) ? yield(:title) : "Gossiper" %></title>
8
+ <%= csrf_meta_tags %>
9
+
10
+ <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
11
+ <!--[if lt IE 9]>
12
+ <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.6.1/html5shiv.js" type="text/javascript"></script>
13
+ <![endif]-->
14
+
15
+ <%= stylesheet_link_tag "gossiper/application", :media => "all" %>
16
+
17
+ <%= javascript_include_tag "gossiper/application" %>
18
+ </head>
19
+ <body>
20
+
21
+ <div class="container-fluid">
22
+ <div class="row-fluid">
23
+ <div class="span12">
24
+ <%# <%= bootstrap_flash %>
25
+ <%= yield %>
26
+ </div>
27
+ </div><!--/row-->
28
+
29
+ <footer class="footer">
30
+ <div class="pull-right">
31
+ Powered by <a href="https://github.com/mjacobus/gossiper">Gossiper <%= Gossiper::VERSION %></a>
32
+ </div>
33
+ </footer>
34
+
35
+ </div> <!-- /container -->
36
+
37
+ </body>
14
38
  </html>
@@ -0,0 +1,18 @@
1
+ # Sample localization file for English. Add more files in this directory for other locales.
2
+ # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3
+
4
+ en:
5
+ helpers:
6
+ actions: "Actions"
7
+ links:
8
+ back: "Back"
9
+ cancel: "Cancel"
10
+ confirm: "Are you sure?"
11
+ destroy: "Delete"
12
+ new: "New"
13
+ edit: "Edit"
14
+ titles:
15
+ edit: "Edit %{model}"
16
+ save: "Save %{model}"
17
+ new: "New %{model}"
18
+ delete: "Delete %{model}"
data/config/routes.rb CHANGED
@@ -1,2 +1,9 @@
1
1
  Gossiper::Engine.routes.draw do
2
+ root to: 'notifications#index'
3
+
4
+ resources :notifications do
5
+ member do
6
+ post :deliver
7
+ end
8
+ end
2
9
  end
@@ -2,10 +2,10 @@ class Gossiper::InstallGenerator < Rails::Generators::Base
2
2
  source_root File.expand_path('../templates', __FILE__)
3
3
 
4
4
  def copy_initializer
5
- template "initializer.rb", "config/initializer/gossiper.rb"
5
+ template "initializer.rb", "config/initializers/gossiper.rb"
6
6
  end
7
7
 
8
8
  def copy_locale
9
- template "locale.en.yml", "config/locale/gossiper.en.yml"
9
+ template "locale.en.yml", "config/locales/gossiper.en.yml"
10
10
  end
11
11
  end
@@ -1,22 +1,40 @@
1
1
  <%- test_folder = defined?(RSpec) ? 'rspec' : 'test' -%>
2
2
  Gossiper.configure do |config|
3
3
  # Change the default user class
4
- configure.default_user_class = 'User'
4
+ config.default_notification_user_class = 'User'
5
5
 
6
6
  # change the default class of the configurations
7
- config.default_notification_base_class = 'Gossiper::EmailConfig'
7
+ config.default_notification_config_class = 'Gossiper::EmailConfig'
8
+
9
+ # email the email sender
10
+ config.default_from = 'from@example.com'
11
+
12
+ # The list of emails to send copies to
13
+ # config.default_cc = ['user@example.com']
14
+
15
+ # The list of emails to send hidden copies to
16
+ # config.default_bcc = ['user@example.com']
8
17
 
9
18
  # change the path where the notifications should be placed
10
- config.notification_root_folder = Rails.root.join('app/models')
19
+ config.notifications_root_folder = Rails.root.join('app/models')
20
+
21
+ # the notifications templates
22
+ config.notifications_template_folder = Rails.root.join("app/views")
11
23
 
12
24
  # the notifications test folder
13
- config.notification_test_folder = Rails.root.join("<%= test_folder %>", "models")
25
+ config.notifications_test_folder = Rails.root.join("<%= test_folder %>", "models")
14
26
 
15
- config.authorize_with do |controller|
27
+ # The process to be run before a controller action is executed
28
+ # Can also implemented in the application controller
29
+ # by ovewriting the ApplicationController::gossiper_authorization
30
+ #
31
+ # See: Gossiper::ApplicationController#gossiper_authorization
32
+ #
33
+ config.authorize_with do
16
34
  # Example:
17
35
 
18
36
  # unless current_user.is_admin?
19
- # redirect_to root_path, notice: 'Get out!'
37
+ # redirect_to root_path, notice: 'Get outta here!'
20
38
  # end
21
39
  end
22
40
  end
@@ -1,6 +1,17 @@
1
1
  en:
2
+ "true": Yes
3
+ "false": No
2
4
  gossiper:
3
5
  notifications:
6
+ status:
7
+ delivered: Delivered
8
+ pending: Pending
9
+ deliver:
10
+ delivered: Your message has successfully been sent
11
+ show: View
12
+ back: Back
13
+ confirm_delivery: Are you sure you want to deliver this notification?
4
14
  # Example
5
15
  user_welcome:
6
16
  subject: Welcome!
17
+ title: User Registration
@@ -5,4 +5,6 @@ Example:
5
5
  rails generate notification_type user_welcome
6
6
 
7
7
  This will create:
8
- app/models/notifications/user_welcome_notification
8
+ app/models/notifications/user_welcome_notification.rb
9
+ app/views/notifications/user_welcome_notification.html.erb
10
+ spec/models/notifications/user_welcome_notification_spec.rb
@@ -20,4 +20,13 @@ class Gossiper::NotificationTypeGenerator < Rails::Generators::NamedBase
20
20
  "#{singular_name}_notification_#{test_sufix}.rb"
21
21
  )
22
22
  end
23
+
24
+ def create_template
25
+ template 'notification_type_template.rb', File.join(
26
+ Gossiper.configuration.notifications_template_folder.to_s,
27
+ 'notifications',
28
+ class_path,
29
+ "#{singular_name}_notification.html.erb"
30
+ )
31
+ end
23
32
  end
@@ -0,0 +1,18 @@
1
+ <!--
2
+ # @notification.class #=> Gossiper::NotificationDecorator
3
+ # @notification.subject
4
+ # @notification.email
5
+ # @notification.read?
6
+ # @notification.delivered_at?
7
+
8
+
9
+ # Also, if you want to assign other vars here, just edit the
10
+ # <%= File.join(Gossiper.configuration.notifications_root_folder.to_s, 'notifications', class_path, "#{singular_name}_notification.rb") %>
11
+ # and override the
12
+ # def instance_variables
13
+ # { some_var: 'some_value' }
14
+ # end
15
+
16
+ # and the value will be assign to the @some_var instance variable
17
+ -->
18
+ <p>Write your email here</p>
@@ -13,10 +13,14 @@ module Gossiper
13
13
  end
14
14
  end
15
15
 
16
- attribute :default_notification_user_class
17
- attribute :default_notification_config_class
18
16
  attribute :notifications_root_folder
19
17
  attribute :notifications_test_folder
18
+ attribute :notifications_template_folder
19
+ attribute :default_notification_user_class
20
+ attribute :default_notification_config_class
21
+ attribute :default_from
22
+ attribute :default_cc
23
+ attribute :default_bcc
20
24
 
21
25
  def authorize_with(&block)
22
26
  if block_given?
@@ -7,6 +7,10 @@ module Gossiper
7
7
  @user = notification.user
8
8
  end
9
9
 
10
+ def from
11
+ config.default_from
12
+ end
13
+
10
14
  def to
11
15
  if user.respond_to?(:name)
12
16
  ["#{user.name} <#{user.email}>"]
@@ -15,18 +19,12 @@ module Gossiper
15
19
  end
16
20
  end
17
21
 
18
- # TODO: Make configuration for default bcc
19
22
  def bcc
20
- []
21
- end
22
-
23
- # TODO: Make configuration for default from
24
- def from
23
+ config.default_bcc
25
24
  end
26
25
 
27
- # TODO: Make configuration for default cc
28
26
  def cc
29
- []
27
+ config.default_cc
30
28
  end
31
29
 
32
30
  def template_name
@@ -48,5 +46,10 @@ module Gossiper
48
46
  def instance_variables
49
47
  {}
50
48
  end
49
+
50
+ private
51
+ def config
52
+ Gossiper.configuration
53
+ end
51
54
  end
52
55
  end
@@ -8,11 +8,14 @@ module Gossiper
8
8
  attachments[filename] = file
9
9
  end
10
10
 
11
+ @notification = NotificationDecorator.new(notification)
12
+
11
13
  config.instance_variables.each do |name, value|
12
14
  instance_variable_set("@#{name}", value)
13
15
  end
14
16
 
15
17
  mail(
18
+ from: config.from,
16
19
  to: config.to,
17
20
  cc: config.cc,
18
21
  bcc: config.bcc,
@@ -27,8 +30,10 @@ module Gossiper
27
30
  klass = "Notifications::#{notification.kind.classify}Notification"
28
31
  klass.constantize.new(notification)
29
32
  rescue NameError
30
- Gossiper::EmailConfig.new(notification)
33
+ klass = Gossiper.configuration.default_notification_config_class
34
+ klass.constantize.new(notification)
31
35
  end
36
+
32
37
  end
33
38
  end
34
39
  end
@@ -0,0 +1,70 @@
1
+ module Gossiper
2
+ class NotificationDecorator
3
+
4
+ attr_reader :notification
5
+
6
+ def initialize(notification)
7
+ @notification = notification
8
+ end
9
+
10
+ def method_missing(method, *args, &block)
11
+ notification.send(method, *args, &block)
12
+ end
13
+
14
+ def respond_to?(method)
15
+ notification.respond_to?(method)
16
+ end
17
+
18
+ def kind
19
+ t("gossiper.notifications.#{notification.kind}.title",
20
+ default: notification.kind.titleize
21
+ )
22
+ end
23
+
24
+ def subject
25
+ t("gossiper.notifications.#{notification.kind}.subject",
26
+ default: kind
27
+ )
28
+ end
29
+
30
+ def status
31
+ t("gossiper.notifications.status.#{notification.status}")
32
+ end
33
+
34
+ def read?
35
+ t(notification.read?.to_s)
36
+ end
37
+
38
+ def email
39
+ notification.user.email
40
+ end
41
+ alias_method :to, :email
42
+
43
+ def delivered_at
44
+ decorate_date(notification.delivered_at)
45
+ end
46
+
47
+ def created_at
48
+ decorate_date(notification.created_at)
49
+ end
50
+
51
+ def updated_at
52
+ decorate_date(notification.updated_at)
53
+ end
54
+
55
+ def email_object
56
+ @email_object ||= Mailer.mail_for(notification)
57
+ end
58
+
59
+ private
60
+
61
+ def t(*args)
62
+ I18n.t(*args)
63
+ end
64
+
65
+ def decorate_date(date)
66
+ I18n.l(date, format: :short) if date
67
+ end
68
+
69
+ end
70
+ end
@@ -1,3 +1,3 @@
1
1
  module Gossiper
2
- VERSION = "0.1.0"
2
+ VERSION = "0.3.0"
3
3
  end
data/lib/gossiper.rb CHANGED
@@ -2,6 +2,7 @@ require "gossiper/engine"
2
2
  require "gossiper/email_config"
3
3
  require "gossiper/mailer"
4
4
  require "gossiper/configuration"
5
+ require "gossiper/notification_decorator"
5
6
 
6
7
  module Gossiper
7
8
 
@@ -10,7 +11,7 @@ module Gossiper
10
11
  @@_config ||= Configuration.new
11
12
  end
12
13
 
13
- def config
14
+ def configure
14
15
  yield configuration
15
16
  end
16
17
  end
metadata CHANGED
@@ -1,37 +1,59 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gossiper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marcelo Jacobus
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-08 00:00:00.000000000 Z
11
+ date: 2013-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rails
14
+ name: sqlite3
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - '>='
18
18
  - !ruby/object:Gem::Version
19
- version: '3.2'
20
- - - <
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
21
25
  - !ruby/object:Gem::Version
22
- version: '5.0'
23
- type: :runtime
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: shoulda-matchers
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
24
35
  prerelease: false
25
36
  version_requirements: !ruby/object:Gem::Requirement
26
37
  requirements:
27
38
  - - '>='
28
39
  - !ruby/object:Gem::Version
29
- version: '3.2'
30
- - - <
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec-rails
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
31
53
  - !ruby/object:Gem::Version
32
- version: '5.0'
54
+ version: '0'
33
55
  - !ruby/object:Gem::Dependency
34
- name: sqlite3
56
+ name: simplecov
35
57
  requirement: !ruby/object:Gem::Requirement
36
58
  requirements:
37
59
  - - '>='
@@ -45,7 +67,7 @@ dependencies:
45
67
  - !ruby/object:Gem::Version
46
68
  version: '0'
47
69
  - !ruby/object:Gem::Dependency
48
- name: shoulda-matchers
70
+ name: coveralls
49
71
  requirement: !ruby/object:Gem::Requirement
50
72
  requirements:
51
73
  - - '>='
@@ -59,7 +81,7 @@ dependencies:
59
81
  - !ruby/object:Gem::Version
60
82
  version: '0'
61
83
  - !ruby/object:Gem::Dependency
62
- name: rspec-rails
84
+ name: faker
63
85
  requirement: !ruby/object:Gem::Requirement
64
86
  requirements:
65
87
  - - '>='
@@ -73,7 +95,7 @@ dependencies:
73
95
  - !ruby/object:Gem::Version
74
96
  version: '0'
75
97
  - !ruby/object:Gem::Dependency
76
- name: simplecov
98
+ name: interactive_editor
77
99
  requirement: !ruby/object:Gem::Requirement
78
100
  requirements:
79
101
  - - '>='
@@ -93,30 +115,58 @@ executables: []
93
115
  extensions: []
94
116
  extra_rdoc_files: []
95
117
  files:
118
+ - app/views/layouts/gossiper/application.html.erb
119
+ - app/views/gossiper/notifications/dummy_notification_notification.html.erb
120
+ - app/views/gossiper/notifications/index.html.erb
121
+ - app/views/gossiper/notifications/show.html.erb
122
+ - app/views/kaminari/_first_page.html.erb
123
+ - app/views/kaminari/_prev_page.html.erb
124
+ - app/views/kaminari/gossiper/_first_page.html.erb
125
+ - app/views/kaminari/gossiper/_prev_page.html.erb
126
+ - app/views/kaminari/gossiper/_last_page.html.erb
127
+ - app/views/kaminari/gossiper/_next_page.html.erb
128
+ - app/views/kaminari/gossiper/_page.html.erb
129
+ - app/views/kaminari/gossiper/_gap.html.erb
130
+ - app/views/kaminari/gossiper/_paginator.html.erb
131
+ - app/views/kaminari/_last_page.html.erb
132
+ - app/views/kaminari/_next_page.html.erb
133
+ - app/views/kaminari/_page.html.erb
134
+ - app/views/kaminari/_gap.html.erb
135
+ - app/views/kaminari/_paginator.html.erb
136
+ - app/helpers/gossiper/notifications_helper.rb
137
+ - app/helpers/gossiper/application_helper.rb
138
+ - app/assets/javascripts/application.js
96
139
  - app/assets/javascripts/gossiper/application.js
140
+ - app/assets/javascripts/gossiper/notifications.js
141
+ - app/assets/javascripts/bootstrap.js
142
+ - app/assets/stylesheets/application.css
143
+ - app/assets/stylesheets/gossiper/notifications.css
97
144
  - app/assets/stylesheets/gossiper/application.css
98
- - app/helpers/gossiper/application_helper.rb
145
+ - app/assets/stylesheets/bootstrap_and_overrides.css.less
99
146
  - app/models/gossiper/notification.rb
100
- - app/views/layouts/gossiper/application.html.erb
101
147
  - app/controllers/gossiper/application_controller.rb
148
+ - app/controllers/gossiper/notifications_controller.rb
149
+ - config/locales/en.bootstrap.yml
102
150
  - config/routes.rb
103
151
  - db/migrate/20131206162038_create_gossiper_notifications.rb
104
- - lib/generators/gossiper/notification_type/USAGE
105
- - lib/generators/gossiper/notification_type/notification_type_generator.rb
106
- - lib/generators/gossiper/notification_type/templates/notification_type_spec.rb
107
- - lib/generators/gossiper/notification_type/templates/notification_type_test.rb
108
- - lib/generators/gossiper/notification_type/templates/notification_type.rb
109
- - lib/generators/gossiper/install/USAGE
110
- - lib/generators/gossiper/install/install_generator.rb
111
- - lib/generators/gossiper/install/templates/initializer.rb
112
- - lib/generators/gossiper/install/templates/locale.en.yml
113
152
  - lib/gossiper.rb
114
- - lib/tasks/gossiper_tasks.rake
115
- - lib/gossiper/email_config.rb
116
- - lib/gossiper/engine.rb
117
- - lib/gossiper/mailer.rb
118
153
  - lib/gossiper/configuration.rb
154
+ - lib/gossiper/engine.rb
155
+ - lib/gossiper/email_config.rb
119
156
  - lib/gossiper/version.rb
157
+ - lib/gossiper/mailer.rb
158
+ - lib/gossiper/notification_decorator.rb
159
+ - lib/tasks/gossiper_tasks.rake
160
+ - lib/generators/gossiper/install/templates/locale.en.yml
161
+ - lib/generators/gossiper/install/templates/initializer.rb
162
+ - lib/generators/gossiper/install/install_generator.rb
163
+ - lib/generators/gossiper/install/USAGE
164
+ - lib/generators/gossiper/notification_type/notification_type_generator.rb
165
+ - lib/generators/gossiper/notification_type/templates/notification_type.rb
166
+ - lib/generators/gossiper/notification_type/templates/notification_type_test.rb
167
+ - lib/generators/gossiper/notification_type/templates/notification_type_template.rb
168
+ - lib/generators/gossiper/notification_type/templates/notification_type_spec.rb
169
+ - lib/generators/gossiper/notification_type/USAGE
120
170
  - MIT-LICENSE
121
171
  - Rakefile
122
172
  homepage: https://github.com/mjacobus/gossiper
@@ -139,7 +189,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
139
189
  version: '0'
140
190
  requirements: []
141
191
  rubyforge_project:
142
- rubygems_version: 2.0.3
192
+ rubygems_version: 2.1.11
143
193
  signing_key:
144
194
  specification_version: 4
145
195
  summary: It eases the creation of messages for the users