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.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.travis.yml +5 -0
- data/.yardopts +3 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +50 -44
- data/README.md +242 -81
- data/Rakefile +13 -13
- data/activity_notification.gemspec +6 -8
- data/app/controllers/activity_notification/notifications_controller.rb +89 -11
- data/app/controllers/activity_notification/notifications_with_devise_controller.rb +12 -3
- data/app/mailers/activity_notification/mailer.rb +3 -0
- data/gemfiles/Gemfile.rails-4.2 +13 -0
- data/gemfiles/Gemfile.rails-4.2.lock +190 -0
- data/gemfiles/Gemfile.rails-5.0 +14 -0
- data/gemfiles/Gemfile.rails-5.0.lock +201 -0
- data/lib/activity_notification.rb +10 -6
- data/lib/activity_notification/apis/notification_api.rb +137 -27
- data/lib/activity_notification/common.rb +48 -24
- data/lib/activity_notification/config.rb +68 -10
- data/lib/activity_notification/controllers/store_controller.rb +13 -5
- data/lib/activity_notification/helpers/polymorphic_helpers.rb +17 -3
- data/lib/activity_notification/helpers/view_helpers.rb +161 -45
- data/lib/activity_notification/mailers/helpers.rb +121 -83
- data/lib/activity_notification/models/concerns/notifiable.rb +162 -69
- data/lib/activity_notification/models/concerns/notifier.rb +2 -0
- data/lib/activity_notification/models/concerns/target.rb +124 -25
- data/lib/activity_notification/models/notification.rb +168 -4
- data/lib/activity_notification/rails/routes.rb +50 -48
- data/lib/activity_notification/renderable.rb +106 -26
- data/lib/activity_notification/roles/acts_as_notifiable.rb +99 -26
- data/lib/activity_notification/roles/acts_as_notifier.rb +3 -0
- data/lib/activity_notification/roles/acts_as_target.rb +70 -0
- data/lib/activity_notification/version.rb +1 -1
- data/lib/generators/activity_notification/active_record/migration_generator.rb +3 -1
- data/lib/generators/activity_notification/controllers_generator.rb +5 -0
- data/lib/generators/activity_notification/install_generator.rb +7 -3
- data/lib/generators/activity_notification/models/notification_generator.rb +4 -2
- data/lib/generators/activity_notification/views_generator.rb +20 -0
- data/spec/concerns/apis/notification_api_spec.rb +105 -36
- data/spec/concerns/common_spec.rb +1 -1
- data/spec/concerns/models/notifiable_spec.rb +2 -2
- data/spec/concerns/models/notifier_spec.rb +1 -1
- data/spec/concerns/models/target_spec.rb +9 -8
- data/spec/controllers/notifications_controller_shared_examples.rb +101 -28
- data/spec/controllers/notifications_with_devise_controller_spec.rb +14 -4
- data/spec/helpers/view_helpers_spec.rb +3 -3
- data/spec/mailers/mailer_spec.rb +1 -1
- data/spec/models/notification_spec.rb +57 -3
- data/spec/rails_app/app/models/article.rb +1 -2
- data/spec/rails_app/app/models/comment.rb +8 -6
- data/spec/rails_app/app/models/user.rb +1 -1
- data/spec/rails_app/app/views/layouts/_header.html.erb +2 -0
- data/spec/rails_app/config/application.rb +3 -1
- data/spec/rails_app/config/environment.rb +12 -2
- data/spec/rails_app/config/environments/test.rb +11 -2
- data/spec/roles/acts_as_notifiable_spec.rb +2 -2
- data/spec/roles/acts_as_notifier_spec.rb +1 -1
- data/spec/roles/acts_as_target_spec.rb +3 -3
- data/spec/spec_helper.rb +6 -0
- metadata +35 -40
- data/spec/rails_app/app/models/concerns/.keep +0 -0
data/Rakefile
CHANGED
@@ -1,19 +1,19 @@
|
|
1
|
-
|
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
|
-
|
3
|
+
task default: :test
|
8
4
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
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 '
|
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', '>=
|
25
|
+
s.add_dependency 'activerecord', '>= 4.2.0'
|
27
26
|
|
28
|
-
s.add_development_dependency '
|
29
|
-
s.add_development_dependency
|
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 '
|
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
|
-
#
|
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
|
-
#
|
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
|
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
|
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
|
19
|
+
render plain: "403 Forbidden: Unauthenticated", status: 403
|
15
20
|
end
|
16
21
|
else
|
17
|
-
render
|
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
|
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,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
|