activity_notification 1.7.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +3 -0
  3. data/.travis.yml +16 -2
  4. data/CHANGELOG.md +22 -2
  5. data/Gemfile +7 -0
  6. data/Procfile +2 -0
  7. data/README.md +366 -32
  8. data/Rakefile +19 -10
  9. data/activity_notification.gemspec +5 -3
  10. data/app/channels/activity_notification/notification_channel.rb +37 -0
  11. data/app/channels/activity_notification/notification_with_devise_channel.rb +51 -0
  12. data/app/controllers/activity_notification/notifications_controller.rb +1 -1
  13. data/app/controllers/activity_notification/subscriptions_controller.rb +1 -1
  14. data/app/jobs/activity_notification/notify_all_job.rb +16 -0
  15. data/app/jobs/activity_notification/notify_job.rb +17 -0
  16. data/app/jobs/activity_notification/notify_to_job.rb +16 -0
  17. data/app/views/activity_notification/notifications/default/_default_without_grouping.html.erb +1 -1
  18. data/app/views/activity_notification/notifications/default/index.html.erb +55 -2
  19. data/bin/_dynamodblocal +4 -0
  20. data/{scripts → bin}/bundle_update.sh +1 -0
  21. data/bin/deploy_on_heroku.sh +14 -0
  22. data/bin/install_dynamodblocal.sh +5 -0
  23. data/bin/start_dynamodblocal.sh +47 -0
  24. data/bin/stop_dynamodblocal.sh +34 -0
  25. data/gemfiles/Gemfile.rails-4.2 +1 -0
  26. data/gemfiles/Gemfile.rails-5.0 +2 -0
  27. data/gemfiles/Gemfile.rails-5.1 +1 -0
  28. data/gemfiles/Gemfile.rails-5.2 +1 -0
  29. data/gemfiles/Gemfile.rails-6.0.rc +21 -0
  30. data/lib/activity_notification.rb +1 -0
  31. data/lib/activity_notification/apis/notification_api.rb +289 -136
  32. data/lib/activity_notification/apis/subscription_api.rb +80 -53
  33. data/lib/activity_notification/common.rb +3 -3
  34. data/lib/activity_notification/config.rb +89 -33
  35. data/lib/activity_notification/controllers/common_controller.rb +19 -7
  36. data/lib/activity_notification/helpers/errors.rb +4 -0
  37. data/lib/activity_notification/helpers/view_helpers.rb +1 -1
  38. data/lib/activity_notification/models/concerns/notifiable.rb +61 -53
  39. data/lib/activity_notification/models/concerns/subscriber.rb +7 -6
  40. data/lib/activity_notification/models/concerns/target.rb +73 -28
  41. data/lib/activity_notification/optional_targets/base.rb +2 -2
  42. data/lib/activity_notification/orm/active_record/notification.rb +4 -23
  43. data/lib/activity_notification/orm/dynamoid.rb +495 -0
  44. data/lib/activity_notification/orm/dynamoid/extension.rb +184 -0
  45. data/lib/activity_notification/orm/dynamoid/notification.rb +189 -0
  46. data/lib/activity_notification/orm/dynamoid/subscription.rb +82 -0
  47. data/lib/activity_notification/orm/mongoid.rb +4 -1
  48. data/lib/activity_notification/orm/mongoid/notification.rb +8 -25
  49. data/lib/activity_notification/orm/mongoid/subscription.rb +1 -1
  50. data/lib/activity_notification/roles/acts_as_notifiable.rb +33 -5
  51. data/lib/activity_notification/roles/acts_as_target.rb +62 -9
  52. data/lib/activity_notification/version.rb +1 -1
  53. data/lib/generators/templates/activity_notification.rb +30 -7
  54. data/lib/tasks/activity_notification_tasks.rake +14 -4
  55. data/spec/channels/notification_channel_shared_examples.rb +59 -0
  56. data/spec/channels/notification_channel_spec.rb +50 -0
  57. data/spec/channels/notification_with_devise_channel_spec.rb +99 -0
  58. data/spec/concerns/apis/notification_api_spec.rb +2 -2
  59. data/spec/concerns/apis/subscription_api_spec.rb +2 -2
  60. data/spec/concerns/models/notifiable_spec.rb +72 -7
  61. data/spec/concerns/models/subscriber_spec.rb +53 -49
  62. data/spec/concerns/models/target_spec.rb +135 -13
  63. data/spec/config_spec.rb +41 -1
  64. data/spec/controllers/notifications_controller_shared_examples.rb +7 -3
  65. data/spec/controllers/subscriptions_controller_shared_examples.rb +7 -3
  66. data/spec/helpers/view_helpers_spec.rb +12 -10
  67. data/spec/models/dummy/dummy_group_spec.rb +4 -0
  68. data/spec/models/dummy/dummy_notifiable_spec.rb +4 -0
  69. data/spec/models/dummy/dummy_notifier_spec.rb +4 -0
  70. data/spec/models/dummy/dummy_subscriber_spec.rb +3 -0
  71. data/spec/models/dummy/dummy_target_spec.rb +4 -0
  72. data/spec/models/notification_spec.rb +164 -45
  73. data/spec/models/subscription_spec.rb +69 -14
  74. data/spec/orm/dynamoid_spec.rb +115 -0
  75. data/spec/rails_app/app/assets/javascripts/application.js +2 -1
  76. data/spec/rails_app/app/assets/javascripts/cable.js +12 -0
  77. data/spec/rails_app/app/controllers/comments_controller.rb +3 -4
  78. data/spec/rails_app/app/models/admin.rb +6 -4
  79. data/spec/rails_app/app/models/article.rb +2 -2
  80. data/spec/rails_app/app/models/comment.rb +17 -5
  81. data/spec/rails_app/app/models/user.rb +5 -3
  82. data/spec/rails_app/app/views/activity_notification/notifications/users/overridden/custom/_test.html.erb +1 -0
  83. data/spec/rails_app/config/application.rb +6 -1
  84. data/spec/rails_app/config/cable.yml +8 -0
  85. data/spec/rails_app/config/dynamoid.rb +5 -0
  86. data/spec/rails_app/config/environment.rb +4 -1
  87. data/spec/rails_app/config/environments/production.rb +1 -1
  88. data/spec/rails_app/config/initializers/activity_notification.rb +30 -7
  89. data/spec/rails_app/config/locales/activity_notification.en.yml +2 -0
  90. data/spec/rails_app/db/seeds.rb +21 -5
  91. data/spec/rails_app/lib/mailer_previews/mailer_preview.rb +12 -4
  92. data/spec/roles/acts_as_notifiable_spec.rb +2 -2
  93. data/spec/roles/acts_as_target_spec.rb +1 -1
  94. data/spec/spec_helper.rb +15 -8
  95. metadata +67 -20
  96. data/spec/rails_app/app/models/.keep +0 -0
  97. data/spec/rails_app/app/views/activity_notification/notifications/users/overriden/custom/_test.html.erb +0 -1
