houston 2.2.3 → 2.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/Gemfile.lock +27 -24
  4. data/LICENSE +1 -1
  5. data/README.md +60 -15
  6. data/Rakefile +4 -8
  7. data/coverage/assets/{0.8.0 → 0.10.0}/application.css +0 -0
  8. data/coverage/assets/{0.8.0 → 0.10.0}/application.js +1079 -931
  9. data/coverage/assets/{0.8.0 → 0.10.0}/colorbox/border.png +0 -0
  10. data/coverage/assets/{0.8.0 → 0.10.0}/colorbox/controls.png +0 -0
  11. data/coverage/assets/{0.8.0 → 0.10.0}/colorbox/loading.gif +0 -0
  12. data/coverage/assets/{0.8.0 → 0.10.0}/colorbox/loading_background.png +0 -0
  13. data/coverage/assets/{0.7.1 → 0.10.0}/favicon_green.png +0 -0
  14. data/coverage/assets/{0.7.1 → 0.10.0}/favicon_red.png +0 -0
  15. data/coverage/assets/{0.7.1 → 0.10.0}/favicon_yellow.png +0 -0
  16. data/coverage/assets/{0.7.1 → 0.10.0}/loading.gif +0 -0
  17. data/coverage/assets/{0.7.1 → 0.10.0}/magnify.png +0 -0
  18. data/coverage/assets/{0.7.1 → 0.10.0}/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  19. data/coverage/assets/{0.7.1 → 0.10.0}/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  20. data/coverage/assets/{0.7.1 → 0.10.0}/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  21. data/coverage/assets/{0.7.1 → 0.10.0}/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  22. data/coverage/assets/{0.7.1 → 0.10.0}/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  23. data/coverage/assets/{0.7.1 → 0.10.0}/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  24. data/coverage/assets/{0.7.1 → 0.10.0}/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  25. data/coverage/assets/{0.7.1 → 0.10.0}/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  26. data/coverage/assets/{0.7.1 → 0.10.0}/smoothness/images/ui-icons_222222_256x240.png +0 -0
  27. data/coverage/assets/{0.7.1 → 0.10.0}/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  28. data/coverage/assets/{0.7.1 → 0.10.0}/smoothness/images/ui-icons_454545_256x240.png +0 -0
  29. data/coverage/assets/{0.7.1 → 0.10.0}/smoothness/images/ui-icons_888888_256x240.png +0 -0
  30. data/coverage/assets/{0.7.1 → 0.10.0}/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  31. data/coverage/index.html +296 -184
  32. data/houston.gemspec +17 -17
  33. data/lib/houston/client.rb +16 -8
  34. data/lib/houston/connection.rb +1 -1
  35. data/lib/houston/notification.rb +33 -30
  36. data/lib/houston/version.rb +1 -1
  37. data/spec/client_spec.rb +13 -13
  38. data/spec/notification_spec.rb +25 -21
  39. data/spec/spec_helper.rb +2 -2
  40. metadata +56 -97
  41. data/coverage/assets/0.7.1/application.css +0 -1110
  42. data/coverage/assets/0.7.1/application.js +0 -626
  43. data/coverage/assets/0.7.1/fancybox/blank.gif +0 -0
  44. data/coverage/assets/0.7.1/fancybox/fancy_close.png +0 -0
  45. data/coverage/assets/0.7.1/fancybox/fancy_loading.png +0 -0
  46. data/coverage/assets/0.7.1/fancybox/fancy_nav_left.png +0 -0
  47. data/coverage/assets/0.7.1/fancybox/fancy_nav_right.png +0 -0
  48. data/coverage/assets/0.7.1/fancybox/fancy_shadow_e.png +0 -0
  49. data/coverage/assets/0.7.1/fancybox/fancy_shadow_n.png +0 -0
  50. data/coverage/assets/0.7.1/fancybox/fancy_shadow_ne.png +0 -0
  51. data/coverage/assets/0.7.1/fancybox/fancy_shadow_nw.png +0 -0
  52. data/coverage/assets/0.7.1/fancybox/fancy_shadow_s.png +0 -0
  53. data/coverage/assets/0.7.1/fancybox/fancy_shadow_se.png +0 -0
  54. data/coverage/assets/0.7.1/fancybox/fancy_shadow_sw.png +0 -0
  55. data/coverage/assets/0.7.1/fancybox/fancy_shadow_w.png +0 -0
  56. data/coverage/assets/0.7.1/fancybox/fancy_title_left.png +0 -0
  57. data/coverage/assets/0.7.1/fancybox/fancy_title_main.png +0 -0
  58. data/coverage/assets/0.7.1/fancybox/fancy_title_over.png +0 -0
  59. data/coverage/assets/0.7.1/fancybox/fancy_title_right.png +0 -0
  60. data/coverage/assets/0.7.1/fancybox/fancybox-x.png +0 -0
  61. data/coverage/assets/0.7.1/fancybox/fancybox-y.png +0 -0
  62. data/coverage/assets/0.7.1/fancybox/fancybox.png +0 -0
  63. data/coverage/assets/0.8.0/favicon_green.png +0 -0
  64. data/coverage/assets/0.8.0/favicon_red.png +0 -0
  65. data/coverage/assets/0.8.0/favicon_yellow.png +0 -0
  66. data/coverage/assets/0.8.0/loading.gif +0 -0
  67. data/coverage/assets/0.8.0/magnify.png +0 -0
  68. data/coverage/assets/0.8.0/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  69. data/coverage/assets/0.8.0/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  70. data/coverage/assets/0.8.0/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  71. data/coverage/assets/0.8.0/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  72. data/coverage/assets/0.8.0/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  73. data/coverage/assets/0.8.0/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  74. data/coverage/assets/0.8.0/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  75. data/coverage/assets/0.8.0/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  76. data/coverage/assets/0.8.0/smoothness/images/ui-icons_222222_256x240.png +0 -0
  77. data/coverage/assets/0.8.0/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  78. data/coverage/assets/0.8.0/smoothness/images/ui-icons_454545_256x240.png +0 -0
  79. data/coverage/assets/0.8.0/smoothness/images/ui-icons_888888_256x240.png +0 -0
  80. data/coverage/assets/0.8.0/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  81. data/houston-2.2.2.gem +0 -0
