rpush 2.4.0 → 2.5.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 (67) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/README.md +11 -7
  4. data/lib/generators/templates/rpush.rb +8 -2
  5. data/lib/generators/templates/rpush_2_0_0_updates.rb +1 -1
  6. data/lib/rpush/cli.rb +61 -27
  7. data/lib/rpush/client/active_model.rb +3 -0
  8. data/lib/rpush/client/active_model/apns/notification.rb +1 -1
  9. data/lib/rpush/client/active_model/wns/app.rb +23 -0
  10. data/lib/rpush/client/active_model/wns/notification.rb +28 -0
  11. data/lib/rpush/client/active_model/wpns/notification.rb +11 -6
  12. data/lib/rpush/client/active_record.rb +3 -0
  13. data/lib/rpush/client/active_record/wns/app.rb +11 -0
  14. data/lib/rpush/client/active_record/wns/notification.rb +11 -0
  15. data/lib/rpush/client/mongoid.rb +3 -0
  16. data/lib/rpush/client/mongoid/apns/feedback.rb +3 -0
  17. data/lib/rpush/client/mongoid/notification.rb +6 -0
  18. data/lib/rpush/client/mongoid/wns/app.rb +14 -0
  19. data/lib/rpush/client/mongoid/wns/notification.rb +11 -0
  20. data/lib/rpush/client/redis.rb +3 -0
  21. data/lib/rpush/client/redis/wns/app.rb +14 -0
  22. data/lib/rpush/client/redis/wns/notification.rb +11 -0
  23. data/lib/rpush/configuration.rb +3 -7
  24. data/lib/rpush/daemon.rb +9 -0
  25. data/lib/rpush/daemon/apns/feedback_receiver.rb +5 -0
  26. data/lib/rpush/daemon/app_runner.rb +4 -5
  27. data/lib/rpush/daemon/dispatcher/apns_tcp.rb +47 -12
  28. data/lib/rpush/daemon/dispatcher_loop.rb +5 -0
  29. data/lib/rpush/daemon/feeder.rb +11 -0
  30. data/lib/rpush/daemon/interruptible_sleep.rb +8 -3
  31. data/lib/rpush/daemon/loggable.rb +4 -0
  32. data/lib/rpush/daemon/rpc.rb +9 -0
  33. data/lib/rpush/daemon/rpc/client.rb +27 -0
  34. data/lib/rpush/daemon/rpc/server.rb +82 -0
  35. data/lib/rpush/daemon/signal_handler.rb +7 -0
  36. data/lib/rpush/daemon/store/active_record.rb +17 -3
  37. data/lib/rpush/daemon/store/mongoid.rb +2 -2
  38. data/lib/rpush/daemon/store/redis.rb +2 -2
  39. data/lib/rpush/daemon/tcp_connection.rb +2 -2
  40. data/lib/rpush/daemon/wns.rb +9 -0
  41. data/lib/rpush/daemon/wns/delivery.rb +206 -0
  42. data/lib/rpush/embed.rb +15 -13
  43. data/lib/rpush/logger.rb +4 -0
  44. data/lib/rpush/plugin.rb +1 -1
  45. data/lib/rpush/push.rb +2 -11
  46. data/lib/rpush/reflection_collection.rb +15 -17
  47. data/lib/rpush/reflection_public_methods.rb +6 -4
  48. data/lib/rpush/version.rb +1 -1
  49. data/spec/functional/apns_spec.rb +1 -11
  50. data/spec/functional/cli_spec.rb +35 -0
  51. data/spec/functional_spec_helper.rb +11 -1
  52. data/spec/spec_helper.rb +4 -3
  53. data/spec/support/active_record_setup.rb +1 -1
  54. data/spec/unit/client/active_record/apns/notification_spec.rb +1 -1
  55. data/spec/unit/configuration_spec.rb +0 -7
  56. data/spec/unit/daemon/adm/delivery_spec.rb +2 -2
  57. data/spec/unit/daemon/app_runner_spec.rb +2 -3
  58. data/spec/unit/daemon/gcm/delivery_spec.rb +1 -1
  59. data/spec/unit/daemon/tcp_connection_spec.rb +1 -1
  60. data/spec/unit/daemon/wns/delivery_spec.rb +171 -0
  61. data/spec/unit/daemon/wpns/delivery_spec.rb +1 -1
  62. data/spec/unit/daemon_spec.rb +2 -0
  63. data/spec/unit/embed_spec.rb +4 -11
  64. data/spec/unit/logger_spec.rb +2 -2
  65. data/spec/unit/push_spec.rb +0 -7
  66. data/spec/unit_spec_helper.rb +1 -1
  67. metadata +20 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dcd5a386e63d453ba0a442b2636d17c9f5d1163d