data/Rakefile CHANGED
@@ -2,18 +2,27 @@ require "bundler/gem_tasks"
2
2
 
3
3
  task default: :test
4
4
 
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']
5
+ begin
6
+ require 'rspec/core'
7
+ require 'rspec/core/rake_task'
8
+ desc 'Run RSpec test for the activity_notification plugin.'
9
+ RSpec::Core::RakeTask.new(:test) do |spec|
10
+ spec.pattern = FileList['spec/**/*_spec.rb']
11
+ end
12
+ rescue LoadError
10
13
  end
11
14
 
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']
15
+ begin
16
+ require 'yard'
17
+ require 'yard/rake/yardoc_task'
18
+ desc 'Generate documentation for the activity_notification plugin.'
19
+ YARD::Rake::YardocTask.new do |doc|
20
+ doc.files = ['app/**/*.rb', 'lib/**/*.rb']
21
+ end
22
+ rescue LoadError
17
23
  end
18
24
 
19
25
  Bundler::GemHelper.install_tasks
26
+
27
+ require File.expand_path('../spec/rails_app/config/application', __FILE__)
28
+ Rails.application.load_tasks
@@ -20,14 +20,16 @@ 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 'railties', '>= 4.2.0', '< 5.3'
23
+ s.add_dependency 'railties', '>= 4.2.0', '< 6.1'
24
24
  s.add_dependency 'i18n', '>= 0.5.0'
25
25
  s.add_dependency 'jquery-rails', '>= 3.1.1'
26
26
 
