activity_notification 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.rubocop.yml +1 -1
  4. data/CHANGELOG.md +23 -11
  5. data/Gemfile.lock +52 -40
  6. data/README.md +177 -14
  7. data/activity_notification.gemspec +3 -1
  8. data/app/controllers/activity_notification/subscriptions_controller.rb +48 -2
  9. data/app/views/activity_notification/optional_targets/default/base/_default.text.erb +10 -0
  10. data/app/views/activity_notification/optional_targets/default/slack/_default.text.erb +6 -0
  11. data/app/views/activity_notification/subscriptions/default/_notification_keys.html.erb +19 -0
  12. data/app/views/activity_notification/subscriptions/default/_subscription.html.erb +32 -3
  13. data/app/views/activity_notification/subscriptions/default/index.html.erb +4 -0
  14. data/app/views/activity_notification/subscriptions/default/show.html.erb +5 -0
  15. data/app/views/activity_notification/subscriptions/default/subscribe_to_optional_target.js.erb +6 -0
  16. data/app/views/activity_notification/subscriptions/default/unsubscribe_to_optional_target.js.erb +6 -0
  17. data/gemfiles/Gemfile.rails-4.2.lock +15 -3
  18. data/gemfiles/Gemfile.rails-5.0.lock +47 -35
  19. data/lib/activity_notification.rb +1 -0
  20. data/lib/activity_notification/apis/notification_api.rb +83 -26
  21. data/lib/activity_notification/apis/subscription_api.rb +93 -8
  22. data/lib/activity_notification/common.rb +6 -2
  23. data/lib/activity_notification/helpers/view_helpers.rb +43 -0
  24. data/lib/activity_notification/models/concerns/notifiable.rb +73 -28
  25. data/lib/activity_notification/models/concerns/subscriber.rb +34 -7
  26. data/lib/activity_notification/models/concerns/target.rb +25 -13
  27. data/lib/activity_notification/models/subscription.rb +13 -2
  28. data/lib/activity_notification/optional_targets/amazon_sns.rb +42 -0
  29. data/lib/activity_notification/optional_targets/base.rb +79 -0
  30. data/lib/activity_notification/optional_targets/slack.rb +33 -0
  31. data/lib/activity_notification/rails/routes.rb +30 -20
  32. data/lib/activity_notification/roles/acts_as_notifiable.rb +70 -11
  33. data/lib/activity_notification/version.rb +1 -1
  34. data/lib/generators/activity_notification/views_generator.rb +2 -2
  35. data/lib/generators/templates/migrations/migration.rb +2 -2
  36. data/spec/concerns/apis/notification_api_spec.rb +97 -0
  37. data/spec/concerns/apis/subscription_api_spec.rb +206 -41
  38. data/spec/concerns/common_spec.rb +7 -2
  39. data/spec/concerns/models/notifiable_spec.rb +88 -2
  40. data/spec/concerns/models/subscriber_spec.rb +114 -13
  41. data/spec/concerns/models/target_spec.rb +17 -0
  42. data/spec/controllers/subscriptions_controller_shared_examples.rb +251 -28
  43. data/spec/helpers/view_helpers_spec.rb +56 -0
  44. data/spec/optional_targets/amazon_sns_spec.rb +46 -0
  45. data/spec/optional_targets/base_spec.rb +43 -0
  46. data/spec/optional_targets/slack_spec.rb +46 -0
  47. data/spec/rails_app/app/controllers/comments_controller.rb +1 -0
  48. data/spec/rails_app/app/models/admin.rb +1 -2
  49. data/spec/rails_app/app/models/article.rb +2 -3
  50. data/spec/rails_app/app/models/comment.rb +19 -7
  51. data/spec/rails_app/app/views/activity_notification/optional_targets/admins/amazon_sns/comment/_default.text.erb +8 -0
  52. data/spec/rails_app/db/migrate/20160715050420_create_activity_notification_tables.rb +1 -1
  53. data/spec/rails_app/db/migrate/20160715050433_create_test_tables.rb +2 -0
  54. data/spec/rails_app/db/schema.rb +3 -1
  55. data/spec/rails_app/db/seeds.rb +1 -1
  56. data/spec/rails_app/lib/custom_optional_targets/console_output.rb +13 -0
  57. data/spec/rails_app/lib/custom_optional_targets/wrong_target.rb +10 -0
  58. data/spec/roles/acts_as_notifiable_spec.rb +124 -2
  59. metadata +49 -4
  60. data/spec/rails_app/app/models/notification.rb +0 -6