@@ -1,27 +1,27 @@
1
1
  # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "houston/version"
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'houston/version'
4
4
 
5
5
  Gem::Specification.new do |s|
6
- s.name = "houston"
7
- s.authors = ["Mattt Thompson"]
8
- s.email = "m@mattt.me"
9
- s.license = "MIT"
10
- s.homepage = "http://nomad-cli.com"
6
+ s.name = 'houston'
7
+ s.authors = ['Mattt Thompson']
8
+ s.email = 'm@mattt.me'
9
+ s.license = 'MIT'
10
+ s.homepage = 'http://nomad-cli.com'
11
11
  s.version = Houston::VERSION
12
12
  s.platform = Gem::Platform::RUBY
13
- s.summary = "Send Apple Push Notifications"
14
- s.description = "Houston is a simple gem for sending Apple Push Notifications. Pass your credentials, construct your message, and send it."
13
+ s.summary = 'Send Apple Push Notifications'
14
+ s.description = 'Houston is a simple gem for sending Apple Push Notifications. Pass your credentials, construct your message, and send it.'
15
15
 
16
- s.add_dependency "commander", "~> 4.1"
17
- s.add_dependency "json"
16
+ s.add_dependency 'commander', '~> 4.4'
17
+ s.add_dependency 'json'
18
18
 
19
- s.add_development_dependency "rspec", "~> 3.0"
20
- s.add_development_dependency "rake"
21
- s.add_development_dependency "simplecov"
19
+ s.add_development_dependency 'rspec', '~> 3.5'
20
+ s.add_development_dependency 'rake'
21
+ s.add_development_dependency 'simplecov'
22
22
 
23
- s.files = Dir["./**/*"].reject { |file| file =~ /\.\/(bin|log|pkg|script|spec|test|vendor)/ }
23
+ s.files = Dir['./**/*'].reject { |file| file =~ /\.\/(bin|log|pkg|script|spec|test|vendor)/ }
24
24
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
25
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
26
- s.require_paths = ["lib"]
25
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
26
+ s.require_paths = ['lib']
27
27
  end
@@ -1,9 +1,9 @@
1
1
  module Houston
2
- APPLE_PRODUCTION_GATEWAY_URI = "apn://gateway.push.apple.com:2195"
3
- APPLE_PRODUCTION_FEEDBACK_URI = "apn://feedback.push.apple.com:2196"
2
+ APPLE_PRODUCTION_GATEWAY_URI = 'apn://gateway.push.apple.com:2195'
3
+ APPLE_PRODUCTION_FEEDBACK_URI = 'apn://feedback.push.apple.com:2196'
4
4
 
