activity_notification 1.7.1 → 2.0.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 (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