@@ -31,5 +31,7 @@ Gem::Specification.new do |s|
31
31
  s.add_development_dependency 'simplecov', '~> 0.12.0'
32
32
  s.add_development_dependency 'yard', '~> 0.9.5'
33
33
  s.add_development_dependency 'yard-activesupport-concern', '~> 0.0.1'
34
- s.add_development_dependency "devise", '~> 4.2.0'
34
+ s.add_development_dependency 'devise', '~> 4.2.0'
35
+ s.add_development_dependency 'aws-sdk', '~> 2'
36
+ s.add_development_dependency 'slack-notifier', '~> 1.5.1'
35
37
  end
@@ -4,6 +4,7 @@ module ActivityNotification
4
4
  # Include CommonController to select target and define common methods
5
5
  include CommonController
6
6
  before_action :set_subscription, except: [:index, :create]
7
+ before_action :validate_optional_target_param, only: [:subscribe_to_optional_target, :unsubscribe_to_optional_target]
7
8
 
8
9
  # Shows subscription index of the target.
9
10
  #
@@ -75,13 +76,15 @@ module ActivityNotification
75
76
  # @overload open(params)
76
77
  # @param [Hash] params Request parameters
77
78
  # @option params [String] :with_email_subscription ('true') If the subscriber also subscribes notification email
79
+ # @option params [String] :with_optional_targets ('true') If the subscriber also subscribes optional targets
78
80
  # @option params [String] :filter (nil) Filter option to load subscription index (Nothing as all, 'configured' or 'unconfigured')
79
81
  # @option params [String] :limit (nil) Limit to query for subscriptions
80
82
  # @option params [String] :reverse ('false') If subscription index and unconfigured notification keys will be ordered as earliest first
81
83
  # @option params [String] :filtered_by_key (nil) Key of the subscription for filter
82
84
  # @return [Responce] JavaScript view for ajax request or redirects to back as default
83
85
  def subscribe
84
- @subscription.subscribe(with_email_subscription: params[:with_email_subscription].to_s.to_boolean(true))
86
+ @subscription.subscribe(with_email_subscription: params[:with_email_subscription].to_s.to_boolean(true),
87
+ with_optional_targets: params[:with_optional_targets].to_s.to_boolean(true))
85
88
  return_back_or_ajax
86
89
  end
87
90
 
@@ -130,6 +133,38 @@ module ActivityNotification
130
133
  return_back_or_ajax
131
134
  end
132
135
 
136
+ # Subscribes to the specified optional target.
137
+ #
138
+ # POST /:target_type/:target_id/subscriptions/:id/subscribe_to_optional_target
139
+ # @overload open(params)
140
+ # @param [Hash] params Request parameters
141
+ # @option params [required, String] :optional_target_name (nil) Class name of the optional target implementation (e.g. 'amazon_sns', 'slack')
142
+ # @option params [String] :filter (nil) Filter option to load subscription index (Nothing as all, 'configured' or 'unconfigured')
143
+ # @option params [String] :limit (nil) Limit to query for subscriptions
144
+ # @option params [String] :reverse ('false') If subscription index and unconfigured notification keys will be ordered as earliest first
145
+ # @option params [String] :filtered_by_key (nil) Key of the subscription for filter
146
+ # @return [Responce] JavaScript view for ajax request or redirects to back as default
147
+ def subscribe_to_optional_target
148
+ @subscription.subscribe_to_optional_target(params[:optional_target_name])
149
+ return_back_or_ajax
150
+ end
151
+
152
+ # Unsubscribes to the specified optional target.
153
+ #
154
+ # POST /:target_type/:target_id/subscriptions/:id/unsubscribe_to_optional_target
155
+ # @overload open(params)
156
+ # @param [Hash] params Request parameters
157
+ # @option params [required, String] :optional_target_name (nil) Class name of the optional target implementation (e.g. 'amazon_sns', 'slack')
158
+ # @option params [String] :filter (nil) Filter option to load subscription index (Nothing as all, 'configured' or 'unconfigured')
159
+ # @option params [String] :limit (nil) Limit to query for subscriptions
160
+ # @option params [String] :reverse ('false') If subscription index and unconfigured notification keys will be ordered as earliest first
161
+ # @option params [String] :filtered_by_key (nil) Key of the subscription for filter
162
+ # @return [Responce] JavaScript view for ajax request or redirects to back as default
163
+ def unsubscribe_to_optional_target
164
+ @subscription.unsubscribe_to_optional_target(params[:optional_target_name])
165
+ return_back_or_ajax
166
+ end
167
+
133
168
  protected