5
- APPLE_DEVELOPMENT_GATEWAY_URI = "apn://gateway.sandbox.push.apple.com:2195"
6
- APPLE_DEVELOPMENT_FEEDBACK_URI = "apn://feedback.sandbox.push.apple.com:2196"
5
+ APPLE_DEVELOPMENT_GATEWAY_URI = 'apn://gateway.sandbox.push.apple.com:2195'
6
+ APPLE_DEVELOPMENT_FEEDBACK_URI = 'apn://feedback.sandbox.push.apple.com:2196'
7
7
 
8
8
  class Client
9
9
  attr_accessor :gateway_uri, :feedback_uri, :certificate, :passphrase, :timeout
@@ -27,7 +27,7 @@ module Houston
27
27
  def initialize
28
28
  @gateway_uri = ENV['APN_GATEWAY_URI']
29
29
  @feedback_uri = ENV['APN_FEEDBACK_URI']
30
- @certificate = File.read(ENV['APN_CERTIFICATE']) if ENV['APN_CERTIFICATE']
30
+ @certificate = certificate_data
31
31
  @passphrase = ENV['APN_CERTIFICATE_PASSPHRASE']
32
32
  @timeout = Float(ENV['APN_TIMEOUT'] || 0.5)
33
33
  end
@@ -53,7 +53,7 @@ module Houston
53
53
  read_socket, write_socket = IO.select([ssl], [ssl], [ssl], nil)
54
54
  if (read_socket && read_socket[0])
55
55
  if error = connection.read(6)
56
- command, status, index = error.unpack("ccN")
56
+ command, status, index = error.unpack('ccN')
57
57
  notification.apns_error_code = status
58
58
  notification.mark_as_unsent!
59
59
  end
@@ -70,7 +70,7 @@ module Houston
70
70
  feedback = line.unpack('N1n1H140')
71
71
  timestamp = feedback[0]
72
72
  token = feedback[2].scan(/.{0,8}/).join(' ').strip
73
- devices << {token: token, timestamp: timestamp} if token && timestamp
73
+ devices << { token: token, timestamp: timestamp } if token && timestamp
74
74
  end
75
75
  end
76
76
 
@@ -78,7 +78,15 @@ module Houston
78
78
  end
79
79
 
80
80
  def devices
81
- unregistered_devices.collect{|device| device[:token]}
81
+ unregistered_devices.collect { |device| device[:token] }
82
+ end
83
+
84
+ def certificate_data
85
+ if ENV['APN_CERTIFICATE']
86
+ File.read(ENV['APN_CERTIFICATE'])
87
+ elsif ENV['APN_CERTIFICATE_DATA']
88
+ ENV['APN_CERTIFICATE_DATA']
89
+ end
82
90
  end
83
91
  end
84
92
  end
@@ -45,7 +45,7 @@ module Houston
45
45
  end
46
46
 
47
47
  def open?
48
- not (@ssl and @socket).nil?
48
+ not (@ssl && @socket).nil?
49
49
  end
50
50
 
51
51
  def close
@@ -5,17 +5,17 @@ module Houston
5
5
  class APNSError < RuntimeError
6
6
  # See: https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW12
7
7
  CODES = {
8
- 0 => "No errors encountered",
9
- 1 => "Processing error",
10
- 2 => "Missing device token",
11
- 3 => "Missing topic",
12
- 4 => "Missing payload",
13
- 5 => "Invalid token size",
14
- 6 => "Invalid topic size",
15
- 7 => "Invalid payload size",
16
- 8 => "Invalid token",
17
- 10 => "Shutdown",
18
- 255 => "Unknown error"
8
+ 0 => 'No errors encountered',
9
+ 1 => 'Processing error',
10
+ 2 => 'Missing device token',
11
+ 3 => 'Missing topic',
12
+ 4 => 'Missing payload',
13
+ 5 => 'Invalid token size',
14
+ 6 => 'Invalid topic size',
15
+ 7 => 'Invalid payload size',
16
+ 8 => 'Invalid token',
17
+ 10 => 'Shutdown',
18
+ 255 => 'Unknown error'
19
19
  }
20
20
 
21
21
  attr_reader :code
@@ -29,7 +29,8 @@ module Houston
29
29
 
30
30
  MAXIMUM_PAYLOAD_SIZE = 2048
31
31
 
