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.
- 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
|