134
169
 
135
170
  # Sets @subscription instance variable from request parameters.
@@ -141,7 +176,11 @@ module ActivityNotification
141
176
 
142
177
  # Only allow a trusted parameter "white list" through.
143
178
  def subscription_params
144
- params.require(:subscription).permit(:key, :subscribing, :subscribing_to_email)
179
+ optional_targets = (params[:subscription][:optional_targets] || {}).keys.select { |key| key.to_s.start_with?("subscribing_to_") }
180
+ optional_targets.each do |optional_target_key|
181
+ params[:subscription][:optional_targets][optional_target_key] = params[:subscription][:optional_targets][optional_target_key].to_boolean
182
+ end
183
+ params.require(:subscription).permit(:key, :subscribing, :subscribing_to_email, optional_targets: optional_targets)
145
184
  end
146
185
 
147
186
  # Sets options to load subscription index from request parameters.
@@ -180,5 +219,12 @@ module ActivityNotification
180
219
  "activity_notification/subscriptions"
181
220
  end
182
221
 
222
+ # Validate optional_target_name param and return HTTP 400 unless it presents.
223
+ def validate_optional_target_param
224
+ if params[:optional_target_name].blank?
225
+ render plain: "400 Bad Request: Missing parameter", status: 400
226
+ end
227
+ end
228
+
183
229
  end
184
230
  end
@@ -0,0 +1,10 @@
1
+ Dear <%= @target.printable_target_name %>
2
+
3
+ <%= @notification.notifier.present? ? @notification.notifier.printable_notifier_name : 'Someone' %> notified you of <%= @notification.notifiable.printable_notifiable_name(@notification.target) %><%= " in #{@notification.group.printable_group_name}" if @notification.group.present? %>.
4
+
5
+ <%= "Move to notified #{@notification.notifiable.printable_type.downcase}:" %>
6
+ <%= move_notification_url_for(@notification, open: true) %>
7
+
8
+ Thank you!
9
+
10
+ <%= @notification.created_at.strftime("%b %d %H:%M") %>
@@ -0,0 +1,6 @@
1
+ <%= @slack_name.present? ? "Hi <@#{@slack_name}>," : "<!channel>," %>
2
+
3
+ <%= @notification.notifier.present? ? @notification.notifier.printable_notifier_name : 'Someone' %> notified you of <%= @notification.notifiable.printable_notifiable_name(@notification.target) %><%= " in #{@notification.group.printable_group_name}" if @notification.group.present? %>.
4
+
5
+ <%= "Move to notified #{@notification.notifiable.printable_type.downcase}:" %>
6
+ <%= move_notification_url_for(@notification, open: true) %>
@@ -45,6 +45,25 @@
45
45
  </div>
46
46
  </div>
47
47
 
48
+ <div class="field_wrapper subscribing_to_optional_targets <%= 'hidden' unless ActivityNotification.config.subscribe_as_default %>">
49
+ <% target.notifications.filtered_by_key(key).latest.optional_target_names.each do |optional_target_name| %>
50
+ <div class="field_label">
51
+ <label>
52
+ Optional tagret (<%= optional_target_name %>)
53
+ </label>
54
+ </div>
55
+ <div class="field">
56
+ <div class="ui checkbox">
57
+ <label>
58
+ <%= hidden_field_tag "subscription[optional_targets][#{ActivityNotification::Subscription.to_optional_target_key(optional_target_name)}]", 'false' %>
59
+ <%= check_box_tag "subscription[optional_targets][#{ActivityNotification::Subscription.to_optional_target_key(optional_target_name)}]", 'true', ActivityNotification.config.subscribe_as_default %>
60
+ <div class="slider"></div>
61
+ </label>
62
+ </div>
63
+ </div>
64
+ <% end %>
65
+ </div>
66
+
48
67
  <div class="ui button">
49
68
  <button type="submit">Configure subscription</button>
50
69
  </div>
@@ -18,18 +18,18 @@
18
18
  <div class="field">
