activity_notification 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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)