activity_notification 0.0.9 → 0.0.10

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 (62) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.travis.yml +5 -0
  4. data/.yardopts +3 -0
  5. data/Gemfile +5 -0
  6. data/Gemfile.lock +50 -44
  7. data/README.md +242 -81
  8. data/Rakefile +13 -13
  9. data/activity_notification.gemspec +6 -8
  10. data/app/controllers/activity_notification/notifications_controller.rb +89 -11
  11. data/app/controllers/activity_notification/notifications_with_devise_controller.rb +12 -3
  12. data/app/mailers/activity_notification/mailer.rb +3 -0
  13. data/gemfiles/Gemfile.rails-4.2 +13 -0
  14. data/gemfiles/Gemfile.rails-4.2.lock +190 -0
  15. data/gemfiles/Gemfile.rails-5.0 +14 -0
  16. data/gemfiles/Gemfile.rails-5.0.lock +201 -0
  17. data/lib/activity_notification.rb +10 -6
  18. data/lib/activity_notification/apis/notification_api.rb +137 -27
  19. data/lib/activity_notification/common.rb +48 -24
  20. data/lib/activity_notification/config.rb +68 -10
  21. data/lib/activity_notification/controllers/store_controller.rb +13 -5
  22. data/lib/activity_notification/helpers/polymorphic_helpers.rb +17 -3
  23. data/lib/activity_notification/helpers/view_helpers.rb +161 -45
  24. data/lib/activity_notification/mailers/helpers.rb +121 -83
  25. data/lib/activity_notification/models/concerns/notifiable.rb +162 -69
  26. data/lib/activity_notification/models/concerns/notifier.rb +2 -0
  27. data/lib/activity_notification/models/concerns/target.rb +124 -25
  28. data/lib/activity_notification/models/notification.rb +168 -4
  29. data/lib/activity_notification/rails/routes.rb +50 -48
  30. data/lib/activity_notification/renderable.rb +106 -26
  31. data/lib/activity_notification/roles/acts_as_notifiable.rb +99 -26
  32. data/lib/activity_notification/roles/acts_as_notifier.rb +3 -0
  33. data/lib/activity_notification/roles/acts_as_target.rb +70 -0
  34. data/lib/activity_notification/version.rb +1 -1
  35. data/lib/generators/activity_notification/active_record/migration_generator.rb +3 -1
  36. data/lib/generators/activity_notification/controllers_generator.rb +5 -0
  37. data/lib/generators/activity_notification/install_generator.rb +7 -3
  38. data/lib/generators/activity_notification/models/notification_generator.rb +4 -2
  39. data/lib/generators/activity_notification/views_generator.rb +20 -0
  40. data/spec/concerns/apis/notification_api_spec.rb +105 -36
  41. data/spec/concerns/common_spec.rb +1 -1
  42. data/spec/concerns/models/notifiable_spec.rb +2 -2
  43. data/spec/concerns/models/notifier_spec.rb +1 -1
  44. data/spec/concerns/models/target_spec.rb +9 -8
  45. data/spec/controllers/notifications_controller_shared_examples.rb +101 -28
  46. data/spec/controllers/notifications_with_devise_controller_spec.rb +14 -4
  47. data/spec/helpers/view_helpers_spec.rb +3 -3
  48. data/spec/mailers/mailer_spec.rb +1 -1
  49. data/spec/models/notification_spec.rb +57 -3
  50. data/spec/rails_app/app/models/article.rb +1 -2
  51. data/spec/rails_app/app/models/comment.rb +8 -6
  52. data/spec/rails_app/app/models/user.rb +1 -1
  53. data/spec/rails_app/app/views/layouts/_header.html.erb +2 -0
  54. data/spec/rails_app/config/application.rb +3 -1
  55. data/spec/rails_app/config/environment.rb +12 -2
  56. data/spec/rails_app/config/environments/test.rb +11 -2
  57. data/spec/roles/acts_as_notifiable_spec.rb +2 -2
  58. data/spec/roles/acts_as_notifier_spec.rb +1 -1
  59. data/spec/roles/acts_as_target_spec.rb +3 -3
  60. data/spec/spec_helper.rb +6 -0
  61. metadata +35 -40
  62. data/spec/rails_app/app/models/concerns/.keep +0 -0