19
19
  <div class="ui checkbox">
20
20
  <% if subscription.subscribing? %>
21
- <%= link_to unsubscribe_path_for(subscription, option_params), onclick: '$(this).find("input").prop("checked", false);$(this).parent().parent().parent().next().slideUp();', method: :post, remote: true do %>
21
+ <%= link_to unsubscribe_path_for(subscription, option_params), onclick: '$(this).find("input").prop("checked", false);$(this).parent().parent().parent().next().slideUp();;$(this).parent().parent().parent().next().next().slideUp();', method: :post, remote: true do %>
22
22
  <%= check_box :subscribing, "", { checked: true }, 'true', 'false' %>
23
23
  <div class="slider"></div>
24
24
  <% end %>
25
25
  <% else %>
26
26
  <% if ActivityNotification.config.subscribe_as_default %>
27
- <%= link_to subscribe_path_for(subscription, option_params), onclick: '$(this).find("input").prop("checked", true);$(this).parent().parent().parent().next().slideDown();$(this).parent().parent().parent().next().find("input").prop("checked", true);', method: :post, remote: true do %>
27
+ <%= link_to subscribe_path_for(subscription, option_params), onclick: '$(this).find("input").prop("checked", true);$(this).parent().parent().parent().next().slideDown();$(this).parent().parent().parent().next().find("input").prop("checked", true);$(this).parent().parent().parent().next().next().slideDown();$(this).parent().parent().parent().next().next().find("input").prop("checked", true);', method: :post, remote: true do %>
28
28
  <%= check_box :subscribing, "", { checked: false }, 'true', 'false' %>
29
29
  <div class="slider"></div>
30
30
  <% end %>
31
31
  <% else %>
32
- <%= link_to subscribe_path_for(subscription, option_params.merge(with_email_subscription: false)), onclick: '$(this).find("input").prop("checked", true);$(this).parent().parent().parent().next().slideDown();', method: :post, remote: true do %>
32
+ <%= link_to subscribe_path_for(subscription, option_params.merge(with_email_subscription: false)), onclick: '$(this).find("input").prop("checked", true);$(this).parent().parent().parent().next().slideDown();$(this).parent().parent().parent().next().next().slideDown();', method: :post, remote: true do %>
33
33
  <%= check_box :subscribing, "", { checked: false }, 'true', 'false' %>
34
34
  <div class="slider"></div>
35
35
  <% end %>
@@ -66,6 +66,35 @@
66
66
  </div>
67
67
  </div>
68
68
 
69
+ <div class="field_wrapper subscribing_to_optional_targets <%= 'hidden' unless subscription.subscribing? %>">
70
+ <% subscription.optional_target_names.each do |optional_target_name| %>
71
+ <div class="field_label">
72
+ <label>
73
+ Optional tagret (<%= optional_target_name %>)
74
+ </label>
75
+ </div>
76
+ <div class="field">
77
+ <div class="ui checkbox">
78
+ <% if subscription.subscribing_to_optional_target?(optional_target_name) %>
79
+ <%= link_to unsubscribe_to_optional_target_url_for(subscription, option_params.merge(optional_target_name: optional_target_name)), onclick: '$(this).find("input").prop("checked", false)', method: :post, remote: true do %>
80
+ <label>
81
+ <%= check_box optional_target_name, "", { checked: true }, 'true', 'false' %>
82
+ <div class="slider"></div>
83
+ </label>
84
+ <% end %>
85
+ <% else %>
86
+ <%= link_to subscribe_to_optional_target_url_for(subscription, option_params.merge(optional_target_name: optional_target_name)), onclick: '$(this).find("input").prop("checked", true)', method: :post, remote: true do %>
87
+ <label>
88
+ <%= check_box optional_target_name, "", { checked: false }, 'true', 'false' %>
89
+ <div class="slider"></div>
90
+ </label>
91
+ <% end %>
92
+ <% end %>
93
+ </div>
94
+ </div>
95
+ <% end %>
96
+ </div>
97
+
69
98
  <div class="ui button">
70
99
  <%#= link_to "Show", subscription_path_for(subscription, option_params), class: "button" %>
71
100
  <%= link_to "Destroy", subscription_path_for(subscription, option_params), method: :delete, remote: true, data: { confirm: 'Are you sure?' }, class: "button" %>