32
- attr_accessor :token, :alert, :badge, :sound, :category, :content_available, :custom_data, :id, :expiry, :priority
32
+ attr_accessor :token, :alert, :badge, :sound, :category, :content_available, :mutable_content,
33
+ :custom_data, :id, :expiry, :priority
33
34
  attr_reader :sent_at
34
35
  attr_writer :apns_error_code
35
36
 
@@ -46,12 +47,13 @@ module Houston
46
47
  @id = options.delete(:id)
47
48
  @priority = options.delete(:priority)
48
49
  @content_available = options.delete(:content_available)
50
+ @mutable_content = options.delete(:mutable_content)
49
51
 
50
52
  @custom_data = options
51
53
  end
52
54
 
53
55
  def payload
54
- json = {}.merge(@custom_data || {}).inject({}){|h,(k,v)| h[k.to_s] = v; h}
56
+ json = {}.merge(@custom_data || {}).inject({}) { |h, (k, v)| h[k.to_s] = v; h }
55
57
 
56
58
  json['aps'] ||= {}
57
59
  json['aps']['alert'] = @alert if @alert
@@ -59,6 +61,7 @@ module Houston
59
61
  json['aps']['sound'] = @sound if @sound
60
62
  json['aps']['category'] = @category if @category
61
63
  json['aps']['content-available'] = 1 if @content_available
64
+ json['aps']['mutable-content'] = 1 if @mutable_content
62
65
 
63
66
  json
64
67
  end
@@ -89,30 +92,30 @@ module Houston
89
92
  end
90
93
 
91
94
  def error
92
- APNSError.new(@apns_error_code) if @apns_error_code and @apns_error_code.nonzero?
95
+ APNSError.new(@apns_error_code) if @apns_error_code && @apns_error_code.nonzero?
93
96
  end
94
97
 
95
98
  private
96
99
 
97
- def device_token_item
98
- [1, 32, @token.gsub(/[<\s>]/, '')].pack('cnH64')
99
- end
100
+ def device_token_item
101
+ [1, 32, @token.gsub(/[<\s>]/, '')].pack('cnH64')
102
+ end
100
103
 
101
- def payload_item
102
- json = payload.to_json
103
- [2, json.bytes.count, json].pack('cna*')
104
- end
104
+ def payload_item
105
+ json = payload.to_json
106
+ [2, json.bytes.count, json].pack('cna*')
107
+ end
105
108
 
106
- def identifier_item
107
- [3, 4, @id].pack('cnN') unless @id.nil?
108
- end
109
+ def identifier_item
110
+ [3, 4, @id].pack('cnN') unless @id.nil?
111
+ end
109
112
 
110
- def expiration_item
111
- [4, 4, @expiry.to_i].pack('cnN') unless @expiry.nil?
112
- end
113
+ def expiration_item
114
+ [4, 4, @expiry.to_i].pack('cnN') unless @expiry.nil?
115
+ end
113
116
 
114
- def priority_item
115
- [5, 1, @priority].pack('cnc') unless @priority.nil?
116
- end
117
+ def priority_item
118
+ [5, 1, @priority].pack('cnc') unless @priority.nil?
119
+ end
117
120
  end
118
121
  end
@@ -1,3 +1,3 @@
1
1
  module Houston
2
- VERSION = "2.2.3"
2
+ VERSION = '2.2.4'
3
3
  end
@@ -4,7 +4,7 @@ describe Houston::Client do
4
4
  subject { Houston::Client.development }
5
5
 
6
6
  before(:each) do
7
- stub_const("Houston::Connection", MockConnection)
7
+ stub_const('Houston::Connection', MockConnection)
8
8
  end
9
9
 
10
10
  context '#development' do
@@ -12,12 +12,12 @@ describe Houston::Client do
12
12
 
13
13
  describe '#gateway_uri' do
14
14
  subject { super().gateway_uri }
15
- it { should == Houston::APPLE_DEVELOPMENT_GATEWAY_URI}
15
+ it { should == Houston::APPLE_DEVELOPMENT_GATEWAY_URI }
16
16
  end
17
17
 
18
18
  describe '#feedback_uri' do
19
19
  subject { super().feedback_uri }
20
- it { should == Houston::APPLE_DEVELOPMENT_FEEDBACK_URI}
20
+ it { should == Houston::APPLE_DEVELOPMENT_FEEDBACK_URI }
21
21
  end
22
22
  end
23
23
 
@@ -26,21 +26,21 @@ describe Houston::Client do
26
26
 