data/Rakefile CHANGED
@@ -1,19 +1,19 @@
1
- begin
2
- require 'bundler/setup'
3
- rescue LoadError
4
- puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
- end
1
+ require "bundler/gem_tasks"
6
2
 
7
- require 'rdoc/task'
3
+ task default: :test
8
4
 
9
- RDoc::Task.new(:rdoc) do |rdoc|
10
- rdoc.rdoc_dir = 'rdoc'
11
- rdoc.title = 'ActivityNotification'
12
- rdoc.options << '--line-numbers'
13
- rdoc.rdoc_files.include('README.rdoc')
14
- rdoc.rdoc_files.include('lib/**/*.rb')
5
+ require 'rspec/core'
6
+ require 'rspec/core/rake_task'
7
+ desc 'Run RSpec test for the activity_notification plugin.'
8
+ RSpec::Core::RakeTask.new(:test) do |spec|
9
+ spec.pattern = FileList['spec/**/*_spec.rb']
15
10
  end
16
11
 
12
+ require 'yard'
13
+ require 'yard/rake/yardoc_task'
14
+ desc 'Generate documentation for the activity_notification plugin.'
15
+ YARD::Rake::YardocTask.new do |doc|
16
+ doc.files = ['app/**/*.rb', 'lib/**/*.rb']
17
+ end
17
18
 
18
19
  Bundler::GemHelper.install_tasks
19
-
@@ -20,16 +20,14 @@ Gem::Specification.new do |s|
20
20
  s.require_paths = ["lib"]
21
21
  s.required_ruby_version = '>= 2.1.0'
22
22
 
23
- s.add_dependency 'rails', '~> 4.2'
24
- #s.add_dependency 'railties', '>= 3.0.0'
23
+ s.add_dependency 'railties', '>= 4.2.0', '< 5.1'
25
24
  s.add_dependency 'i18n', '>= 0.5.0'
26
- s.add_dependency 'activerecord', '>= 3.0'
25
+ s.add_dependency 'activerecord', '>= 4.2.0'
27
26
 
28
- s.add_development_dependency 'sqlite3', '~> 1.3.11'
29
- s.add_development_dependency "jquery-rails", '~> 4.1.1'
30
- s.add_development_dependency "rspec-rails", '~> 3.5.1'
31
- s.add_development_dependency "factory_girl_rails", '~> 4.7.0'
27
+ s.add_development_dependency 'rspec-rails', '~> 3.5.1'
28
+ s.add_development_dependency 'factory_girl_rails', '~> 4.7.0'
32
29
  s.add_development_dependency 'simplecov', '~> 0.12.0'
33
- s.add_development_dependency 'ammeter', '~> 1.1.3'
30
+ s.add_development_dependency 'yard', '~> 0.9.5'
31
+ s.add_development_dependency 'yard-activesupport-concern', '~> 0.0.1'
34
32
  s.add_development_dependency "devise", '~> 4.2.0'
35
33
  end
@@ -1,6 +1,9 @@
1
1
  module ActivityNotification
2
+ # Controller to manage notifications.
2
3
  class NotificationsController < ActivityNotification.config.parent_controller.constantize
4
+ # Include StoreController to allow ActivityNotification access to controller instance
3
5
  include ActivityNotification::StoreController
6
+ # Include PolymorphicHelpers to resolve string extentions
4
7
  include ActivityNotification::PolymorphicHelpers
5
8
  prepend_before_action :set_target
6
9
  before_action :set_notification, except: [:index, :open_all]
@@ -8,7 +11,15 @@ module ActivityNotification
8
11
 
9
12
  DEFAULT_VIEW_DIRECTORY = "default"
10
13
 
14
+ # Shows notification index of the target.
15
+ #
11
16
  # GET /:target_type/:target_id/notifcations