@@ -186,10 +186,14 @@
186
186
  if ($(this).prop('checked')) {
187
187
  $thisFieldWrapper.next().slideDown();
188
188
  $thisFieldWrapper.next().find("input[type='checkbox']").prop("checked", <%= ActivityNotification.config.subscribe_as_default %>);
189
+ $thisFieldWrapper.next().next().slideDown();
190
+ $thisFieldWrapper.next().next().find("input[type='checkbox']").prop("checked", <%= ActivityNotification.config.subscribe_as_default %>);
189
191
  } else {
190
192
  $thisFieldWrapper.next().slideUp();
193
+ $thisFieldWrapper.next().next().slideUp();
191
194
  setTimeout(function () {
192
195
  $thisFieldWrapper.next().find("input[type='checkbox']").prop("checked", false);
196
+ $thisFieldWrapper.next().next().find("input[type='checkbox']").prop("checked", false);
193
197
  }, 400);
194
198
  }
195
199
  })
@@ -165,10 +165,15 @@
165
165
  $thisFieldWrapper = $(this).parent().parent().parent().parent();
166
166
  if ($(this).prop('checked')) {
167
167
  $thisFieldWrapper.next().slideDown();
168
+ $thisFieldWrapper.next().find("input[type='checkbox']").prop("checked", <%= ActivityNotification.config.subscribe_as_default %>);
169
+ $thisFieldWrapper.next().next().slideDown();
170
+ $thisFieldWrapper.next().next().find("input[type='checkbox']").prop("checked", <%= ActivityNotification.config.subscribe_as_default %>);
168
171
  } else {
169
172
  $thisFieldWrapper.next().slideUp();
173
+ $thisFieldWrapper.next().next().slideUp();
170
174
  setTimeout(function () {
171
175
  $thisFieldWrapper.next().find("input[type='checkbox']").prop("checked", false);
176
+ $thisFieldWrapper.next().next().find("input[type='checkbox']").prop("checked", false);
172
177
  }, 400);
173
178
  }
174
179
  })
@@ -0,0 +1,6 @@
1
+ $("#subscriptions").html("<%= escape_javascript( render 'subscriptions', subscriptions: @subscriptions, option_params: @index_options ) %>");
2
+ $("#subscription").html("<%= escape_javascript( render 'subscription', subscription: @subscription, option_params: {} ) %>");
3
+ $("#notification_keys").html("<%= escape_javascript( render 'notification_keys', target: @target, notification_keys: @notification_keys, option_params: @index_options ) %>");
4
+ $("#subscription_form").html("<%= escape_javascript( render 'form', target: @target, option_params: @index_options ) %>");
5
+
6
+ loadSubscription();
@@ -0,0 +1,6 @@
1
+ $("#subscriptions").html("<%= escape_javascript( render 'subscriptions', subscriptions: @subscriptions, option_params: @index_options ) %>");
2
+ $("#subscription").html("<%= escape_javascript( render 'subscription', subscription: @subscription, option_params: {} ) %>");
3
+ $("#notification_keys").html("<%= escape_javascript( render 'notification_keys', target: @target, notification_keys: @notification_keys, option_params: @index_options ) %>");
4
+ $("#subscription_form").html("<%= escape_javascript( render 'form', target: @target, option_params: @index_options ) %>");
5
+
6
+ loadSubscription();
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../
3
3
  specs:
4
- activity_notification (1.1.0)
4
+ activity_notification (1.2.0)
5
5
  activerecord (>= 4.2.0)
6
6
  i18n (>= 0.5.0)
7
7
  jquery-rails (>= 3.1.1)
@@ -50,6 +50,14 @@ GEM
50
50
  railties (>= 3.0)
51
51
  rspec-rails (>= 2.2)
52
52
  arel (6.0.3)
53
+ aws-sdk (2.6.43)
54
+ aws-sdk-resources (= 2.6.43)
55
+ aws-sdk-core (2.6.43)
56
+ aws-sigv4 (~> 1.0)
57
+ jmespath (~> 1.0)
58
+ aws-sdk-resources (2.6.43)
59
+ aws-sdk-core (= 2.6.43)
60
+ aws-sigv4 (1.0.0)
53
61
  bcrypt (3.1.11)
54
62
  builder (3.2.2)
55
63
  concurrent-ruby (1.0.3)
@@ -76,7 +84,8 @@ GEM
76
84
  globalid (0.3.7)
77
85
  activesupport (>= 4.1.0)