27
- s.add_development_dependency 'sqlite3', '>= 1.3.13', '< 1.4.0'
27
+ s.add_development_dependency 'puma', '>= 3.12.0'
28
+ s.add_development_dependency 'sqlite3', '>= 1.3.13'
28
29
  s.add_development_dependency 'mysql2', '>= 0.5.2'
29
30
  s.add_development_dependency 'pg', '>= 1.0.0'
30
- s.add_development_dependency 'mongoid', '>= 4.0.0', '< 7.0.0'
31
+ s.add_development_dependency 'mongoid', '>= 4.0.0'
32
+ s.add_development_dependency 'dynamoid', '>= 3.0.0', '< 3.2.0'
31
33
  s.add_development_dependency 'rspec-rails', '>= 3.8.0'
32
34
  s.add_development_dependency 'factory_bot_rails', '>= 4.11.0', '< 5.0.0'
33
35
  s.add_development_dependency 'simplecov', '~> 0'
@@ -0,0 +1,37 @@
1
+ if defined?(ActionCable)
2
+ # Action Cable channel to subscribe broadcasted notifications.
3
+ class ActivityNotification::NotificationChannel < ActivityNotification.config.parent_channel.constantize
4
+ before_subscribe :set_target
5
+ before_subscribe :authenticate_target!
6
+
7
+ # ActionCable::Channel::Base#subscribed
8
+ # @see https://api.rubyonrails.org/classes/ActionCable/Channel/Base.html#method-i-subscribed
9
+ def subscribed
10
+ stream_from "#{ActivityNotification.config.notification_channel_prefix}_#{@target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{@target.id}"
11
+ rescue
12
+ reject
13
+ end
14
+
15
+ protected
16
+
17
+ # Sets @target instance variable from request parameters.
18
+ # @api protected
19
+ # @return [Object] Target instance (Reject subscription when request parameters are not enough)
20
+ def set_target
21
+ target_type = params[:target_type]
22
+ target_class = target_type.to_s.to_model_class
23
+ @target = params[:target_id].present? ?
24
+ target_class.find_by!(id: params[:target_id]) :
25
+ target_class.find_by!(id: params["#{target_type.to_s.to_resource_name}_id"])
26
+ rescue
27
+ reject
28
+ end
29
+
30
+ # Allow the target to subscribe notification channel if notification_action_cable_with_devise? returns false
31
+ # @api protected
32
+ # @return [Responce] Returns connected or rejected
33
+ def authenticate_target!
34
+ reject if @target.nil? || @target.notification_action_cable_with_devise?
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,51 @@
1
+ if defined?(ActionCable)
2
+ # Action Cable channel to subscribe broadcasted notifications with Devise authentication.
3
+ class ActivityNotification::NotificationWithDeviseChannel < ActivityNotification::NotificationChannel
4
+ # Include PolymorphicHelpers to resolve string extentions
5
+ include ActivityNotification::PolymorphicHelpers
6
+
7
+ protected
8
+
9
+ # Find current signed-in target from Devise session data.
10
+ # @api protected
11
+ # @param [String] devise_type Class name of authenticated Devise resource
12
+ # @return [Object] Current signed-in target
13
+ def find_current_target(devise_type = nil)
14
+ devise_type = (devise_type || @target.notification_devise_resource.class.name).to_s
15
+ devise_type.to_model_class.find(session["warden.user.#{devise_type.to_resource_name}.key"][0][0])
16
+ end
17
+
18
+ # Get current session from cookies.
19
+ # @api protected
20
+ # @return [Hash] Session from cookies
21
+ def session
22
+ @session ||= connection.__send__(:cookies).encrypted[Rails.application.config.session_options[:key]]
23
+ end
24
+
25
+ # Sets @target instance variable from request parameters.
26
+ # This method override super (ActivityNotiication::NotificationChannel#set_target)
27
+ # to set devise authenticated target when the target_id params is not specified.
28
+ # @api protected
29
+ # @return [Object] Target instance (Reject subscription when request parameters are not enough)
30
+ def set_target
31
+ reject and return if (target_type = params[:target_type]).blank?
32
+ if params[:target_id].blank? && params["#{target_type.to_s.to_resource_name}_id"].blank?
33
+ reject and return if params[:devise_type].blank?
34
+ current_target = find_current_target(params[:devise_type])
35
+ params[:target_id] = target_type.to_model_class.resolve_current_devise_target(current_target)
36
+ reject and return if params[:target_id].blank?
37
+ end
38
+ super
39
+ end
40
+
41
+ # Authenticate the target of requested notification with authenticated devise resource.
42
+ # @api protected
43
+ # @return [Responce] Returns connected or rejected
44
+ def authenticate_target!
45
+ current_resource = find_current_target
46
+ reject unless @target.authenticated_with_devise?(current_resource)
47
+ rescue
48
+ reject
49
+ end
50
+ end
51
+ end
@@ -156,7 +156,7 @@ module ActivityNotification
156
156
  end