17
+ # @overload index(params)
18
+ # @param [Hash] params Request parameters
19
+ # @option params [String] :filter (nil) Filter option to load notification index. Nothing means auto loading. 'opened' means opened only and 'unopened' means unopened only.
20
+ # @option params [String] :limit (nil) Limit to query for notifications
21
+ # @option params [String] :reload ('true') Whether notification index will be reloaded
22
+ # @return [Responce] HTML view as default or JSON of notification index with json format parameter
12
23
  def index
13
24
  @notifications = load_notification_index(params[:filter], params[:limit]) if params[:reload].to_s.to_boolean(true)
14
25
  respond_to do |format|
@@ -17,48 +28,90 @@ module ActivityNotification
17
28
  end
18
29
  end
19
30
 
31
+ # Opens all notifications of the target.
32
+ #
20
33
  # POST /:target_type/:target_id/notifcations/open_all
34
+ # @overload open_all(params)
35
+ # @param [Hash] params Request parameters
36
+ # @option params [String] :filter (nil) Filter option to load notification index (Nothing as auto, 'opened' or 'unopened')
37
+ # @option params [String] :limit (nil) Limit to query for notifications
38
+ # @option params [String] :reload ('true') Whether notification index will be reloaded
39
+ # @option params [String] :filtered_by_type (nil) Notifiable type for filter
40
+ # @option params [String] :filtered_by_group_type (nil) Group type for filter, valid only :filtered_by_group_id
41
+ # @option params [String] :filtered_by_group_id (nil) Group instance id for filter, valid only :filtered_by_group_type
42
+ # @option params [String] :filtered_by_key (nil) Key of the notification for filter
43
+ # @return [Responce] JavaScript view for ajax request or redirects to back as default
21
44
  def open_all
22
- @target.open_all_notifications
23
- @notifications = load_notification_index(params[:filter], params[:limit]) if params[:reload].to_s.to_boolean(true)
45
+ @target.open_all_notifications(params)
24
46
  return_back_or_ajax(params[:filter], params[:limit])
25
47
  end
26
48
 
49
+ # Shows a notification.
50
+ #
27
51
  # GET /:target_type/:target_id/notifcations/:id
52
+ # @overload show(params)
53
+ # @param [Hash] params Request parameters
54
+ # @return [Responce] HTML view as default
28
55
  def show
29
56
  end
30
57
 
58
+ # Deletes a notification.
59
+ #
31
60
  # DELETE /:target_type/:target_id/notifcations/:id
61
+ #
62
+ # @overload destroy(params)
63
+ # @param [Hash] params Request parameters
64
+ # @option params [String] :filter (nil) Filter option to load notification index (Nothing as auto, 'opened' or 'unopened')
65
+ # @option params [String] :limit (nil) Limit to query for notifications
66
+ # @option params [String] :reload ('true') Whether notification index will be reloaded
67
+ # @return [Responce] JavaScript view for ajax request or redirects to back as default
32
68
  def destroy
33
69
  @notification.destroy
34
- @notifications = load_notification_index(params[:filter], params[:limit]) if params[:reload].to_s.to_boolean(true)
35
70
  return_back_or_ajax(params[:filter], params[:limit])
36
71
  end
37
72
 
73
+ # Opens a notification.
74
+ #
38
75
  # POST /:target_type/:target_id/notifcations/:id/open
76
+ # @overload open(params)
77
+ # @param [Hash] params Request parameters
78
+ # @option params [String] :move ('false') Whether redirects to notifiable_path after the notification is opened
79
+ # @option params [String] :filter (nil) Filter option to load notification index (Nothing as auto, 'opened' or 'unopened')
80
+ # @option params [String] :limit (nil) Limit to query for notifications
81
+ # @option params [String] :reload ('true') Whether notification index will be reloaded
82
+ # @return [Responce] JavaScript view for ajax request or redirects to back as default
39
83
  def open
40
84
  @notification.open!
41
- @notifications = load_notification_index(params[:filter], params[:limit]) if params[:reload].to_s.to_boolean(true)
42
85
  params[:move].to_s.to_boolean(false) ?
