activity_notification 0.0.9 → 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
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