157
157
 
158
158
  # Returns controller path.
159
- # This method is called from target_view_path method and can be overriden.
159
+ # This method is called from target_view_path method and can be overridden.
160
160
  # @api protected
161
161
  # @return [String] "activity_notification/notifications" as controller path
162
162
  def controller_path
@@ -213,7 +213,7 @@ module ActivityNotification
213
213
  end
214
214
 
215
215
  # Returns controller path.
216
- # This method is called from target_view_path method and can be overriden.
216
+ # This method is called from target_view_path method and can be overridden.
217
217
  # @api protected
218
218
  # @return [String] "activity_notification/subscriptions" as controller path
219
219
  def controller_path
@@ -1,7 +1,23 @@
1
1
  if defined?(ActiveJob)
2
+ # Job to generate notifications by ActivityNotification::Notification#notify_all method.
2
3
  class ActivityNotification::NotifyAllJob < ActivityNotification.config.parent_job.constantize
3
4
  queue_as ActivityNotification.config.active_job_queue
4
5
 
6
+ # Generates notifications to specified targets with ActiveJob.
7
+ #
8
+ # @param [Array<Object>] targets Targets to send notifications
9
+ # @param [Object] notifiable Notifiable instance
10
+ # @param [Hash] options Options for notifications
11
+ # @option options [String] :key (notifiable.default_notification_key) Key of the notification
12
+ # @option options [Object] :group (nil) Group unit of the notifications
13
+ # @option options [ActiveSupport::Duration] :group_expiry_delay (nil) Expiry period of a notification group
14
+ # @option options [Object] :notifier (nil) Notifier of the notifications
15
+ # @option options [Hash] :parameters ({}) Additional parameters of the notifications
16
+ # @option options [Boolean] :send_email (true) Whether it sends notification email
17
+ # @option options [Boolean] :send_later (true) Whether it sends notification email asynchronously
18
+ # @option options [Boolean] :publish_optional_targets (true) Whether it publishes notification to optional targets
19
+ # @option options [Hash<String, Hash>] :optional_targets ({}) Options for optional targets, keys are optional target name (:amazon_sns or :slack etc) and values are options
20
+ # @return [Array<Notificaion>] Array of generated notifications
5
21
  def perform(targets, notifiable, options = {})
6
22
  ActivityNotification::Notification.notify_all(targets, notifiable, options)
7
23
  end
@@ -1,7 +1,24 @@
1
1
  if defined?(ActiveJob)
2
+ # Job to generate notifications by ActivityNotification::Notification#notify method.
2
3
  class ActivityNotification::NotifyJob < ActivityNotification.config.parent_job.constantize
3
4
  queue_as ActivityNotification.config.active_job_queue
4
5
 
6
+ # Generates notifications to configured targets with notifiable model with ActiveJob.
7
+ #
8
+ # @param [Symbol, String, Class] target_type Type of target
9
+ # @param [Object] notifiable Notifiable instance
10
+ # @param [Hash] options Options for notifications
11
+ # @option options [String] :key (notifiable.default_notification_key) Key of the notification
12
+ # @option options [Object] :group (nil) Group unit of the notifications
13
+ # @option options [ActiveSupport::Duration] :group_expiry_delay (nil) Expiry period of a notification group
14
+ # @option options [Object] :notifier (nil) Notifier of the notifications
15
+ # @option options [Hash] :parameters ({}) Additional parameters of the notifications
16
+ # @option options [Boolean] :send_email (true) Whether it sends notification email
17
+ # @option options [Boolean] :send_later (true) Whether it sends notification email asynchronously
18
+ # @option options [Boolean] :publish_optional_targets (true) Whether it publishes notification to optional targets
19
+ # @option options [Boolean] :pass_full_options (false) Whether it passes full options to notifiable.notification_targets, not a key only
20
+ # @option options [Hash<String, Hash>] :optional_targets ({}) Options for optional targets, keys are optional target name (:amazon_sns or :slack etc) and values are options
21
+ # @return [Array<Notificaion>] Array of generated notifications
5
22
  def perform(target_type, notifiable, options = {})