43
86
  move :
44
87
  return_back_or_ajax(params[:filter], params[:limit])
45
88
  end
46
89
 
90
+ # Moves to notifiable_path of the notification.
91
+ #
47
92
  # GET /:target_type/:target_id/notifcations/:id/move
93
+ # @overload open(params)
94
+ # @param [Hash] params Request parameters
95
+ # @option params [String] :open ('false') Whether the notification will be opened
96
+ # @option params [String] :filter (nil) Filter option to load notification index (Nothing as auto, 'opened' or 'unopened')
97
+ # @option params [String] :limit (nil) Limit to query for notifications
98
+ # @option params [String] :reload ('true') Whether notification index will be reloaded
99
+ # @return [Responce] JavaScript view for ajax request or redirects to back as default
48
100
  def move
49
101
  @notification.open! if params[:open].to_s.to_boolean(false)
50
102
  redirect_to @notification.notifiable_path
51
103
  end
52
104
 
53
- # No action routing
54
- # This method is called from target_view_path method
55
- # This method can be overriden
105
+ # Returns controller path.
106
+ # This method has no action routing and is called from target_view_path method.
107
+ # This method can be overriden.
108
+ # @return [String] "activity_notification/notifications" as controller path
56
109
  def controller_path
57
110
  "activity_notification/notifications"
58
111
  end
59
112
 
60
- # No action routing
61
- # This method needs to be public since it is called from view helper
113
+ # Returns path of the target view templates.
114
+ # This method has no action routing and needs to be public since it is called from view helper.
62
115
  def target_view_path
63
116
  target_type = @target.to_resources_name
64
117
  view_path = [controller_path, target_type].join('/')
@@ -69,6 +122,9 @@ module ActivityNotification
69
122
 
70
123
  protected
71
124
 
125
+ # Sets @target instance variable from request parameters.
126
+ # @api protected
127
+ # @return [Object] Target instance (Returns HTTP 400 when request parameters are not enough)
72
128
  def set_target
73
129
  if (target_type = params[:target_type]).present?
74
130
  target_class = target_type.to_model_class
@@ -76,17 +132,25 @@ module ActivityNotification
76
132
  target_class.find_by_id!(params[:target_id]) :
77
133
  target_class.find_by_id!(params["#{target_type.to_resource_name}_id"])
78
134
  else
79
- render text: "400 Bad Request: Missing parameter", status: 400
135
+ render plain: "400 Bad Request: Missing parameter", status: 400
80
136
  end
81
137
  end
82
138
 
139
+ # Sets @notification instance variable from request parameters.
140
+ # @api protected
141
+ # @return [Object] Notification instance (Returns HTTP 403 when the target of notification is different from specified target by request parameter)
83
142
  def set_notification
84
143
  @notification = Notification.find_by_id!(params[:id])
85
144
  if @target.present? and @notification.target != @target
86
- render text: "403 Forbidden: Wrong target", status: 403
145
+ render plain: "403 Forbidden: Wrong target", status: 403
87
146
  end
88
147
  end
89
148
 
149
+ # Loads notification index with request parameters.
150
+ # @api protected
151
+ # @param [String] filter Filter option to load notification index (Nothing as auto, 'opened' or 'unopened')
152
+ # @param [String] limit Limit to query for notifications
153
+ # @return [Array] Array of notification index
90
154
  def load_notification_index(filter, limit)
91
155
  limit = nil unless limit.to_i > 0
92
156
  case filter
@@ -99,19 +163,33 @@ module ActivityNotification
99
163
  end
100
164
  end
101
165
 
166
+ # Sets view prefixes for target view path.
167
+ # @api protected
102
168
  def set_view_prefixes
103
169
  lookup_context.prefixes.prepend(target_view_path)
104
170
  end
105
171
 
172
+ # Returns JavaScript view for ajax request or redirects to back as default.
173
+ # @api protected
174
+ # @param [String] filter Filter option to load notification index (Nothing as auto, 'opened' or 'unopened')
175
+ # @param [String] limit Limit to query for notifications
176
+ # @return [Responce] JavaScript view for ajax request or redirects to back as default
106
177
  def return_back_or_ajax(filter, limit)