78
86
  i18n (0.7.0)
79
- jquery-rails (4.2.1)
87
+ jmespath (1.3.1)
88
+ jquery-rails (4.2.2)
80
89
  rails-dom-testing (>= 1, < 3)
81
90
  railties (>= 4.2.0)
82
91
  thor (>= 0.14, < 2.0)
@@ -145,7 +154,8 @@ GEM
145
154
  json (>= 1.8, < 3)
146
155
  simplecov-html (~> 0.10.0)
147
156
  simplecov-html (0.10.0)
148
- sprockets (3.7.0)
157
+ slack-notifier (1.5.1)
158
+ sprockets (3.7.1)
149
159
  concurrent-ruby (~> 1.0)
150
160
  rack (> 1, < 3)
151
161
  sprockets-rails (3.2.0)
@@ -173,12 +183,14 @@ PLATFORMS
173
183
  DEPENDENCIES
174
184
  activity_notification!
175
185
  ammeter
186
+ aws-sdk (~> 2)
176
187
  coveralls
177
188
  devise (~> 4.2.0)
178
189
  factory_girl_rails (~> 4.8.0)
179
190
  rails (~> 4.2.0)
180
191
  rspec-rails (~> 3.5.1)
181
192
  simplecov (~> 0.12.0)
193
+ slack-notifier (~> 1.5.1)
182
194
  sqlite3 (~> 1.3.12)
183
195
  timecop
184
196
  yard (~> 0.9.5)
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../
3
3
  specs:
4
- activity_notification (1.1.0)
4
+ activity_notification (1.2.0)
5
5
  activerecord (>= 4.2.0)
6
6
  i18n (>= 0.5.0)
7
7
  jquery-rails (>= 3.1.1)
@@ -10,39 +10,39 @@ PATH
10
10
  GEM
11
11
  remote: https://rubygems.org/
12
12
  specs:
13
- actioncable (5.0.0.1)
14
- actionpack (= 5.0.0.1)
13
+ actioncable (5.0.1)
14
+ actionpack (= 5.0.1)
15
15
  nio4r (~> 1.2)
16
16
  websocket-driver (~> 0.6.1)
17
- actionmailer (5.0.0.1)
18
- actionpack (= 5.0.0.1)
19
- actionview (= 5.0.0.1)
20
- activejob (= 5.0.0.1)
17
+ actionmailer (5.0.1)
18
+ actionpack (= 5.0.1)
19
+ actionview (= 5.0.1)
20
+ activejob (= 5.0.1)
21
21
  mail (~> 2.5, >= 2.5.4)
22
22
  rails-dom-testing (~> 2.0)
23
- actionpack (5.0.0.1)
24
- actionview (= 5.0.0.1)
25
- activesupport (= 5.0.0.1)
23
+ actionpack (5.0.1)
24
+ actionview (= 5.0.1)
25
+ activesupport (= 5.0.1)
26
26
  rack (~> 2.0)
27
27
  rack-test (~> 0.6.3)
28
28
  rails-dom-testing (~> 2.0)
29
29
  rails-html-sanitizer (~> 1.0, >= 1.0.2)
30
- actionview (5.0.0.1)
31
- activesupport (= 5.0.0.1)
30
+ actionview (5.0.1)
31
+ activesupport (= 5.0.1)
32
32
  builder (~> 3.1)
33
33
  erubis (~> 2.7.0)
34
34
  rails-dom-testing (~> 2.0)
35
35
  rails-html-sanitizer (~> 1.0, >= 1.0.2)
36
- activejob (5.0.0.1)
37
- activesupport (= 5.0.0.1)
36
+ activejob (5.0.1)
37
+ activesupport (= 5.0.1)
38
38
  globalid (>= 0.3.6)
39
- activemodel (5.0.0.1)
40
- activesupport (= 5.0.0.1)
41
- activerecord (5.0.0.1)
42
- activemodel (= 5.0.0.1)
43
- activesupport (= 5.0.0.1)
39
+ activemodel (5.0.1)
40
+ activesupport (= 5.0.1)
41
+ activerecord (5.0.1)
42
+ activemodel (= 5.0.1)
43
+ activesupport (= 5.0.1)
44
44
  arel (~> 7.0)
45
- activesupport (5.0.0.1)
45
+ activesupport (5.0.1)
46
46
  concurrent-ruby (~> 1.0, >= 1.0.2)