6
23
  ActivityNotification::Notification.notify(target_type, notifiable, options)
7
24
  end
@@ -1,7 +1,23 @@
1
1
  if defined?(ActiveJob)
2
+ # Job to generate notifications by ActivityNotification::Notification#notify_to method.
2
3
  class ActivityNotification::NotifyToJob < ActivityNotification.config.parent_job.constantize
3
4
  queue_as ActivityNotification.config.active_job_queue
4
5
 
6
+ # Generates notifications to one target with ActiveJob.
7
+ #
8
+ # @param [Object] target Target to send notifications
9
+ # @param [Object] notifiable Notifiable instance
10
+ # @param [Hash] options Options for notifications
11
+ # @option options [String] :key (notifiable.default_notification_key) Key of the notification
12
+ # @option options [Object] :group (nil) Group unit of the notifications
13
+ # @option options [ActiveSupport::Duration] :group_expiry_delay (nil) Expiry period of a notification group
14
+ # @option options [Object] :notifier (nil) Notifier of the notifications
15
+ # @option options [Hash] :parameters ({}) Additional parameters of the notifications
16
+ # @option options [Boolean] :send_email (true) Whether it sends notification email
17
+ # @option options [Boolean] :send_later (true) Whether it sends notification email asynchronously
18
+ # @option options [Boolean] :publish_optional_targets (true) Whether it publishes notification to optional targets
19
+ # @option options [Hash<String, Hash>] :optional_targets ({}) Options for optional targets, keys are optional target name (:amazon_sns or :slack etc) and values are options
20
+ # @return [Notification] Generated notification instance
5
21
  def perform(target, notifiable, options = {})
6
22
  ActivityNotification::Notification.notify_to(target, notifiable, options)
7
23
  end
@@ -23,7 +23,7 @@
23
23
 
24
24
  <div class='<%= "notification_#{notification.id}" %>'>
25
25
  <% if notification.unopened? %>
26
- <%= link_to open_notification_path_for(notification, parameters.slice(:with_group_members, :routing_scope, :devise_default_routes).merge(reload: false), method: :post, remote: true, class: "unopened_wrapper" do %>
26
+ <%= link_to open_notification_path_for(notification, parameters.slice(:with_group_members, :routing_scope, :devise_default_routes).merge(reload: false)), method: :post, remote: true, class: "unopened_wrapper" do %>
27
27
  <div class="unopned_circle"></div>
28
28
  <div class="unopned_description_wrapper">
29
29
  <p class="unopned_description">Open</p>
@@ -1,13 +1,23 @@
1
1
  <div class="notification_wrapper">
2
2
  <div class="notification_header">
3
- <h1>Notifications to <%= @target.printable_target_name %> <%= link_to open_all_notifications_path_for(@target, @index_options.slice(:routing_scope, :devise_default_routes)), method: :post, remote: true do %><span class="notification_count"><span class="<%= 'unopened' if @target.has_unopened_notifications?(@index_options) %>"><%= @target.unopened_notification_count(@index_options) %></span></span><% end %></h1>
3
+ <h1>
4
+ Notifications to <%= @target.printable_target_name %>
5
+ <%= link_to open_all_notifications_path_for(@target, @index_options.slice(:routing_scope, :devise_default_routes)), method: :post, remote: true do %>
6
+ <span class="notification_count"><span class="<%= 'unopened' if @target.has_unopened_notifications?(@index_options) %>">
7
+ <%= @target.unopened_notification_count(@index_options) %>
8
+ </span></span>
9
+ <% end %>
10
+ </h1>
11
+ <h3>
12
+ <span class="action_cable_status">Disabled</span>
13
+ </h3>
4
14
  </div>
5
15
  <div class="notifications">
6
16
  <% if @index_options[:with_group_members] %>
7
17
  <%= render_notification @notifications, @index_options.slice(:routing_scope, :devise_default_routes).merge(fallback: :default_without_grouping, with_group_members: true) %>
8
18
  <% else %>
9
19
  <%= render_notification @notifications, @index_options.slice(:routing_scope, :devise_default_routes).merge(fallback: :default) %>
10
- <%#= render_notification @notifications, @index_options.merge(fallback: :text) %>
20
+ <%#= render_notification @notifications, @index_options.slice(:routing_scope, :devise_default_routes).merge(fallback: :text) %>
11
21
  <% end %>
12
22
  </div>
13
23
  </div>
@@ -28,3 +38,46 @@
28
38
  background-color: #f87880;
29
39
  }