178
+ @notifications = load_notification_index(params[:filter], params[:limit]) if params[:reload].to_s.to_boolean(true)
107
179
  respond_to do |format|
108
180
  if request.xhr?
109
181
  format.js
182
+ # :skip-rails4:
183
+ elsif Rails::VERSION::MAJOR >= 5
184
+ redirect_back fallback_location: { action: :index }, filter: filter, limit: limit and return
185
+ # :skip-rails4:
186
+ # :skip-rails5:
110
187
  elsif request.referer
111
188
  redirect_to :back, filter: filter, limit: limit and return
112
189
  else
113
190
  redirect_to action: :index, filter: filter, limit: limit and return
114
191
  end
192
+ # :skip-rails5:
115
193
  end
116
194
  end
117
195
 
@@ -1,27 +1,36 @@
1
1
  module ActivityNotification
2
+ # Controller to manage notifications with Devise authentication.
2
3
  class NotificationsWithDeviseController < NotificationsController
3
4
  prepend_before_action :authenticate_devise_resource!
4
5
  before_action :authenticate_target!
5
6
 
6
7
  protected
7
8
 
9
+ # Authenticate devise resource by Devise (e.g. calling authenticate_user! method).
10
+ # @api protected
11
+ # @todo Needs to call authenticate method by more secure way
12
+ # @return [Responce] Redirects for unsigned in target by Devise, returns HTTP 403 without neccesary target method or returns 400 when request parameters are not enough
8
13
  def authenticate_devise_resource!
9
14
  if params[:devise_type].present?
10
15
  authenticate_method_name = "authenticate_#{params[:devise_type].to_resource_name}!"
11
16
  if respond_to?(authenticate_method_name)
12
17
  send(authenticate_method_name)
13
18
  else
14
- render text: "403 Forbidden: Unauthenticated", status: 403
19
+ render plain: "403 Forbidden: Unauthenticated", status: 403
15
20
  end
16
21
  else
17
- render text: "400 Bad Request: Missing parameter", status: 400
22
+ render plain: "400 Bad Request: Missing parameter", status: 400
18
23
  end
19
24
  end
20
25
 
26
+ # Authenticate the target of requested notification with authenticated devise resource.
27
+ # @api protected
28
+ # @todo Needs to call authenticate method by more secure way
29
+ # @return [Responce] Returns HTTP 403 for unauthorized target
21
30
  def authenticate_target!
22
31
  current_resource_method_name = "current_#{params[:devise_type].to_resource_name}"
23
32
  unless @target.authenticated_with_devise?(send(current_resource_method_name))
24
- render text: "403 Forbidden: Unauthorized target", status: 403
33
+ render plain: "403 Forbidden: Unauthorized target", status: 403
25
34
  end
26
35
  end
27
36
 
@@ -1,7 +1,10 @@
1
1
  if defined?(ActionMailer)
2
+ # Mailer for email notification of ActivityNotificaion.
2
3
  class ActivityNotification::Mailer < ActivityNotification.config.parent_mailer.constantize
3
4
  include ActivityNotification::Mailers::Helpers
4
5
 
6
+ # Sends notification email.
7
+ # @param [Notification] notification Notification instance to send email
5
8
  def send_notification_email(notification)
6
9
  if notification.target.notification_email_allowed?(notification.notifiable, notification.key) and
7
10
  notification.notifiable.notification_email_allowed?(notification.target, notification.key)