47
47
  i18n (~> 0.7)
48
48
  minitest (~> 5.1)
@@ -52,6 +52,14 @@ GEM
52
52
  railties (>= 3.0)
53
53
  rspec-rails (>= 2.2)
54
54
  arel (7.1.4)
55
+ aws-sdk (2.6.43)
56
+ aws-sdk-resources (= 2.6.43)
57
+ aws-sdk-core (2.6.43)
58
+ aws-sigv4 (~> 1.0)
59
+ jmespath (~> 1.0)
60
+ aws-sdk-resources (2.6.43)
61
+ aws-sdk-core (= 2.6.43)
62
+ aws-sigv4 (1.0.0)
55
63
  bcrypt (3.1.11)
56
64
  builder (3.2.2)
57
65
  concurrent-ruby (1.0.3)
@@ -78,7 +86,8 @@ GEM
78
86
  globalid (0.3.7)
79
87
  activesupport (>= 4.1.0)
80
88
  i18n (0.7.0)
81
- jquery-rails (4.2.1)
89
+ jmespath (1.3.1)
90
+ jquery-rails (4.2.2)
82
91
  rails-dom-testing (>= 1, < 3)
83
92
  railties (>= 4.2.0)
84
93
  thor (>= 0.14, < 2.0)
@@ -100,17 +109,17 @@ GEM
100
109
  rack (2.0.1)
101
110
  rack-test (0.6.3)
102
111
  rack (>= 1.0)
103
- rails (5.0.0.1)
104
- actioncable (= 5.0.0.1)
105
- actionmailer (= 5.0.0.1)
106
- actionpack (= 5.0.0.1)
107
- actionview (= 5.0.0.1)
108
- activejob (= 5.0.0.1)
109
- activemodel (= 5.0.0.1)
110
- activerecord (= 5.0.0.1)
111
- activesupport (= 5.0.0.1)
112
+ rails (5.0.1)
113
+ actioncable (= 5.0.1)
114
+ actionmailer (= 5.0.1)
115
+ actionpack (= 5.0.1)
116
+ actionview (= 5.0.1)
117
+ activejob (= 5.0.1)
118
+ activemodel (= 5.0.1)
119
+ activerecord (= 5.0.1)
120
+ activesupport (= 5.0.1)
112
121
  bundler (>= 1.3.0, < 2.0)
113
- railties (= 5.0.0.1)
122
+ railties (= 5.0.1)
114
123
  sprockets-rails (>= 2.0.0)
115
124
  rails-controller-testing (1.0.1)
116
125
  actionpack (~> 5.x)
@@ -121,9 +130,9 @@ GEM
121
130
  nokogiri (~> 1.6.0)
122
131
  rails-html-sanitizer (1.0.3)
123
132
  loofah (~> 2.0)
124
- railties (5.0.0.1)
125
- actionpack (= 5.0.0.1)
126
- activesupport (= 5.0.0.1)
133
+ railties (5.0.1)
134
+ actionpack (= 5.0.1)
135
+ activesupport (= 5.0.1)
127
136
  method_source
128
137
  rake (>= 0.8.7)
129
138
  thor (>= 0.18.1, < 2.0)
@@ -152,7 +161,8 @@ GEM
152
161
  json (>= 1.8, < 3)
153
162
  simplecov-html (~> 0.10.0)
154
163
  simplecov-html (0.10.0)
155
- sprockets (3.7.0)
164
+ slack-notifier (1.5.1)
165
+ sprockets (3.7.1)
156
166
  concurrent-ruby (~> 1.0)
157
167
  rack (> 1, < 3)
158
168
  sprockets-rails (3.2.0)
@@ -183,6 +193,7 @@ PLATFORMS
183
193
  DEPENDENCIES
184
194
  activity_notification!
185
195
  ammeter
196
+ aws-sdk (~> 2)
186
197
  coveralls
187
198
  devise (~> 4.2.0)
188
199
  factory_girl_rails (~> 4.8.0)
@@ -190,6 +201,7 @@ DEPENDENCIES
190
201
  rails-controller-testing
191
202
  rspec-rails (~> 3.5.1)
192
203
  simplecov (~> 0.12.0)
204
+ slack-notifier (~> 1.5.1)
193
205
  sqlite3 (~> 1.3.12)
194
206
  timecop
195
207
  yard (~> 0.9.5)