27
27
  describe '#gateway_uri' do
28
28
  subject { super().gateway_uri }
29
- it { should == Houston::APPLE_PRODUCTION_GATEWAY_URI}
29
+ it { should == Houston::APPLE_PRODUCTION_GATEWAY_URI }
30
30
  end
31
31
 
32
32
  describe '#feedback_uri' do
33
33
  subject { super().feedback_uri }
34
- it { should == Houston::APPLE_PRODUCTION_FEEDBACK_URI}
34
+ it { should == Houston::APPLE_PRODUCTION_FEEDBACK_URI }
35
35
  end
36
36
  end
37
37
 
38
38
  context '#new' do
39
39
  context 'passing options through ENV' do
40
- ENV['APN_GATEWAY_URI'] = "apn://gateway.example.com"
41
- ENV['APN_FEEDBACK_URI'] = "apn://feedback.example.com"
42
- ENV['APN_CERTIFICATE_PASSPHRASE'] = "passphrase"
43
- ENV['APN_TIMEOUT'] = "10.0"
40
+ ENV['APN_GATEWAY_URI'] = 'apn://gateway.example.com'
41
+ ENV['APN_FEEDBACK_URI'] = 'apn://feedback.example.com'
42
+ ENV['APN_CERTIFICATE_PASSPHRASE'] = 'passphrase'
43
+ ENV['APN_TIMEOUT'] = '10.0'
44
44
 
45
45
  subject do
46
46
  Houston::Client.new
@@ -83,8 +83,8 @@ describe Houston::Client do
83
83
  describe '#unregistered_devices' do
84
84
  it 'should correctly parse the feedback response and create a dictionary of unregistered devices with timestamps' do
85
85
  expect(subject.unregistered_devices).to eq [
86
- {:token=>"ce8be627 2e43e855 16033e24 b4c28922 0eeda487 9c477160 b2545e95 b68b5969", :timestamp=>443779200},
87
- {:token=>"ce8be627 2e43e855 16033e24 b4c28922 0eeda487 9c477160 b2545e95 b68b5970", :timestamp=>1388678223}
86
+ { token: 'ce8be627 2e43e855 16033e24 b4c28922 0eeda487 9c477160 b2545e95 b68b5969', timestamp: 443779200 },
87
+ { token: 'ce8be627 2e43e855 16033e24 b4c28922 0eeda487 9c477160 b2545e95 b68b5970', timestamp: 1388678223 }
88
88
  ]
89
89
  end
90
90
  end
@@ -92,8 +92,8 @@ describe Houston::Client do
92
92
  describe '#devices' do
93
93
  it 'should correctly parse the feedback response and create an array of unregistered devices' do
94
94
  expect(subject.devices).to eq [
95
- "ce8be627 2e43e855 16033e24 b4c28922 0eeda487 9c477160 b2545e95 b68b5969",
96
- "ce8be627 2e43e855 16033e24 b4c28922 0eeda487 9c477160 b2545e95 b68b5970"
95
+ 'ce8be627 2e43e855 16033e24 b4c28922 0eeda487 9c477160 b2545e95 b68b5969',
96
+ 'ce8be627 2e43e855 16033e24 b4c28922 0eeda487 9c477160 b2545e95 b68b5970'
97
97
  ]
98
98
  end
99
99
  end
@@ -84,8 +84,7 @@ describe Houston::Notification do
84
84
 
85
85
  describe '#payload' do
86
86
  it 'should create a compliant dictionary' do