@@ -0,0 +1,13 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec path: '../'
4
+
5
+ gem 'rails', '~> 4.2.0'
6
+ gem 'sqlite3'
7
+ gem 'jquery-rails'
8
+
9
+ group :test do
10
+ gem 'ammeter'
11
+ gem 'timecop'
12
+ gem 'coveralls', require: false
13
+ end
@@ -0,0 +1,190 @@
1
+ PATH
2
+ remote: ../
3
+ specs:
4
+ activity_notification (0.0.9)
5
+ activerecord (>= 4.2.0)
6
+ i18n (>= 0.5.0)
7
+ railties (>= 4.2.0, < 5.1)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ actionmailer (4.2.7.1)
13
+ actionpack (= 4.2.7.1)
14
+ actionview (= 4.2.7.1)
15
+ activejob (= 4.2.7.1)
16
+ mail (~> 2.5, >= 2.5.4)
17
+ rails-dom-testing (~> 1.0, >= 1.0.5)
18
+ actionpack (4.2.7.1)
19
+ actionview (= 4.2.7.1)
20
+ activesupport (= 4.2.7.1)
21
+ rack (~> 1.6)
22
+ rack-test (~> 0.6.2)
23
+ rails-dom-testing (~> 1.0, >= 1.0.5)
24
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
25
+ actionview (4.2.7.1)
26
+ activesupport (= 4.2.7.1)
27
+ builder (~> 3.1)
28
+ erubis (~> 2.7.0)
29
+ rails-dom-testing (~> 1.0, >= 1.0.5)
30
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
31
+ activejob (4.2.7.1)
32
+ activesupport (= 4.2.7.1)
33
+ globalid (>= 0.3.0)
34
+ activemodel (4.2.7.1)
35
+ activesupport (= 4.2.7.1)
36
+ builder (~> 3.1)
37
+ activerecord (4.2.7.1)
38
+ activemodel (= 4.2.7.1)
39
+ activesupport (= 4.2.7.1)
40
+ arel (~> 6.0)
41
+ activesupport (4.2.7.1)
42
+ i18n (~> 0.7)
43
+ json (~> 1.7, >= 1.7.7)
44
+ minitest (~> 5.1)
45
+ thread_safe (~> 0.3, >= 0.3.4)
46
+ tzinfo (~> 1.1)
47
+ ammeter (1.1.3)
48
+ activesupport (>= 3.0)
49
+ railties (>= 3.0)
50
+ rspec-rails (>= 2.2)
51
+ arel (6.0.3)
52
+ bcrypt (3.1.11)
53
+ builder (3.2.2)
54
+ concurrent-ruby (1.0.2)
55
+ coveralls (0.8.15)
56
+ json (>= 1.8, < 3)
57
+ simplecov (~> 0.12.0)
58
+ term-ansicolor (~> 1.3)
59
+ thor (~> 0.19.1)
60
+ tins (>= 1.6.0, < 2)
61
+ devise (4.2.0)
62
+ bcrypt (~> 3.0)
63
+ orm_adapter (~> 0.1)
64
+ railties (>= 4.1.0, < 5.1)
65
+ responders
66
+ warden (~> 1.2.3)
67
+ diff-lcs (1.2.5)
68
+ docile (1.1.5)
69
+ erubis (2.7.0)
70
+ factory_girl (4.7.0)
71
+ activesupport (>= 3.0.0)
72
+ factory_girl_rails (4.7.0)
73
+ factory_girl (~> 4.7.0)
74
+ railties (>= 3.0.0)
75
+ globalid (0.3.7)
76
+ activesupport (>= 4.1.0)
77
+ i18n (0.7.0)
78
+ jquery-rails (4.2.1)
79
+ rails-dom-testing (>= 1, < 3)
80
+ railties (>= 4.2.0)
81
+ thor (>= 0.14, < 2.0)
82
+ json (1.8.3)
83
+ loofah (2.0.3)
84
+ nokogiri (>= 1.5.9)
85
+ mail (2.6.4)
86
+ mime-types (>= 1.16, < 4)
87
+ mime-types (3.1)
88
+ mime-types-data (~> 3.2015)
89
+ mime-types-data (3.2016.0521)
90
+ mini_portile2 (2.1.0)
91
+ minitest (5.9.0)
92
+ nokogiri (1.6.8)
93
+ mini_portile2 (~> 2.1.0)
94
+ pkg-config (~> 1.1.7)
95
+ orm_adapter (0.5.0)
96
+ pkg-config (1.1.7)
97
+ rack (1.6.4)
98
+ rack-test (0.6.3)
99
+ rack (>= 1.0)
100
+ rails (4.2.7.1)
101
+ actionmailer (= 4.2.7.1)
102
+ actionpack (= 4.2.7.1)
103
+ actionview (= 4.2.7.1)
104
+ activejob (= 4.2.7.1)
105
+ activemodel (= 4.2.7.1)
106
+ activerecord (= 4.2.7.1)
107
+ activesupport (= 4.2.7.1)
108
+ bundler (>= 1.3.0, < 2.0)
109
+ railties (= 4.2.7.1)
110
+ sprockets-rails
111
+ rails-deprecated_sanitizer (1.0.3)
112
+ activesupport (>= 4.2.0.alpha)
113
+ rails-dom-testing (1.0.7)
114
+ activesupport (>= 4.2.0.beta, < 5.0)
115
+ nokogiri (~> 1.6.0)
116
+ rails-deprecated_sanitizer (>= 1.0.1)
117
+ rails-html-sanitizer (1.0.3)
118
+ loofah (~> 2.0)
119
+ railties (4.2.7.1)
120
+ actionpack (= 4.2.7.1)
121
+ activesupport (= 4.2.7.1)
122
+ rake (>= 0.8.7)
123
+ thor (>= 0.18.1, < 2.0)
124
+ rake (11.2.2)
125
+ responders (2.3.0)
126
+ railties (>= 4.2.0, < 5.1)
127
+ rspec-core (3.5.2)
128
+ rspec-support (~> 3.5.0)
129
+ rspec-expectations (3.5.0)
130
+ diff-lcs (>= 1.2.0, < 2.0)
131
+ rspec-support (~> 3.5.0)
132
+ rspec-mocks (3.5.0)
133
+ diff-lcs (>= 1.2.0, < 2.0)
134
+ rspec-support (~> 3.5.0)
135
+ rspec-rails (3.5.2)
136
+ actionpack (>= 3.0)
137
+ activesupport (>= 3.0)
138
+ railties (>= 3.0)
139
+ rspec-core (~> 3.5.0)
140
+ rspec-expectations (~> 3.5.0)
141
+ rspec-mocks (~> 3.5.0)
142
+ rspec-support (~> 3.5.0)
143
+ rspec-support (3.5.0)
144
+ simplecov (0.12.0)
145
+ docile (~> 1.1.0)
146
+ json (>= 1.8, < 3)
147
+ simplecov-html (~> 0.10.0)
148
+ simplecov-html (0.10.0)
149
+ sprockets (3.7.0)
150
+ concurrent-ruby (~> 1.0)
151
+ rack (> 1, < 3)
152
+ sprockets-rails (3.1.1)
153
+ actionpack (>= 4.0)
154
+ activesupport (>= 4.0)
155
+ sprockets (>= 3.0.0)
156
+ sqlite3 (1.3.11)
157
+ term-ansicolor (1.3.2)
158
+ tins (~> 1.0)
159
+ thor (0.19.1)
160
+ thread_safe (0.3.5)
161
+ timecop (0.8.1)
162
+ tins (1.12.0)
163
+ tzinfo (1.2.2)
164
+ thread_safe (~> 0.1)
165
+ warden (1.2.6)
166
+ rack (>= 1.0)
167
+ yard (0.9.5)
168
+ yard-activesupport-concern (0.0.1)
169
+ yard (>= 0.8)
170
+
171
+ PLATFORMS
172
+ ruby
173
+
174
+ DEPENDENCIES
175
+ activity_notification!
176
+ ammeter
177
+ coveralls
178
+ devise (~> 4.2.0)
179
+ factory_girl_rails (~> 4.7.0)
180
+ jquery-rails
181
+ rails (~> 4.2.0)
182
+ rspec-rails (~> 3.5.1)
183
+ simplecov (~> 0.12.0)
184
+ sqlite3
185
+ timecop
186
+ yard (~> 0.9.5)
187
+ yard-activesupport-concern (~> 0.0.1)
188
+
189
+ BUNDLED WITH
190
+ 1.12.5