30
40
  </style>
41
+
42
+ <% if @target.notification_action_cable_allowed? %>
43
+ <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/push.js/1.0.9/push.min.js"></script>
44
+ <script>
45
+ App.activity_notification = App.cable.subscriptions.create(
46
+ {
47
+ channel: "<%= @target.notification_action_cable_channel_class_name %>",
48
+ target_type: "<%= @target.to_class_name %>", target_id: "<%= @target.id %>"
49
+ },
50
+ {
51
+ connected: function() {
52
+ $(".action_cable_status").html("Online<%= " (authorized)" if @target.notification_action_cable_with_devise? %>");
53
+ },
54
+ disconnected: function() {
55
+ $(".action_cable_status").html("Offline");
56
+ },
57
+ rejected: function() {
58
+ $(".action_cable_status").html("Offline (unauthorized)");
59
+ },
60
+ received: function(notification) {
61
+ // Display notification
62
+ if (notification.group_owner_id == null) {
63
+ $(".notifications").prepend(notification.view);
64
+ $(".notification_count").html("<span class=unopened>" + notification.unopened_notification_count + "</span>");
65
+ } else {
66
+ $(".notification_" + notification.group_owner_id).remove();
67
+ $(".notifications").prepend(notification.group_owner_view);
68
+ $(".notification_count").html("<span class=unopened>" + notification.unopened_notification_count + "</span>");
69
+ }
70
+ // Push notificaion using Web Notification API by Push.js
71
+ Push.create('ActivityNotification', {
72
+ body: notification.text,
73
+ timeout: 5000,
74
+ onClick: function () {
75
+ location.href = notification.notifiable_path;
76
+ this.close();
77
+ }
78
+ });
79
+ }
80
+ }
81
+ );
82
+ </script>
83
+ <% end %>
@@ -0,0 +1,4 @@
1
+ DIST_DIR=spec/DynamoDBLocal-latest
2
+ PIDFILE=dynamodb.pid
3
+ LISTEN_PORT=8000
4
+ LOG_DIR="logs"
@@ -5,3 +5,4 @@ BUNDLE_GEMFILE=gemfiles/Gemfile.rails-4.2 bundle update
5
5
  BUNDLE_GEMFILE=gemfiles/Gemfile.rails-5.0 bundle update
6
6
  BUNDLE_GEMFILE=gemfiles/Gemfile.rails-5.1 bundle update
7
7
  BUNDLE_GEMFILE=gemfiles/Gemfile.rails-5.2 bundle update