4
- data.tar.gz: 6bcf897de27d5f489e237ec004883e0d31685741
3
+ metadata.gz: 8e562313c0e7b3ce34abf0013edf503f2f5dd4d2
4
+ data.tar.gz: 1b3e1799010d17074316c353e77f8bef16bf54a7
5
5
  SHA512:
6
- metadata.gz: a35052dca2662df7e86819c6e74eb9ea31fd892da03701c771924dd2c9858bd7b5f36e330cb9e5093300df4809cf627617115e9548514af62a0a4bab1437367d
7
- data.tar.gz: 1947d69afa9d7fd55688da01a0e5e25d62b4cde78b23c2b66a78b66a044c0fe05650851a2331108a2f2042a2a0133da96be22714484f7a965be15aea204c39dd
6
+ metadata.gz: bd1b05e4f6a848428b2d3f008e57806f062b9803605d2544b9ad45a26e4e2f90f56f1af095a56963d1e3f2b5edf835e07694b758bec2fca036171de3135543bc
7
+ data.tar.gz: 85f65b3f5278077a738dbbc10ae16f1eeae6ece50cfdde65c9333a053ea595551ce071aa9e68a52acdf9ce4710230bda6d9d866f97f69352fcc9e63ffdc23014
data/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## 2.5.0 (July 19, 2015)
2
+ Features:
3
+ * Add 'rpush status' to inspect running Rpush internal status.
4
+ * ActiveRecord logging is no longer redirected to rpush.log when embedded (#138).
5
+ * Support for WNS (Windows RT) (#137).
6
+ * Indexes added to some Mongoid fields (#151).
7
+ * Added support for Oracle.
8
+
9
+ Bug fixes:
10
+ * Fix for handling APNs error when using `rpush push` or `Rpush.push`.
11
+ * Fix backwards compatibility issue with ActiveRecord (#144).
12
+
1
13
  ## 2.4.0 (Fed 18, 2015)
2
14
  Features:
3
15
  * Support for MongoDB (using Mongoid).
data/README.md CHANGED
@@ -1,7 +1,5 @@
1
- [![Build Status](https://secure.travis-ci.org/rpush/rpush.svg?branch=master)](http://travis-ci.org/rpush/rpush)
2
- [![Code Climate](https://codeclimate.com/github/rpush/rpush/badges/gpa.svg)](https://codeclimate.com/github/rpush/rpush)
3
- [![Test Coverage](https://codeclimate.com/github/rpush/rpush/badges/coverage.svg)](https://codeclimate.com/github/rpush/rpush)
4
1
  [![Gem Version](https://badge.fury.io/rb/rpush.svg)](http://badge.fury.io/rb/rpush)
2
+ [![Join the chat at https://gitter.im/rpush/rpush](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/rpush/rpush?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
5
3
 
6
4
  <img src="https://raw.github.com/rpush/rpush/master/logo.png" align="right" width="200px" />
7
5
 
@@ -21,9 +19,9 @@ Rpush aims to be the *de facto* gem for sending push notifications in Ruby. Its
21
19
 
22
20
  * Use [**ActiveRecord**](https://github.com/rpush/rpush/wiki/Using-ActiveRecord), [**Redis**](https://github.com/rpush/rpush/wiki/Using-Redis) or [**MongoDB**](https://github.com/rpush/rpush/wiki/Using-Mongodb) for storage.
23
21
  * Plugins for [**Bugsnag**](https://github.com/rpush/rpush-plugin-bugsnag),
24
- [**Sentry**](https://github.com/rpush/rpush-plugin-sentry), [**StatsD**](https://github.com/rpush/rpush-plugin-statsd).
22
+ [**Sentry**](https://github.com/rpush/rpush-plugin-sentry), [**StatsD**](https://github.com/rpush/rpush-plugin-statsd) or [write your own](https://github.com/rpush/rpush/wiki/Writing-a-Plugin).
25
23
  * Seamless integration with your projects, including **Rails**.
26
- * Run as a [daemon](https://github.com/rpush/rpush#as-a-daemon-recommended), inside a [job queue](https://github.com/rpush/rpush/wiki/Push-API), on the [command-line](https://github.com/rpush/rpush#on-the-command-line) or [embedded](https://github.com/rpush/rpush/wiki/Embedding-API) in another process.
24
+ * Run as a [daemon](https://github.com/rpush/rpush#as-a-daemon), inside a [job queue](https://github.com/rpush/rpush/wiki/Push-API), on the [command-line](https://github.com/rpush/rpush#on-the-command-line) or [embedded](https://github.com/rpush/rpush/wiki/Embedding-API) in another process.
27
25
  * Scales vertically (threading) and horizontally (multiple processes).
28
26
  * Designed for uptime - new apps are loaded automatically, signal `HUP` to update running apps.
29
27
  * Hooks for fine-grained instrumentation and error handling ([Reflection API](https://github.com/rpush/rpush/wiki/Reflection-API)).
@@ -87,7 +85,7 @@ app.save!
87
85
  ```ruby
88
86
  n = Rpush::Gcm::Notification.new
89
87
  n.app = Rpush::Gcm::App.find_by_name("android_app")
90
- n.registration_ids = ["token", "..."]
88
+ n.registration_ids = ["..."]
91
89
  n.data = { message: "hi mom!" }
92
90
  n.save!
93
91
  ```
@@ -198,6 +196,7 @@ You should run `rpush init` after upgrading Rpush to check for configuration and
198
196
  * [Reflection API](https://github.com/rpush/rpush/wiki/Reflection-API)
199
197
  * [Push API](https://github.com/rpush/rpush/wiki/Push-API)
200
198
  * [Embedding API](https://github.com/rpush/rpush/wiki/Embedding-API)
199
+ * [Writing a Plugin](https://github.com/rpush/rpush/wiki/Writing-a-Plugin)
201
200
  * [Implementing your own storage backend](https://github.com/rpush/rpush/wiki/Implementing-your-own-storage-backend)
202
201
  * [Upgrading from 2.x to 3.0](https://github.com/rpush/rpush/wiki/Upgrading-from-version-2.x-to-3.0)
203
202
 
@@ -223,4 +222,9 @@ Note that the database username is changed at runtime to be the currently logged
223
222
  with mysql and you're using a user named 'bob', you will need to grant a mysql user 'bob' access to the 'rpush_test'
224
223
  mysql database.
225
224
 
226
- To switch between ActiveRecord and Redis, set the `CLIENT` environment variable to either `:active_record` or `:redis`.
225
+ To switch between ActiveRecord and Redis, set the `CLIENT` environment variable to either `active_record`, `redis` or `mongoid`.
226
+
227
+
228
+ [![Build Status](https://secure.travis-ci.org/rpush/rpush.svg?branch=master)](http://travis-ci.org/rpush/rpush)
229
+ [![Test Coverage](https://codeclimate.com/github/rpush/rpush/badges/coverage.svg)](https://codeclimate.com/github/rpush/rpush)
230
+ [![Code Climate](https://codeclimate.com/github/rpush/rpush/badges/gpa.svg)](https://codeclimate.com/github/rpush/rpush)
@@ -21,7 +21,7 @@ Rpush.configure do |config|
21
21
  # Path to log file. Relative to current directory unless absolute.
22
22
  config.log_file = 'log/rpush.log'
23
23
 
24
- config.log_level = (defined?(Rails) && Rails.logger) ? Rails.logger.level : ::Logger::Severity::DEBUG
24
+ config.log_level = (defined?(Rails) && Rails.logger) ? Rails.logger.level : ::Logger::Severity::INFO
25
25
 
26
26
  # Define a custom logger.
27
27
  # config.logger = MyLogger.new
@@ -29,7 +29,7 @@ Rpush.configure do |config|
29
29
  # config.apns.feedback_receiver.enabled = true
30
30
  # config.apns.feedback_receiver.frequency = 60
31
31
 
32
- end
32
+ end
33
33
 
34
34
  Rpush.reflect do |on|
35
35
 
@@ -123,6 +123,12 @@ Rpush.reflect do |on|
123
123
  # on.adm_failed_to_recipient do |notification, registration_id, reason|
124
124
  # end
125
125
 
126
+ # Called when Failed to deliver to WNS. Check the 'reason' string for further
127
+ # explanations.
128
+ # You should remove this uri from your records
129
+ # on.wns_invalid_channel do |notification, uri, reason|
130
+ # end
131
+
126
132
  # Called when an exception is raised.
127
133
  # on.error do |error|
128
134
  # end
@@ -58,7 +58,7 @@ class Rpush200Updates < ActiveRecord::Migration
58
58
 
59
59
  def self.adapter_name
60
60
  env = (defined?(Rails) && Rails.env) ? Rails.env : 'development'
61
- ActiveRecord::Base.configurations[env]['adapter']
61
+ Hash[ActiveRecord::Base.configurations[env].map { |k,v| [k.to_sym,v] }][:adapter]
62
62
  end
63
63
 
64
64
  def self.postgresql?
data/lib/rpush/cli.rb CHANGED
@@ -30,28 +30,23 @@ module Rpush
30
30
  option 'pid-file', type: :string, aliases: '-p'
31
31
  def stop
32
32
  config_setup
33
- ensure_pid_file_set
34
-
35
- if File.exist?(Rpush.config.pid_file)
36
- pid = File.read(Rpush.config.pid_file).strip.to_i
37
- STDOUT.write "* Stopping Rpush (pid #{pid})... "
38
- STDOUT.flush
39
- Process.kill('TERM', pid)
40
-
41
- loop do
42
- begin
43
- Process.getpgid(pid)
44
- sleep 0.05
45
- rescue Errno::ESRCH
46
- break
47
- end
33
+ pid = rpush_process_pid
34
+ return unless pid
35
+
36
+ STDOUT.write "* Stopping Rpush (pid #{pid})... "
37
+ STDOUT.flush
38
+ Process.kill('TERM', pid)
39
+
40
+ loop do
41
+ begin
42
+ Process.getpgid(pid)
43
+ sleep 0.05
44
+ rescue Errno::ESRCH
45
+ break
48
46
  end
49
-
50
- puts ANSI.green { '✔' }
51
- else
52
- STDERR.puts("* Rpush isn't running? #{Rpush.config.pid_file} does not exist.")
53
- return
54
47
  end
48
+
49
+ puts ANSI.green { '✔' }
55
50
  end
56
51
 
57
52
  desc 'init', 'Initialize Rpush into the current directory'
@@ -96,6 +91,15 @@ module Rpush
96
91
  Rpush.push
97
92
  end
98
93
 
94
+ desc 'status', 'Show the internal status of the running Rpush instance.'
95
+ def status
96
+ require 'rpush/daemon'
97
+ rpc = Rpush::Daemon::Rpc::Client.new(rpush_process_pid)
98
+ status = rpc.status
99
+ rpc.close
100
+ puts humanize_json(status)
101
+ end
102
+
99
103
  desc 'version', 'Print Rpush version'
100
104
  def version
101
105
  puts Rpush::VERSION
@@ -146,13 +150,6 @@ module Rpush
146
150
  self.class.default_config_path
147
151
  end
148
152
 
149
- def ensure_pid_file_set
150
- return unless Rpush.config.pid_file.blank?
151
-
152
- STDERR.puts(ANSI.red { 'ERROR: ' } + 'config.pid_file is not set.')
153
- exit 1
154
- end
155
-
156
153
  def check_ruby_version
157
154
  STDERR.puts(ANSI.yellow { 'WARNING: ' } + "You are using an old and unsupported version of Ruby.") if RUBY_VERSION <= '1.9.3' && RUBY_ENGINE == 'ruby'
158
155
  end
@@ -173,5 +170,42 @@ module Rpush
173
170
  new_options.freeze
174
171
  self.options = new_options
175
172
  end
173
+
174
+ def rpush_process_pid
175
+ if Rpush.config.pid_file.blank?
176
+ STDERR.puts(ANSI.red { 'ERROR: ' } + 'config.pid_file is not set.')
177
+ exit 1
178
+ end
179
+
180
+ unless File.exist?(Rpush.config.pid_file)
181
+ STDERR.puts("* Rpush isn't running? #{Rpush.config.pid_file} does not exist.")
182
+ exit 1
183
+ end
184
+
185
+ File.read(Rpush.config.pid_file).strip.to_i
186
+ end
187
+
188
+ def humanize_json(node, str = '', depth = 0) # rubocop:disable Metrics/PerceivedComplexity
189
+ if node.is_a?(Hash)
190
+ node = node.sort_by { |_, v| [Array, Hash].include?(v.class) ? 1 : 0 }
191
+ node.each do |k, v|
192
+ if [Array, Hash].include?(v.class)
193
+ str << "\n#{' ' * depth}#{k}:\n"
194
+ humanize_json(v, str, depth + 1)
195
+ else
196
+ str << "#{' ' * depth}#{k}: #{v}\n"
197
+ end
198
+ end
199
+ elsif node.is_a?(Array)
200
+ node.each do |v|
201
+ str << "\n" if v.is_a?(Hash)
202
+ humanize_json(v, str, depth)
203
+ end
204
+ else
205
+ str << "#{' ' * depth}#{node}\n"
206
+ end
207
+
208
+ str
209
+ end
176
210
  end
177
211
  end
@@ -19,3 +19,6 @@ require 'rpush/client/active_model/gcm/notification'
19
19
 
20
20
  require 'rpush/client/active_model/wpns/app'
21
21
  require 'rpush/client/active_model/wpns/notification'
22
+
23
+ require 'rpush/client/active_model/wns/app'
24
+ require 'rpush/client/active_model/wns/notification'
@@ -64,7 +64,7 @@ module Rpush
64
64
  json
65
65
  end
66
66
 
67
- def to_binary(options = {}) # rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity
67
+ def to_binary(options = {})
68
68
  frame_payload = payload
69
69
  frame_id = options[:for_validation] ? 0 : send(options.fetch(:id_attribute, :id))
70
70
  frame = ""
@@ -0,0 +1,23 @@
1
+ module Rpush
2
+ module Client
3
+ module ActiveModel
4
+ module Wns
5
+ module App
6
+ def self.included(base)
7
+ base.instance_eval do
8
+ validates :client_id, :client_secret, presence: true
9
+ end
10
+ end
11
+
12
+ def access_token_expired?
13
+ access_token_expiration.nil? || access_token_expiration < Time.now
14
+ end
15
+
16
+ def service_name
17
+ 'wns'
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,28 @@
1
+ module Rpush
2
+ module Client
3
+ module ActiveModel
4
+ module Wns
5
+ module Notification
6
+ module InstanceMethods
7
+ def alert=(value)
8
+ return unless value
9
+ data = self.data || {}
10
+ data['title'] = value
11
+ self.data = data
12
+ end
13
+ end
14
+
15
+ def self.included(base)
16
+ base.instance_eval do
17
+ include InstanceMethods
18
+
19
+ validates :uri, presence: true
20
+ validates :uri, format: { with: %r{https?://[\S]+} }
21
+ validates :data, presence: true
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -3,12 +3,7 @@ module Rpush
3
3
  module ActiveModel
4
4
  module Wpns
5
5
  module Notification
6
- def self.included(base)
7
- base.instance_eval do
8
- validates :uri, presence: true
9
- validates :uri, format: { with: %r{https?://[\S]+} }
10
- validates :data, presence: true
11
- end
6
+ module InstanceMethods
12
7
  def alert=(value)
13
8
  return unless value
14
9
  data = self.data || {}
@@ -16,6 +11,16 @@ module Rpush
16
11
  self.data = data
17
12
  end
18
13
  end
14
+
15
+ def self.included(base)
16
+ base.instance_eval do
17
+ include InstanceMethods
18
+
19
+ validates :uri, presence: true
20
+ validates :uri, format: { with: %r{https?://[\S]+} }
21
+ validates :data, presence: true
22
+ end
23
+ end
19
24
  end
20
25
  end
21
26
  end
@@ -15,5 +15,8 @@ require 'rpush/client/active_record/gcm/app'
15
15
  require 'rpush/client/active_record/wpns/notification'
16
16
  require 'rpush/client/active_record/wpns/app'
17
17
 
18
+ require 'rpush/client/active_record/wns/notification'
19
+ require 'rpush/client/active_record/wns/app'
20
+
18
21
  require 'rpush/client/active_record/adm/notification'
19
22
  require 'rpush/client/active_record/adm/app'
@@ -0,0 +1,11 @@
1
+ module Rpush
2
+ module Client
3
+ module ActiveRecord
4
+ module Wns
5
+ class App < Rpush::Client::ActiveRecord::App
6
+ include Rpush::Client::ActiveModel::Wns::App
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Rpush
2
+ module Client
3
+ module ActiveRecord
4
+ module Wns
5
+ class Notification < Rpush::Client::ActiveRecord::Notification
6
+ include Rpush::Client::ActiveModel::Wns::Notification
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -27,5 +27,8 @@ require 'rpush/client/mongoid/gcm/app'
27
27
  require 'rpush/client/mongoid/wpns/notification'
28
28
  require 'rpush/client/mongoid/wpns/app'
29
29
 
30
+ require 'rpush/client/mongoid/wns/notification'
31
+ require 'rpush/client/mongoid/wns/app'
32
+
30
33
  require 'rpush/client/mongoid/adm/notification'
31
34
  require 'rpush/client/mongoid/adm/app'
@@ -13,6 +13,9 @@ module Rpush
13
13
  validates :device_token, presence: true
14
14
  validates :failed_at, presence: true
15
15
 
16
+ index device_token: 1
17
+ index app_id: 1
18
+
16
19
  validates_with Rpush::Client::ActiveModel::Apns::DeviceTokenFormatValidator
17
20
  end
18
21
  end
@@ -3,6 +3,7 @@ module Rpush
3
3
  module Mongoid
4
4
  class Notification
5
5
  include ::Mongoid::Document
6
+ include ::Mongoid::Timestamps
6
7
  include ::Mongoid::Autoinc
7
8
  include Rpush::MultiJsonHelper
8
9
  include Rpush::Client::ActiveModel::Notification
@@ -36,6 +37,11 @@ module Rpush
36
37
  increments :integer_id, model_name: name
37
38
  index integer_id: 1
38
39
 
40
+ index delivered: 1, failed: 1, deliver_after: 1, processing: 1
41
+ index delivered: 1, failed: 1
42
+ index device_token: 1
43
+ index app_id: 1
44
+
39
45
  belongs_to :app
40
46
  end
41
47
  end
@@ -0,0 +1,14 @@
1
+ module Rpush
2
+ module Client
3
+ module Mongoid
4
+ module Wns
5
+ class App < Rpush::Client::Mongoid::App
6
+ include Rpush::Client::ActiveModel::Wns::App
7
+
8
+ field :access_token, type: String
9
+ field :access_token_expiration, type: Time
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ module Rpush
2
+ module Client
3
+ module Mongoid
4
+ module Wns
5
+ class Notification < Rpush::Client::Mongoid::Notification
6
+ include Rpush::Client::ActiveModel::Wns::Notification
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end