push-core 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -142,6 +142,35 @@ Push runs on Heroku with the following line in the `Procfile`.
142
142
 
143
143
  push: bundle exec push $RACK_ENV -f
144
144
 
145
+ ## Capistrano
146
+
147
+ Capistrano recipe using the pid file.
148
+ ```ruby
149
+ after "deploy:stop", "push:stop"
150
+ after "deploy:start", "push:start"
151
+ before "deploy:restart", "push:restart"
152
+
153
+ set(:pushd_pid_file) { "#{current_path}/tmp/pids/push_daemon.pid" }
154
+
155
+ namespace :push do
156
+ desc 'Start the push daemon'
157
+ task :start, :roles => :worker do
158
+ run "cd #{current_path} ; nohup bundle exec push #{rails_env} -p #{pushd_pid_file} >> #{current_path}/log/push.log 2>&1 &", :pty => false
159
+ end
160
+
161
+ desc 'Stop the push daemon'
162
+ task :stop, :roles => :worker do
163
+ run "if [ -d #{current_path} ] && [ -f #{pushd_pid_file} ] && kill -0 `cat #{pushd_pid_file}`> /dev/null 2>&1; then kill -SIGINT `cat #{pushd_pid_file}` ; else echo 'push daemon is not running'; fi"
164
+ end
165
+
166
+ desc "Restart the push daemon"
167
+ task :restart, :roles => :worker do
168
+ stop
169
+ start
170
+ end
171
+ end
172
+ ```
173
+
145
174
  ## Prerequisites
146
175
 
147
176
  * Rails 3.2.x
@@ -1,7 +1,7 @@
1
1
  module Push
2
2
  class Configuration < ActiveRecord::Base
3
3
  self.table_name = 'push_configurations'
4
- scope :enabled, where(:enabled => true)
4
+ scope :enabled, -> { where(:enabled => true) }
5
5
  validates :app, :presence => true
6
6
  validates :connections, :presence => true
7
7
  validates :connections, :numericality => { :greater_than => 0, :only_integer => true }
@@ -1,6 +1,7 @@
1
1
  module Push
2
2
  module Daemon
3
3
  class App
4
+ extend DatabaseReconnectable
4
5
  class << self
5
6
  attr_reader :apps
6
7
  end
@@ -8,12 +9,14 @@ module Push
8
9
  @apps = {}
9
10
 
10
11
  def self.load
11
- configurations = Push::Configuration.enabled
12
- configurations.each do |config|
13
- if @apps[config.app] == nil
14
- @apps[config.app] = App.new(config.app)
12
+ with_database_reconnect_and_retry('App.load') do
13
+ configurations = Push::Configuration.enabled
14
+ configurations.each do |config|
15
+ if @apps[config.app] == nil
16
+ @apps[config.app] = App.new(config.app)
17
+ end
18
+ @apps[config.app].configs << config
15
19
  end
16
- @apps[config.app].configs << config
17
20
  end
18
21
  end
19
22
 
@@ -3,8 +3,12 @@ module Push
3
3
  module DatabaseReconnectable
4
4
  def adaptor_errors
5
5
  errors = [ActiveRecord::StatementInvalid, ActiveRecord::ConnectionNotEstablished]
6
- errors << PGError if defined?(PGError)
7
- errors << Mysql2::Error if defined?(Mysql2)
6
+ if defined?(::PG::Error)
7
+ errors << ::PG::Error
8
+ elsif defined?(::PGError)
9
+ errors << ::PGError
10
+ end
11
+ errors << ::Mysql2::Error if defined?(::Mysql2)
8
12
  errors
9
13
  end
10
14
 
@@ -36,8 +40,13 @@ module Push
36
40
  end
37
41
 
38
42
  def reconnect_database
39
- ActiveRecord::Base.clear_all_connections!
40
- ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[ENV['RAILS_ENV']])
43
+ begin
44
+ ActiveRecord::Base.clear_all_connections!
45
+ rescue
46
+ Push::Daemon.logger.error("ActiveRecord::Base.clear_all_connections! failed")
47
+ ensure
48
+ ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[ENV['RAILS_ENV']])
49
+ end
41
50
  end
42
51
 
43
52
  def check_database_is_connected
@@ -37,7 +37,7 @@ module Push
37
37
 
38
38
  if @options[:foreground]
39
39
  puts formatted_msg
40
- else
40
+ elsif @logger
41
41
  @logger.send(where, formatted_msg)
42
42
  end
43
43
  end
@@ -45,8 +45,13 @@ module Push
45
45
  def open_log
46
46
  log_file = File.open(File.join(Rails.root, 'log', 'push.log'), 'a')
47
47
  log_file.sync = true
48
- @logger = ActiveSupport::BufferedLogger.new(log_file, Rails.logger.level)
49
- @logger.auto_flushing = Rails.logger.respond_to?(:auto_flushing) ? Rails.logger.auto_flushing : true
48
+
49
+ if defined?(ActiveSupport::BufferedLogger)
50
+ @logger = ActiveSupport::BufferedLogger.new(log_file, Rails.logger.level)
51
+ @logger.auto_flushing = Rails.logger.respond_to?(:auto_flushing) ? Rails.logger.auto_flushing : true
52
+ elsif defined?(ActiveSupport::Logger)
53
+ @logger = ActiveSupport::Logger.new(log_file, Rails.logger.level)
54
+ end
50
55
  end
51
56
 
52
57
  def error_notification(e, options)
@@ -3,7 +3,7 @@ module Push
3
3
  include Push::Daemon::DatabaseReconnectable
4
4
  self.table_name = 'push_feedback'
5
5
 
6
- scope :ready_for_followup, where(:processed => false)
6
+ scope :ready_for_followup, -> { where(:processed => false) }
7
7
  validates :app, :presence => true
8
8
  validates :device, :presence => true
9
9
  validates :follow_up, :presence => true
@@ -9,7 +9,7 @@ module Push
9
9
  validates :app, :presence => true
10
10
  validates :device, :presence => true
11
11
 
12
- scope :ready_for_delivery, lambda { where('delivered = ? AND failed = ? AND (deliver_after IS NULL OR deliver_after < ?)', false, false, Time.now) }
12
+ scope :ready_for_delivery, -> { where('delivered = ? AND failed = ? AND (deliver_after IS NULL OR deliver_after < ?)', false, false, Time.now) }
13
13
 
14
14
  def deliver(connection)
15
15
  begin
@@ -1,3 +1,3 @@
1
1
  module Push
2
- VERSION = "1.0.3"
2
+ VERSION = "1.0.4"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: push-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,24 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-05 00:00:00.000000000 Z
12
+ date: 2013-07-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ~>
19
+ - - ! '>'
20
20
  - !ruby/object:Gem::Version
21
- version: 3.2.1
21
+ version: '3.2'
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
- - - ~>
27
+ - - ! '>'
28
28
  - !ruby/object:Gem::Version
29
- version: 3.2.1
29
+ version: '3.2'
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: multi_json
32
32
  requirement: !ruby/object:Gem::Requirement