87
- expect(subject.payload).to eq({
88
- 'aps' => {
87
+ expect(subject.payload).to eq( 'aps' => {
89
88
  'alert' => 'Houston, we have a problem.',
90
89
  'badge' => 2701,
91
90
  'sound' => 'sosumi.aiff',
@@ -93,60 +92,65 @@ describe Houston::Notification do
93
92
  'content-available' => 1
94
93
  },
95
94
  'key1' => 1,
96
- 'key2' => 'abc'
97
- })
95
+ 'key2' => 'abc')
98
96
  end
99
97
 
100
98
  it 'should create a dictionary of only custom data and empty aps' do
101
- expect(Houston::Notification.new(key1: 123, key2: 'xyz').payload).to eq({
99
+ expect(Houston::Notification.new(key1: 123, key2: 'xyz').payload).to eq(
102
100
  'aps' => {},
103
101
  'key1' => 123,
104
102
  'key2' => 'xyz'
105
- })
103
+ )
106
104
  end
107
105
 
108
106
  it 'should create a dictionary only with alerts' do
109
- expect(Houston::Notification.new(alert: 'Hello, World!').payload).to eq({
107
+ expect(Houston::Notification.new(alert: 'Hello, World!').payload).to eq(
110
108
  'aps' => { 'alert' => 'Hello, World!' }
111
- })
109
+ )
112
110
  end
113
111
 
114
112
  it 'should create a dictionary only with badges' do
115
- expect(Houston::Notification.new(badge: '123').payload).to eq({
113
+ expect(Houston::Notification.new(badge: '123').payload).to eq(
116
114
  'aps' => { 'badge' => 123 }
117
- })
115
+ )
118
116
  end
119
117
 
120
118
  it 'should create a dictionary only with sound' do
121
- expect(Houston::Notification.new(sound: 'ring.aiff').payload).to eq({
119
+ expect(Houston::Notification.new(sound: 'ring.aiff').payload).to eq(
122
120
  'aps' => { 'sound' => 'ring.aiff' }
123
- })
121
+ )
124
122
  end
125
123
 
126
124
  it 'should create a dictionary only with category' do
127
- expect(Houston::Notification.new(category: 'INVITE_CATEGORY').payload).to eq({
125
+ expect(Houston::Notification.new(category: 'INVITE_CATEGORY').payload).to eq(
128
126
  'aps' => { 'category' => 'INVITE_CATEGORY' }
129
- })
127
+ )
130
128
  end
131
129
 
132
130
  it 'should create a dictionary only with content-available' do
133
- expect(Houston::Notification.new(content_available: true).payload).to eq({
131
+ expect(Houston::Notification.new(content_available: true).payload).to eq(
134
132
  'aps' => { 'content-available' => 1 }
135
- })
133
+ )
134
+ end
135
+
136
+ it 'should create a dictionary only with mutable-content' do
137
+ expect(Houston::Notification.new(mutable_content: true).payload).to eq(
138
+ 'aps' => { 'mutable-content' => 1 }
139
+ )
136
140
  end
137
141
 
138
142
  it 'should allow custom data inside aps key' do
139
143
  notification_options = { :badge => 567, 'aps' => { 'loc-key' => 'my-key' } }
140
- expect(Houston::Notification.new(notification_options).payload).to eq({
144
+ expect(Houston::Notification.new(notification_options).payload).to eq(
141
145
  'aps' => { 'loc-key' => 'my-key', 'badge' => 567 }
142
- })
146
+ )
143
147
  end
144
148
 
145
149
  it 'should create notification from hash with string and symbol keys' do
146
- notification_options = { :badge => 567, :aps => { 'loc-key' => 'my-key' } }
147
- expect(Houston::Notification.new(notification_options).payload['aps']).to eq({
150
+ notification_options = { badge: 567, aps: { 'loc-key' => 'my-key' } }
151
+ expect(Houston::Notification.new(notification_options).payload['aps']).to eq(
148
152
  'loc-key' => 'my-key', 'badge' => 567
149
- })
153
+ )
150
154
  end
151
155
  end
152
156
 
@@ -18,8 +18,8 @@ class MockConnection
18
18
 
19
19
  def initialize
20
20
  @unregistered_devices = [
21
- [443779200, 32, "ce8be6272e43e85516033e24b4c289220eeda4879c477160b2545e95b68b5969"],
22
- [1388678223, 32, "ce8be6272e43e85516033e24b4c289220eeda4879c477160b2545e95b68b5970"]
21
+ [443779200, 32, 'ce8be6272e43e85516033e24b4c289220eeda4879c477160b2545e95b68b5969'],
22
+ [1388678223, 32, 'ce8be6272e43e85516033e24b4c289220eeda4879c477160b2545e95b68b5970']
23
23
  ]
24
24
  end
25
25
 
metadata CHANGED
@@ -1,83 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: houston
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.3
4
+ version: 2.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mattt Thompson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-29 00:00:00.000000000 Z
11
+ date: 2017-01-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: commander
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '4.1'
19
+ version: '4.4'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '4.1'
26
+ version: '4.4'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: json
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '3.0'
47
+ version: '3.5'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '3.0'
54
+ version: '3.5'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: simplecov
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  description: Houston is a simple gem for sending Apple Push Notifications. Pass your
@@ -88,87 +88,46 @@ executables:
88
88
  extensions: []
89
89
  extra_rdoc_files: []
90
90
  files:
91
- - ./coverage/assets/0.7.1/application.css
92
- - ./coverage/assets/0.7.1/application.js
93
- - ./coverage/assets/0.7.1/fancybox/blank.gif
94
- - ./coverage/assets/0.7.1/fancybox/fancy_close.png
95
- - ./coverage/assets/0.7.1/fancybox/fancy_loading.png
96
- - ./coverage/assets/0.7.1/fancybox/fancy_nav_left.png
97
- - ./coverage/assets/0.7.1/fancybox/fancy_nav_right.png
98
- - ./coverage/assets/0.7.1/fancybox/fancy_shadow_e.png
99
- - ./coverage/assets/0.7.1/fancybox/fancy_shadow_n.png
100
- - ./coverage/assets/0.7.1/fancybox/fancy_shadow_ne.png
101
- - ./coverage/assets/0.7.1/fancybox/fancy_shadow_nw.png
102
- - ./coverage/assets/0.7.1/fancybox/fancy_shadow_s.png
103
- - ./coverage/assets/0.7.1/fancybox/fancy_shadow_se.png
104
- - ./coverage/assets/0.7.1/fancybox/fancy_shadow_sw.png
105
- - ./coverage/assets/0.7.1/fancybox/fancy_shadow_w.png
106
- - ./coverage/assets/0.7.1/fancybox/fancy_title_left.png
107
- - ./coverage/assets/0.7.1/fancybox/fancy_title_main.png
108
- - ./coverage/assets/0.7.1/fancybox/fancy_title_over.png
109
- - ./coverage/assets/0.7.1/fancybox/fancy_title_right.png
110
- - ./coverage/assets/0.7.1/fancybox/fancybox-x.png
111
- - ./coverage/assets/0.7.1/fancybox/fancybox-y.png
112
- - ./coverage/assets/0.7.1/fancybox/fancybox.png
113
- - ./coverage/assets/0.7.1/favicon_green.png
114
- - ./coverage/assets/0.7.1/favicon_red.png
115
- - ./coverage/assets/0.7.1/favicon_yellow.png
116
- - ./coverage/assets/0.7.1/loading.gif
117
- - ./coverage/assets/0.7.1/magnify.png
118
- - ./coverage/assets/0.7.1/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
119
- - ./coverage/assets/0.7.1/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
120
- - ./coverage/assets/0.7.1/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
121
- - ./coverage/assets/0.7.1/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
122
- - ./coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_dadada_1x400.png
123
- - ./coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
124
- - ./coverage/assets/0.7.1/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
125
- - ./coverage/assets/0.7.1/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
126
- - ./coverage/assets/0.7.1/smoothness/images/ui-icons_222222_256x240.png
127
- - ./coverage/assets/0.7.1/smoothness/images/ui-icons_2e83ff_256x240.png
128
- - ./coverage/assets/0.7.1/smoothness/images/ui-icons_454545_256x240.png
129
- - ./coverage/assets/0.7.1/smoothness/images/ui-icons_888888_256x240.png
130
- - ./coverage/assets/0.7.1/smoothness/images/ui-icons_cd0a0a_256x240.png
131
- - ./coverage/assets/0.8.0/application.css
132
- - ./coverage/assets/0.8.0/application.js
133
- - ./coverage/assets/0.8.0/colorbox/border.png
134
- - ./coverage/assets/0.8.0/colorbox/controls.png
135
- - ./coverage/assets/0.8.0/colorbox/loading.gif
136
- - ./coverage/assets/0.8.0/colorbox/loading_background.png
137
- - ./coverage/assets/0.8.0/favicon_green.png
138
- - ./coverage/assets/0.8.0/favicon_red.png
139
- - ./coverage/assets/0.8.0/favicon_yellow.png
140
- - ./coverage/assets/0.8.0/loading.gif
141
- - ./coverage/assets/0.8.0/magnify.png
142
- - ./coverage/assets/0.8.0/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
143
- - ./coverage/assets/0.8.0/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
144
- - ./coverage/assets/0.8.0/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
145
- - ./coverage/assets/0.8.0/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
146
- - ./coverage/assets/0.8.0/smoothness/images/ui-bg_glass_75_dadada_1x400.png
147
- - ./coverage/assets/0.8.0/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
148
- - ./coverage/assets/0.8.0/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
149
- - ./coverage/assets/0.8.0/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
150
- - ./coverage/assets/0.8.0/smoothness/images/ui-icons_222222_256x240.png
151
- - ./coverage/assets/0.8.0/smoothness/images/ui-icons_2e83ff_256x240.png
152
- - ./coverage/assets/0.8.0/smoothness/images/ui-icons_454545_256x240.png
153
- - ./coverage/assets/0.8.0/smoothness/images/ui-icons_888888_256x240.png
154
- - ./coverage/assets/0.8.0/smoothness/images/ui-icons_cd0a0a_256x240.png
155
- - ./coverage/index.html
156
- - ./Gemfile
157
- - ./Gemfile.lock
158
- - ./houston-2.2.2.gem
159
- - ./houston.gemspec
160
- - ./lib/houston/client.rb
161
- - ./lib/houston/connection.rb
162
- - ./lib/houston/notification.rb
163
- - ./lib/houston/version.rb
164
- - ./lib/houston.rb
165
- - ./LICENSE
166
- - ./Rakefile
167
- - ./README.md
91
+ - "./Gemfile"
92
+ - "./Gemfile.lock"
93
+ - "./LICENSE"
94
+ - "./README.md"
95
+ - "./Rakefile"
96
+ - "./coverage/assets/0.10.0/application.css"
97
+ - "./coverage/assets/0.10.0/application.js"
98
+ - "./coverage/assets/0.10.0/colorbox/border.png"
99
+ - "./coverage/assets/0.10.0/colorbox/controls.png"
100
+ - "./coverage/assets/0.10.0/colorbox/loading.gif"
101
+ - "./coverage/assets/0.10.0/colorbox/loading_background.png"
102
+ - "./coverage/assets/0.10.0/favicon_green.png"
103
+ - "./coverage/assets/0.10.0/favicon_red.png"
104
+ - "./coverage/assets/0.10.0/favicon_yellow.png"
105
+ - "./coverage/assets/0.10.0/loading.gif"
106
+ - "./coverage/assets/0.10.0/magnify.png"
107
+ - "./coverage/assets/0.10.0/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png"
108
+ - "./coverage/assets/0.10.0/smoothness/images/ui-bg_flat_75_ffffff_40x100.png"
109
+ - "./coverage/assets/0.10.0/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png"
110
+ - "./coverage/assets/0.10.0/smoothness/images/ui-bg_glass_65_ffffff_1x400.png"
111
+ - "./coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_dadada_1x400.png"
112
+ - "./coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png"
113
+ - "./coverage/assets/0.10.0/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png"
114
+ - "./coverage/assets/0.10.0/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png"
115
+ - "./coverage/assets/0.10.0/smoothness/images/ui-icons_222222_256x240.png"
116
+ - "./coverage/assets/0.10.0/smoothness/images/ui-icons_2e83ff_256x240.png"
117
+ - "./coverage/assets/0.10.0/smoothness/images/ui-icons_454545_256x240.png"
118
+ - "./coverage/assets/0.10.0/smoothness/images/ui-icons_888888_256x240.png"
119
+ - "./coverage/assets/0.10.0/smoothness/images/ui-icons_cd0a0a_256x240.png"
120
+ - "./coverage/index.html"
121
+ - "./houston.gemspec"
122
+ - "./lib/houston.rb"
123
+ - "./lib/houston/client.rb"
124
+ - "./lib/houston/connection.rb"
125
+ - "./lib/houston/notification.rb"
126
+ - "./lib/houston/version.rb"
127
+ - bin/apn
168
128
  - spec/client_spec.rb
169
129
  - spec/notification_spec.rb
170
130
  - spec/spec_helper.rb
171
- - bin/apn
172
131
  homepage: http://nomad-cli.com
173
132
  licenses:
174
133
  - MIT
@@ -179,17 +138,17 @@ require_paths:
179
138
  - lib
180
139
  required_ruby_version: !ruby/object:Gem::Requirement
181
140
  requirements:
182
- - - '>='
141
+ - - ">="
183
142
  - !ruby/object:Gem::Version
184
143
  version: '0'
185
144
  required_rubygems_version: !ruby/object:Gem::Requirement
186
145
  requirements:
187
- - - '>='
146
+ - - ">="
188
147
  - !ruby/object:Gem::Version
189
148
  version: '0'
190
149
  requirements: []
191
150
  rubyforge_project:
192
- rubygems_version: 2.1.11
151
+ rubygems_version: 2.6.8
193
152
  signing_key:
194
153
  specification_version: 4
195
154
  summary: Send Apple Push Notifications