8
+ BUNDLE_GEMFILE=gemfiles/Gemfile.rails-6.0.rc bundle update
@@ -0,0 +1,14 @@
1
+ #!/bin/bash
2
+
3
+ HEROKU_DEPLOYMENT_BRANCH=heroku-deployment
4
+
5
+ CURRENT_BRANCH=`git symbolic-ref --short HEAD`
6
+ git checkout -b $HEROKU_DEPLOYMENT_BRANCH
7
+ bundle install
8
+ sed -i "" -e "s/^\/Gemfile.lock/# \/Gemfile.lock/g" .gitignore
9
+ git add .gitignore
10
+ git add Gemfile.lock
11
+ git commit -m "Add Gemfile.lock"
12
+ git push heroku ${HEROKU_DEPLOYMENT_BRANCH}:master --force
13
+ git checkout $CURRENT_BRANCH
14
+ git branch -D $HEROKU_DEPLOYMENT_BRANCH
@@ -0,0 +1,5 @@
1
+ #!/bin/bash
2
+
3
+ wget https://s3-us-west-2.amazonaws.com/dynamodb-local/dynamodb_local_latest.zip --quiet -O spec/dynamodb_temp.zip
4
+ unzip -qq spec/dynamodb_temp.zip -d spec/DynamoDBLocal-latest
5
+ rm spec/dynamodb_temp.zip
@@ -0,0 +1,47 @@
1
+ #!/bin/sh
2
+
3
+ # Source variables
4
+ . $(dirname $0)/_dynamodblocal
5
+
6
+ if [ -z $JAVA_HOME ]; then
7
+ echo >&2 'ERROR: DynamoDBLocal requires JAVA_HOME to be set.'
8
+ exit 1
9
+ fi
10
+
11
+ if [ ! -x $JAVA_HOME/bin/java ]; then
12
+ echo >&2 'ERROR: JAVA_HOME is set, but I do not see the java executable there.'
13
+ exit 1
14
+ fi
15
+
16
+ cd $DIST_DIR
17
+
18
+ if [ ! -f DynamoDBLocal.jar ] || [ ! -d DynamoDBLocal_lib ]; then
19
+ echo >&2 "ERROR: Could not find DynamoDBLocal files in $DIST_DIR."
20
+ exit 1
21
+ fi
22
+
23
+ mkdir -p $LOG_DIR
24
+ echo "DynamoDB Local output will save to ${DIST_DIR}/${LOG_DIR}/"
25
+ hash lsof 2>/dev/null && lsof -i :$LISTEN_PORT && { echo >&2 "Something is already listening on port $LISTEN_PORT; I will not attempt to start DynamoDBLocal."; exit 1; }
26
+
27
+ NOW=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
28
+ nohup $JAVA_HOME/bin/java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -delayTransientStatuses -port $LISTEN_PORT -inMemory 1>"${LOG_DIR}/${NOW}.out.log" 2>"${LOG_DIR}/${NOW}.err.log" &
29
+ PID=$!
30
+
31
+ echo 'Verifying that DynamoDBLocal actually started...'
32
+
33
+ # Allow some seconds for the JDK to start and die.
34
+ counter=0
35
+ while [ $counter -le 5 ]; do
36
+ kill -0 $PID
37
+ if [ $? -ne 0 ]; then
38
+ echo >&2 'ERROR: DynamoDBLocal died after we tried to start it!'
39
+ exit 1
40
+ else
41
+ counter=$(($counter + 1))
42
+ sleep 1
43
+ fi
44
+ done
45
+
46
+ echo "DynamoDB Local started with pid $PID listening on port $LISTEN_PORT."
47
+ echo $PID > $PIDFILE
@@ -0,0 +1,34 @@
1
+ #!/bin/sh
2
+
3
+ # Source variables
4
+ . $(dirname $0)/_dynamodblocal
5
+
6
+ cd $DIST_DIR
7
+
8
+ if [ ! -f $PIDFILE ]; then
9
+ echo 'ERROR: There is no pidfile, so if DynamoDBLocal is running you will need to kill it yourself.'
10
+ exit 1
11
+ fi
12
+
13
+ pid=$(<$PIDFILE)
14
+
15
+ echo "Killing DynamoDBLocal at pid $pid..."
16
+ kill $pid
17
+
18
+ counter=0
19
+ while [ $counter -le 5 ]; do
20
+ kill -0 $pid 2>/dev/null
21
+ if [ $? -ne 0 ]; then
22
+ echo 'Successfully shut down DynamoDBLocal.'
23
+ rm -f $PIDFILE
24
+ exit 0
25
+ else
26
+ echo 'Still waiting for DynamoDBLocal to shut down...'
27
+ counter=$(($counter + 1))
28
+ sleep 1
29
+ fi
30
+ done
31
+
32
+ echo 'Unable to shut down DynamoDBLocal; you may need to kill it yourself.'
33
+ rm -f $PIDFILE
34
+ exit 1
@@ -3,6 +3,7 @@ source 'https://rubygems.org'
3
3
  gemspec path: '../'
4
4
 
5
5
  gem 'rails', '~> 4.2.0'
6
+ gem 'sqlite3', '~> 1.3.13'
6
7
  gem 'mysql2', '~> 0.4.10'
7
8
  gem 'pg', '~> 0.21.0'
8
9