pubnub 4.2.5 → 4.5.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of pubnub might be problematic. Click here for more details.

Files changed (183) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CODEOWNERS +1 -0
  3. data/.pubnub.yml +168 -117
  4. data/.travis.yml +13 -9
  5. data/CHANGELOG.md +31 -8
  6. data/Gemfile.lock +67 -64
  7. data/README.md +56 -17
  8. data/VERSION +1 -1
  9. data/fixtures/vcr_cassettes/examples/add_channels_to_push/001.yml +45 -0
  10. data/fixtures/vcr_cassettes/examples/add_channels_to_push/002.yml +45 -0
  11. data/fixtures/vcr_cassettes/examples/add_channels_to_push/003.yml +45 -0
  12. data/fixtures/vcr_cassettes/examples/add_channels_to_push/004.yml +45 -0
  13. data/fixtures/vcr_cassettes/examples/grant/1913.yml +1 -1
  14. data/fixtures/vcr_cassettes/examples/grant/1944.yml +8 -9
  15. data/fixtures/vcr_cassettes/examples/grant/1945.yml +359 -9
  16. data/fixtures/vcr_cassettes/examples/grant/1946.yml +8 -9
  17. data/fixtures/vcr_cassettes/examples/grant/1947.yml +8 -9
  18. data/fixtures/vcr_cassettes/examples/grant/1948.yml +8 -9
  19. data/fixtures/vcr_cassettes/examples/history/100.yml +46 -0
  20. data/fixtures/vcr_cassettes/examples/history/include_meta__encrypted.yml +46 -0
  21. data/fixtures/vcr_cassettes/examples/history/include_token__encrypted.yml +45 -0
  22. data/fixtures/vcr_cassettes/examples/history/no_includes__encrypted.yml +45 -0
  23. data/fixtures/vcr_cassettes/examples/list_push_provisions/001.yml +46 -0
  24. data/fixtures/vcr_cassettes/examples/list_push_provisions/002.yml +45 -0
  25. data/fixtures/vcr_cassettes/examples/list_push_provisions/003.yml +45 -0
  26. data/fixtures/vcr_cassettes/examples/remove_channels_from_push/001.yml +45 -0
  27. data/fixtures/vcr_cassettes/examples/remove_channels_from_push/002.yml +45 -0
  28. data/fixtures/vcr_cassettes/examples/remove_channels_from_push/003.yml +45 -0
  29. data/fixtures/vcr_cassettes/examples/remove_device_from_push/001.yml +45 -0
  30. data/fixtures/vcr_cassettes/examples/remove_device_from_push/002.yml +45 -0
  31. data/fixtures/vcr_cassettes/examples/remove_device_from_push/003.yml +45 -0
  32. data/fixtures/vcr_cassettes/lib/events/get_all_channels_metadata.yml +39 -0
  33. data/fixtures/vcr_cassettes/lib/events/get_all_uuid_metadata.yml +76 -0
  34. data/fixtures/vcr_cassettes/lib/events/get_channel_members.yml +37 -0
  35. data/fixtures/vcr_cassettes/lib/events/get_channel_metadata.yml +37 -0
  36. data/fixtures/vcr_cassettes/lib/events/get_memberships1.yml +37 -0
  37. data/fixtures/vcr_cassettes/lib/events/get_memberships2.yml +37 -0
  38. data/fixtures/vcr_cassettes/lib/events/get_uuid_metadata1.yml +76 -0
  39. data/fixtures/vcr_cassettes/lib/events/get_uuid_metadata2.yml +76 -0
  40. data/fixtures/vcr_cassettes/lib/events/grant-error.yml +2 -2
  41. data/fixtures/vcr_cassettes/lib/events/grant.yml +10 -11
  42. data/fixtures/vcr_cassettes/lib/events/remove_channel_members.yml +78 -0
  43. data/fixtures/vcr_cassettes/lib/events/{delete_space.yml → remove_channel_metadata.yml} +5 -6
  44. data/fixtures/vcr_cassettes/lib/events/{manage_memberships_remove.yml → remove_memberships1.yml} +8 -9
  45. data/fixtures/vcr_cassettes/lib/events/{manage_members_add.yml → remove_memberships2.yml} +8 -9
  46. data/fixtures/vcr_cassettes/lib/events/remove_uuid_metadata1.yml +76 -0
  47. data/fixtures/vcr_cassettes/lib/events/remove_uuid_metadata2.yml +76 -0
  48. data/fixtures/vcr_cassettes/lib/events/set_channel_members.yml +39 -0
  49. data/fixtures/vcr_cassettes/lib/events/set_channel_metadata.yml +39 -0
  50. data/fixtures/vcr_cassettes/lib/events/{manage_memberships_add.yml → set_memberships1.yml} +8 -9
  51. data/fixtures/vcr_cassettes/lib/events/set_memberships2.yml +39 -0
  52. data/fixtures/vcr_cassettes/lib/events/set_uuid_metadata1.yml +78 -0
  53. data/fixtures/vcr_cassettes/lib/events/set_uuid_metadata2.yml +78 -0
  54. data/fixtures/vcr_cassettes/lib/events/{subscribe-space-delete-async.yml → subscribe-channel-metadata-remove-sync.yml} +12 -14
  55. data/fixtures/vcr_cassettes/lib/events/subscribe-channel-metadata-set-async.yml +75 -0
  56. data/fixtures/vcr_cassettes/lib/events/{subscribe-member-remove-async.yml → subscribe-member-remove-sync.yml} +12 -14
  57. data/fixtures/vcr_cassettes/lib/events/subscribe-member-set-async.yml +75 -0
  58. data/fixtures/vcr_cassettes/lib/events/subscribe-membership-remove-async.yml +12 -14
  59. data/fixtures/vcr_cassettes/lib/events/{subscribe-user-update-async.yml → subscribe-membership-set-async.yml} +12 -14
  60. data/fixtures/vcr_cassettes/lib/events/{subscribe-user-delete-async.yml → subscribe-uuid-metadata-remove-sync.yml} +12 -14
  61. data/fixtures/vcr_cassettes/lib/events/subscribe-uuid-metadata-set-async.yml +75 -0
  62. data/lib/pubnub/client.rb +18 -15
  63. data/lib/pubnub/client/events.rb +4 -2
  64. data/lib/pubnub/client/paged_history.rb +1 -1
  65. data/lib/pubnub/constants.rb +19 -18
  66. data/lib/pubnub/event.rb +32 -16
  67. data/lib/pubnub/event/formatter.rb +4 -0
  68. data/lib/pubnub/event/signature.rb +22 -7
  69. data/lib/pubnub/events/add_channels_to_push.rb +29 -13
  70. data/lib/pubnub/events/get_all_channels_metadata.rb +104 -0
  71. data/lib/pubnub/events/get_all_uuid_metadata.rb +104 -0
  72. data/lib/pubnub/events/get_channel_members.rb +120 -0
  73. data/lib/pubnub/events/{update_space.rb → get_channel_metadata.rb} +27 -27
  74. data/lib/pubnub/events/get_memberships.rb +120 -0
  75. data/lib/pubnub/events/{create_space.rb → get_uuid_metadata.rb} +27 -25
  76. data/lib/pubnub/events/grant.rb +10 -1
  77. data/lib/pubnub/events/history.rb +17 -2
  78. data/lib/pubnub/events/list_push_provisions.rb +29 -12
  79. data/lib/pubnub/events/remove_channel_members.rb +137 -0
  80. data/lib/pubnub/events/{delete_space.rb → remove_channel_metadata.rb} +12 -12
  81. data/lib/pubnub/events/remove_channels_from_push.rb +29 -13
  82. data/lib/pubnub/events/remove_device_from_push.rb +30 -14
  83. data/lib/pubnub/events/remove_memberships.rb +137 -0
  84. data/lib/pubnub/events/{delete_user.rb → remove_uuid_metadata.rb} +12 -12
  85. data/lib/pubnub/events/set_channel_members.rb +140 -0
  86. data/lib/pubnub/events/{manage_members.rb → set_channel_metadata.rb} +32 -38
  87. data/lib/pubnub/events/set_memberships.rb +140 -0
  88. data/lib/pubnub/events/{create_user.rb → set_uuid_metadata.rb} +33 -17
  89. data/lib/pubnub/formatter.rb +30 -3
  90. data/lib/pubnub/pam.rb +2 -11
  91. data/lib/pubnub/subscribe_callback.rb +1 -3
  92. data/lib/pubnub/subscribe_event/formatter.rb +26 -17
  93. data/lib/pubnub/subscriber.rb +5 -6
  94. data/lib/pubnub/validators/add_channels_to_push.rb +52 -0
  95. data/lib/pubnub/validators/get_all_channels_metadata.rb +29 -0
  96. data/lib/pubnub/validators/get_all_uuid_metadata.rb +29 -0
  97. data/lib/pubnub/validators/get_channel_members.rb +39 -0
  98. data/lib/pubnub/validators/get_channel_metadata.rb +39 -0
  99. data/lib/pubnub/validators/get_memberships.rb +39 -0
  100. data/lib/pubnub/validators/get_uuid_metadata.rb +39 -0
  101. data/lib/pubnub/validators/grant.rb +37 -2
  102. data/lib/pubnub/validators/list_push_provisions.rb +43 -0
  103. data/lib/pubnub/validators/remove_channel_members.rb +52 -0
  104. data/lib/pubnub/validators/remove_channel_metadata.rb +39 -0
  105. data/lib/pubnub/validators/remove_channels_from_push.rb +52 -0
  106. data/lib/pubnub/validators/remove_device_from_push.rb +43 -0
  107. data/lib/pubnub/validators/remove_memberships.rb +52 -0
  108. data/lib/pubnub/validators/remove_uuid_metadata.rb +39 -0
  109. data/lib/pubnub/validators/set_channel_members.rb +78 -0
  110. data/lib/pubnub/validators/set_channel_metadata.rb +62 -0
  111. data/lib/pubnub/validators/set_memberships.rb +78 -0
  112. data/lib/pubnub/validators/set_uuid_metadata.rb +62 -0
  113. data/lib/pubnub/version.rb +1 -1
  114. data/pubnub.gemspec +1 -1
  115. data/spec/examples/add_channels_to_push_spec.rb +178 -0
  116. data/spec/examples/{grant_examples_spec.rb → grant_examples_1_spec.rb} +0 -8973
  117. data/spec/examples/grant_examples_2_spec.rb +9107 -0
  118. data/spec/examples/history_examples_spec.rb +85 -0
  119. data/spec/examples/list_push_provisions_spec.rb +164 -0
  120. data/spec/examples/presence_examples_spec.rb +222 -186
  121. data/spec/examples/remove_channels_from_push_spec.rb +164 -0
  122. data/spec/examples/remove_device_from_push_spec.rb +164 -0
  123. data/spec/examples/revoke_examples_1_spec.rb +27013 -0
  124. data/spec/examples/revoke_examples_2_spec.rb +27012 -0
  125. data/spec/examples/revoke_examples_3_spec.rb +17967 -0
  126. data/spec/examples/status_request_message_count_exceeded_spec.rb +4 -1
  127. data/spec/examples/subscribe_examples_1_spec.rb +26972 -0
  128. data/spec/examples/subscribe_examples_2_spec.rb +19575 -0
  129. data/spec/lib/connection_callback_spec.rb +4 -3
  130. data/spec/lib/event/formatter_spec.rb +22 -0
  131. data/spec/lib/events/channel_metadata_spec.rb +58 -0
  132. data/spec/lib/events/grant_spec.rb +3 -2
  133. data/spec/lib/events/membership_spec.rb +51 -21
  134. data/spec/lib/events/presence_delta_spec.rb +9 -6
  135. data/spec/lib/events/presence_spec.rb +13 -7
  136. data/spec/lib/events/subscribe_spec.rb +102 -65
  137. data/spec/lib/events/uuid_metadata_spec.rb +86 -0
  138. data/spec/lib/subscribe_event/formatter_spec.rb +22 -0
  139. data/spec/lib/super_admin_spec.rb +8 -4
  140. data/spec/spec_helper.rb +24 -8
  141. metadata +124 -79
  142. data/fixtures/vcr_cassettes/lib/events/create_space.yml +0 -40
  143. data/fixtures/vcr_cassettes/lib/events/create_user.yml +0 -40
  144. data/fixtures/vcr_cassettes/lib/events/delete_user.yml +0 -38
  145. data/fixtures/vcr_cassettes/lib/events/get_members.yml +0 -38
  146. data/fixtures/vcr_cassettes/lib/events/get_space.yml +0 -38
  147. data/fixtures/vcr_cassettes/lib/events/get_space_memberships.yml +0 -38
  148. data/fixtures/vcr_cassettes/lib/events/get_spaces.yml +0 -40
  149. data/fixtures/vcr_cassettes/lib/events/get_user.yml +0 -38
  150. data/fixtures/vcr_cassettes/lib/events/get_users.yml +0 -40
  151. data/fixtures/vcr_cassettes/lib/events/manage_members_remove.yml +0 -83
  152. data/fixtures/vcr_cassettes/lib/events/subscribe-member-add-async.yml +0 -77
  153. data/fixtures/vcr_cassettes/lib/events/subscribe-membership-add-async.yml +0 -77
  154. data/fixtures/vcr_cassettes/lib/events/subscribe-space-update-async.yml +0 -77
  155. data/fixtures/vcr_cassettes/lib/events/update_space.yml +0 -40
  156. data/fixtures/vcr_cassettes/lib/events/update_user.yml +0 -40
  157. data/lib/pubnub/events/get_members.rb +0 -93
  158. data/lib/pubnub/events/get_space.rb +0 -74
  159. data/lib/pubnub/events/get_space_memberships.rb +0 -93
  160. data/lib/pubnub/events/get_spaces.rb +0 -90
  161. data/lib/pubnub/events/get_user.rb +0 -74
  162. data/lib/pubnub/events/get_users.rb +0 -90
  163. data/lib/pubnub/events/manage_memberships.rb +0 -105
  164. data/lib/pubnub/events/update_user.rb +0 -86
  165. data/lib/pubnub/validators/create_space.rb +0 -44
  166. data/lib/pubnub/validators/create_user.rb +0 -44
  167. data/lib/pubnub/validators/delete_space.rb +0 -32
  168. data/lib/pubnub/validators/delete_user.rb +0 -32
  169. data/lib/pubnub/validators/get_members.rb +0 -32
  170. data/lib/pubnub/validators/get_space.rb +0 -32
  171. data/lib/pubnub/validators/get_space_memberships.rb +0 -32
  172. data/lib/pubnub/validators/get_spaces.rb +0 -16
  173. data/lib/pubnub/validators/get_user.rb +0 -32
  174. data/lib/pubnub/validators/get_users.rb +0 -16
  175. data/lib/pubnub/validators/manage_members.rb +0 -45
  176. data/lib/pubnub/validators/manage_memberships.rb +0 -45
  177. data/lib/pubnub/validators/push.rb +0 -43
  178. data/lib/pubnub/validators/update_space.rb +0 -45
  179. data/lib/pubnub/validators/update_user.rb +0 -45
  180. data/spec/examples/revoke_examples_spec.rb +0 -71950
  181. data/spec/examples/subscribe_examples_spec.rb +0 -45184
  182. data/spec/lib/events/space_spec.rb +0 -75
  183. data/spec/lib/events/user_spec.rb +0 -75
@@ -0,0 +1,43 @@
1
+ # Toplevel Pubnub module.
2
+ module Pubnub
3
+ # Validator module that holds all validators modules
4
+ module Validator
5
+ # Validator for RemoveDeviceFromPush event
6
+ module RemoveDeviceFromPush
7
+ include CommonValidator
8
+
9
+ def validate!
10
+ return if @skip_validate
11
+ validate_push_token!
12
+ validate_push_gateway!
13
+ validate_topic! if @push_gateway.eql? 'apns2'
14
+ end
15
+
16
+ private
17
+
18
+ def validate_push_token!
19
+ return unless @push_token.nil? || @push_token.empty?
20
+ raise(
21
+ ArgumentError.new,
22
+ ':push_token is required for RemoveDeviceFromPush event.'
23
+ )
24
+ end
25
+
26
+ def validate_push_gateway!
27
+ return unless @push_gateway.nil? || @push_gateway.empty?
28
+ raise(
29
+ ArgumentError.new,
30
+ ':push_gateway is required for RemoveDeviceFromPush event.'
31
+ )
32
+ end
33
+
34
+ def validate_topic!
35
+ return unless @topic.nil? || @topic.empty?
36
+ raise(
37
+ ArgumentError.new,
38
+ ':topic is required for RemoveDeviceFromPush event.'
39
+ )
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,52 @@
1
+ # Toplevel Pubnub module.
2
+ # frozen_string_literal: true
3
+
4
+ module Pubnub
5
+ # Validator module that holds all validators modules
6
+ module Validator
7
+ # Validator for RemoveMemberships event
8
+ module RemoveMemberships
9
+ include CommonValidator
10
+
11
+ def validate!
12
+ return if @skip_validate
13
+
14
+ validate_subscribe_key!
15
+ validate_uuid!
16
+ validate_memberships!
17
+ end
18
+
19
+ private
20
+
21
+ def validate_subscribe_key!
22
+ return unless @subscribe_key.nil?
23
+
24
+ raise(
25
+ ArgumentError.new(object: self, message: ':subscribe_key is required for remove memberships event.'),
26
+ ':subscribe_key is required for remove memberships event.'
27
+ )
28
+ end
29
+
30
+ def validate_uuid!
31
+ return unless @uuid.nil? || @uuid.empty?
32
+
33
+ raise(
34
+ ArgumentError.new(object: self, message: ':uuid is required for remove memberships event.'),
35
+ ':uuid is required for remove memberships event.'
36
+ )
37
+ end
38
+
39
+ def validate_memberships!
40
+ raise(
41
+ ArgumentError.new(object: self, message: ':channels is required for remove memberships event.'),
42
+ ':channels is required for remove memberships event.'
43
+ ) if @channels.nil? || @channels.empty?
44
+
45
+ raise(
46
+ ArgumentError.new(object: self, message: ':channels parameter for remove memberships must be Array.'),
47
+ ':channels parameter for remove memberships must be Array.'
48
+ ) if @channels.class != Array
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,39 @@
1
+ # Toplevel Pubnub module.
2
+ # frozen_string_literal: true
3
+
4
+ module Pubnub
5
+ # Validator module that holds all validators modules
6
+ module Validator
7
+ # Validator for RemoveUuidMetadata event
8
+ module RemoveUuidMetadata
9
+ include CommonValidator
10
+
11
+ def validate!
12
+ return if @skip_validate
13
+
14
+ validate_subscribe_key!
15
+ validate_uuid!
16
+ end
17
+
18
+ private
19
+
20
+ def validate_subscribe_key!
21
+ return unless @subscribe_key.nil?
22
+
23
+ raise(
24
+ ArgumentError.new(object: self, message: ':subscribe_key is required for remove uuid metadata event.'),
25
+ ':subscribe_key is required for remove uuid metadata event.'
26
+ )
27
+ end
28
+
29
+ def validate_uuid!
30
+ return unless @uuid.nil? || @uuid.empty?
31
+
32
+ raise(
33
+ ArgumentError.new(object: self, message: ':uuid is required for remove uuid metadata event.'),
34
+ ':uuid is required for remove uuid metadata event.'
35
+ )
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,78 @@
1
+ # Toplevel Pubnub module.
2
+ # frozen_string_literal: true
3
+
4
+ module Pubnub
5
+ # Validator module that holds all validators modules
6
+ module Validator
7
+ # Validator for SetChannelMembers event
8
+ module SetChannelMembers
9
+ include CommonValidator
10
+
11
+ def validate!
12
+ return if @skip_validate
13
+
14
+ validate_subscribe_key!
15
+ validate_channel!
16
+ validate_members!
17
+ end
18
+
19
+ private
20
+
21
+ def validate_subscribe_key!
22
+ return unless @subscribe_key.nil?
23
+
24
+ raise(
25
+ ArgumentError.new(object: self, message: ':subscribe_key is required for set channel members event.'),
26
+ ':subscribe_key is required for set channel members event.'
27
+ )
28
+ end
29
+
30
+ def validate_channel!
31
+ return unless @channel.nil? || @channel.empty?
32
+
33
+ raise(
34
+ ArgumentError.new(object: self, message: ':channel is required for set channel members event.'),
35
+ ':channel is required for set channel members event.'
36
+ )
37
+ end
38
+
39
+ def validate_members!
40
+ raise(
41
+ ArgumentError.new(object: self, message: ':uuids is required for set channel members event.'),
42
+ ':uuids is required for set channel members event.'
43
+ ) if @uuids.nil? || @uuids.empty?
44
+
45
+ raise(
46
+ ArgumentError.new(object: self, message: ':uuids parameter for set channel members must be Array.'),
47
+ ':uuids parameter for set channel members must be Array.'
48
+ ) if @uuids.class != Array
49
+
50
+ acceptable_values = %w[String Symbol Float Integer TrueClass FalseClass]
51
+
52
+ @uuids.each do |member|
53
+ raise(
54
+ ArgumentError.new(object: self, message: ':uuid is required for set channel members event.'),
55
+ ':uuid is required for set channel members event.'
56
+ ) if member[:uuid].nil? || member[:uuid].empty?
57
+
58
+ next if member[:custom].nil?
59
+
60
+ raise(
61
+ ArgumentError.new(object: self, message: ':custom parameter of channel member must be Hash.'),
62
+ ':custom parameter of channel member must be Hash.'
63
+ ) if member[:custom].class != Hash
64
+
65
+ # Verify that all values in member custom has expected data type.
66
+ member[:custom].each do |key, value|
67
+ unless acceptable_values.include?(value.class.to_s)
68
+ message = "Value for '#{key}' has unacceptable type (#{value.class.to_s})." \
69
+ "Only following data types allowed: #{acceptable_values.join(", ")}"
70
+
71
+ raise(ArgumentError.new(object: self, message: message), message)
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,62 @@
1
+ # Toplevel Pubnub module.
2
+ # frozen_string_literal: true
3
+
4
+ module Pubnub
5
+ # Validator module that holds all validators modules
6
+ module Validator
7
+ # Validator for SetChannelMetadata event
8
+ module SetChannelMetadata
9
+ include CommonValidator
10
+
11
+ def validate!
12
+ return if @skip_validate
13
+
14
+ validate_subscribe_key!
15
+ validate_channel!
16
+ validate_metadata!
17
+ end
18
+
19
+ private
20
+
21
+ def validate_subscribe_key!
22
+ return unless @subscribe_key.nil?
23
+
24
+ raise(
25
+ ArgumentError.new(object: self, message: ':subscribe_key is required for set channel metadata event.'),
26
+ ':subscribe_key is required for set channel metadata event.'
27
+ )
28
+ end
29
+
30
+ def validate_channel!
31
+ return unless @channel.nil? || @channel.empty?
32
+
33
+ raise(
34
+ ArgumentError.new(object: self, message: ':channel is required for set channel metadata event.'),
35
+ ':channel is required for set channel metadata event.'
36
+ )
37
+ end
38
+
39
+ def validate_metadata!
40
+ raise(
41
+ ArgumentError.new(object: self, message: ':metadata is required for set channel metadata event.'),
42
+ ':metadata is required for set channel metadata event.'
43
+ ) if @metadata.nil? || @metadata.empty?
44
+
45
+ raise(
46
+ ArgumentError.new(object: self, message: ':metadata parameter for set channel metadata must be Hash.'),
47
+ ':metadata parameter for set channel metadata must be Hash.'
48
+ ) if @metadata.class != Hash
49
+
50
+ known_channel_metadata_fields = %w[name description custom updated eTag]
51
+
52
+ @metadata.each_key do |field_name|
53
+ unless known_channel_metadata_fields.include?(field_name.to_s)
54
+ message = "Unknown channel metadata key: '#{field_name}'. Only following keys allowed: #{known_channel_metadata_fields.join(", ")}"
55
+
56
+ raise(ArgumentError.new(object: self, message: message), message)
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,78 @@
1
+ # Toplevel Pubnub module.
2
+ # frozen_string_literal: true
3
+
4
+ module Pubnub
5
+ # Validator module that holds all validators modules
6
+ module Validator
7
+ # Validator for SetMemberships event
8
+ module SetMemberships
9
+ include CommonValidator
10
+
11
+ def validate!
12
+ return if @skip_validate
13
+
14
+ validate_subscribe_key!
15
+ validate_uuid!
16
+ validate_memberships!
17
+ end
18
+
19
+ private
20
+
21
+ def validate_subscribe_key!
22
+ return unless @subscribe_key.nil?
23
+
24
+ raise(
25
+ ArgumentError.new(object: self, message: ':subscribe_key is required for set memberships event.'),
26
+ ':subscribe_key is required for set memberships event.'
27
+ )
28
+ end
29
+
30
+ def validate_uuid!
31
+ return unless @uuid.nil? || @uuid.empty?
32
+
33
+ raise(
34
+ ArgumentError.new(object: self, message: ':uuid is required for set memberships event.'),
35
+ ':uuid is required for set memberships event.'
36
+ )
37
+ end
38
+
39
+ def validate_memberships!
40
+ raise(
41
+ ArgumentError.new(object: self, message: ':channels is required for set memberships event.'),
42
+ ':channels is required for set memberships event.'
43
+ ) if @channels.nil? || @channels.empty?
44
+
45
+ raise(
46
+ ArgumentError.new(object: self, message: ':channels parameter for set memberships must be Array.'),
47
+ ':channels parameter for set memberships must be Array.'
48
+ ) if @channels.class != Array
49
+
50
+ acceptable_values = %w[String Symbol Float Integer TrueClass FalseClass]
51
+
52
+ @channels.each do |membership|
53
+ raise(
54
+ ArgumentError.new(object: self, message: ':channel is required for set memberships event.'),
55
+ ':channel is required for set memberships event.'
56
+ ) if membership[:channel].nil? || membership[:channel].empty?
57
+
58
+ next if membership[:custom].nil?
59
+
60
+ raise(
61
+ ArgumentError.new(object: self, message: ':custom parameter of membership must be Hash.'),
62
+ ':custom parameter of membership must be Hash.'
63
+ ) if membership[:custom].class != Hash
64
+
65
+ # Verify that all values in membership 'custom' has expected data type.
66
+ membership[:custom].each do |key, value|
67
+ unless acceptable_values.include?(value.class.to_s)
68
+ message = "Value for '#{key}' has unacceptable type (#{value.class.to_s})." \
69
+ "Only following data types allowed: #{acceptable_values.join(", ")}"
70
+
71
+ raise(ArgumentError.new(object: self, message: message), message)
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,62 @@
1
+ # Toplevel Pubnub module.
2
+ # frozen_string_literal: true
3
+
4
+ module Pubnub
5
+ # Validator module that holds all validators modules
6
+ module Validator
7
+ # Validator for SetUuidMetadata event
8
+ module SetUuidMetadata
9
+ include CommonValidator
10
+
11
+ def validate!
12
+ return if @skip_validate
13
+
14
+ validate_subscribe_key!
15
+ validate_uuid!
16
+ validate_metadata!
17
+ end
18
+
19
+ private
20
+
21
+ def validate_subscribe_key!
22
+ return unless @subscribe_key.nil?
23
+
24
+ raise(
25
+ ArgumentError.new(object: self, message: ':subscribe_key is required for set uuid metadata event.'),
26
+ ':subscribe_key is required for set uuid metadata event.'
27
+ )
28
+ end
29
+
30
+ def validate_uuid!
31
+ return unless @uuid.nil? || @uuid.empty?
32
+
33
+ raise(
34
+ ArgumentError.new(object: self, message: ':uuid is required for set uuid metadata event.'),
35
+ ':uuid is required for set uuid metadata event.'
36
+ )
37
+ end
38
+
39
+ def validate_metadata!
40
+ raise(
41
+ ArgumentError.new(object: self, message: ':metadata is required for set uuid metadata event.'),
42
+ ':metadata is required for set uuid metadata event.'
43
+ ) if @metadata.nil? || @metadata.empty?
44
+
45
+ raise(
46
+ ArgumentError.new(object: self, message: ':metadata parameter for set uuid metadata must be Hash.'),
47
+ ':metadata parameter for set uuid metadata must be Hash.'
48
+ ) if @metadata.class != Hash
49
+
50
+ known_uuid_metadata_fields = %w[name email externalId profileUrl custom updated eTag]
51
+
52
+ @metadata.each_key do |field_name|
53
+ unless known_uuid_metadata_fields.include?(field_name.to_s)
54
+ message = "Unknown uuid metadata key: '#{field_name}'. Only following keys allowed: #{known_uuid_metadata_fields.join(", ")}"
55
+
56
+ raise(ArgumentError.new(object: self, message: message), message)
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -1,4 +1,4 @@
1
1
  # Toplevel Pubnub module.
2
2
  module Pubnub
3
- VERSION = '4.2.5'.freeze
3
+ VERSION = '4.5.0'.freeze
4
4
  end
@@ -18,11 +18,11 @@ Gem::Specification.new do |spec|
18
18
  spec.require_paths = ['lib']
19
19
  spec.required_ruby_version = '>= 2.4'
20
20
 
21
+ spec.add_dependency 'addressable', '>= 2.0.0'
21
22
  spec.add_dependency 'concurrent-ruby', '~> 1.1.5'
22
23
  spec.add_dependency 'concurrent-ruby-edge', '~> 0.5.0'
23
24
  spec.add_dependency 'dry-validation', '~> 1.0'
24
25
  spec.add_dependency 'httpclient', '~> 2.8', '>= 2.8.3'
25
26
  spec.add_dependency 'json', '>= 2.2.0', '< 3'
26
27
  spec.add_dependency 'timers', '>= 4.3.0'
27
- spec.add_development_dependency 'bundler', '~> 1.7'
28
28
  end
@@ -0,0 +1,178 @@
1
+ require "spec_helper"
2
+
3
+ describe Pubnub::AddChannelsToPush do
4
+ around :each do |example|
5
+ @fired = false
6
+
7
+ @callback = -> (_envelope) do
8
+ @fired = true
9
+ end
10
+
11
+ @pubnub = Pubnub.new(
12
+ subscribe_key: 'sub-a-mock-key',
13
+ uuid: "ruby-test-uuid-client-one",
14
+ auth_key: "ruby-test-auth-client-one"
15
+ )
16
+
17
+ @device_token = '815ee724ccb0a6a84dc303be8ccbaa00d1c84dde6bcae6721b08f92100951113'
18
+
19
+ example.run_with_retry retry: 1
20
+ end
21
+
22
+ it "001_channel___demo1_demo2___push_gateway___apns___push_token__valid___http_sync__true___callback__nil_" do
23
+ VCR.use_cassette("examples/add_channels_to_push/001", record: :once) do
24
+ envelope = @pubnub.add_channels_to_push(push_token: @device_token, push_gateway: 'apns', channel: 'demo1,demo2', http_sync: true)
25
+
26
+ expect(envelope.is_a?(Pubnub::Envelope)).to eq true
27
+ expect(envelope.error?).to eq false
28
+
29
+ expect(envelope.status[:code]).to eq(200)
30
+ expect(envelope.status[:operation]).to eq(:add_channels_to_push)
31
+ expect(envelope.status[:category]).to eq(:ack)
32
+ expect(envelope.status[:config]).to eq({:tls => false, :uuid => "ruby-test-uuid-client-one", auth_key: "ruby-test-auth-client-one", :origin => "ps.pndsn.com"})
33
+
34
+ expect(envelope.result[:code]).to eq(200)
35
+ expect(envelope.result[:operation]).to eq(:add_channels_to_push)
36
+ end
37
+ end
38
+
39
+ it "001_channel___demo1_demo2___push_gateway___apns___push_token__valid___http_sync__true___callback___block_" do
40
+ VCR.use_cassette("examples/add_channels_to_push/001", record: :once) do
41
+ envelope = @pubnub.add_channels_to_push(push_token: @device_token, push_gateway: 'apns', channel: 'demo1,demo2', http_sync: true, &@callback)
42
+
43
+ expect(@fired).to eq true
44
+ expect(envelope.is_a?(Pubnub::Envelope)).to eq true
45
+ expect(envelope.error?).to eq false
46
+
47
+ expect(envelope.status[:code]).to eq(200)
48
+ expect(envelope.status[:operation]).to eq(:add_channels_to_push)
49
+ expect(envelope.status[:category]).to eq(:ack)
50
+ expect(envelope.status[:config]).to eq({:tls => false, :uuid => "ruby-test-uuid-client-one", auth_key: "ruby-test-auth-client-one", :origin => "ps.pndsn.com"})
51
+
52
+ expect(envelope.result[:code]).to eq(200)
53
+ expect(envelope.result[:operation]).to eq(:add_channels_to_push)
54
+ end
55
+ end
56
+
57
+ it "001_channel___demo1_demo2___push_gateway___apns___push_token__valid___http_sync__true___callback___lambda_" do
58
+ VCR.use_cassette("examples/add_channels_to_push/001", record: :once) do
59
+ envelope = @pubnub.add_channels_to_push(push_token: @device_token, push_gateway: 'apns', channel: 'demo1,demo2', http_sync: true, callback: @callback)
60
+
61
+ expect(@fired).to eq true
62
+ expect(envelope.is_a?(Pubnub::Envelope)).to eq true
63
+ expect(envelope.error?).to eq false
64
+
65
+ expect(envelope.status[:code]).to eq(200)
66
+ expect(envelope.status[:operation]).to eq(:add_channels_to_push)
67
+ expect(envelope.status[:category]).to eq(:ack)
68
+ expect(envelope.status[:config]).to eq({:tls => false, :uuid => "ruby-test-uuid-client-one", auth_key: "ruby-test-auth-client-one", :origin => "ps.pndsn.com"})
69
+
70
+ expect(envelope.result[:code]).to eq(200)
71
+ expect(envelope.result[:operation]).to eq(:add_channels_to_push)
72
+ end
73
+ end
74
+
75
+ it "001_channel___demo1_demo2___push_gateway___apns___push_token__valid___http_sync__false___callback__nil_" do
76
+ VCR.use_cassette("examples/add_channels_to_push/001", record: :once) do
77
+ envelope = @pubnub.add_channels_to_push(push_token: @device_token, push_gateway: 'apns', channel: 'demo1,demo2', http_sync: false)
78
+ envelope = envelope.value
79
+
80
+ expect(envelope.is_a?(Pubnub::Envelope)).to eq true
81
+ expect(envelope.error?).to eq false
82
+
83
+ expect(envelope.status[:code]).to eq(200)
84
+ expect(envelope.status[:operation]).to eq(:add_channels_to_push)
85
+ expect(envelope.status[:category]).to eq(:ack)
86
+ expect(envelope.status[:config]).to eq({:tls => false, :uuid => "ruby-test-uuid-client-one", auth_key: "ruby-test-auth-client-one", :origin => "ps.pndsn.com"})
87
+
88
+ expect(envelope.result[:code]).to eq(200)
89
+ expect(envelope.result[:operation]).to eq(:add_channels_to_push)
90
+ end
91
+ end
92
+
93
+ it "001_channel___demo1_demo2___push_gateway___apns___push_token__valid___http_sync__false___callback___block_" do
94
+ VCR.use_cassette("examples/add_channels_to_push/001", record: :once) do
95
+ envelope = @pubnub.add_channels_to_push(push_token: @device_token, push_gateway: 'apns', channel: 'demo1,demo2', http_sync: false, &@callback)
96
+ envelope = envelope.value
97
+
98
+ expect(@fired).to eq true
99
+ expect(envelope.is_a?(Pubnub::Envelope)).to eq true
100
+ expect(envelope.error?).to eq false
101
+
102
+ expect(envelope.status[:code]).to eq(200)
103
+ expect(envelope.status[:operation]).to eq(:add_channels_to_push)
104
+ expect(envelope.status[:category]).to eq(:ack)
105
+ expect(envelope.status[:config]).to eq({:tls => false, :uuid => "ruby-test-uuid-client-one", auth_key: "ruby-test-auth-client-one", :origin => "ps.pndsn.com"})
106
+
107
+ expect(envelope.result[:code]).to eq(200)
108
+ expect(envelope.result[:operation]).to eq(:add_channels_to_push)
109
+ end
110
+ end
111
+
112
+ it "001_channel___demo1_demo2___push_gateway___apns___push_token__valid___http_sync__false___callback___lambda_" do
113
+ VCR.use_cassette("examples/add_channels_to_push/001", record: :once) do
114
+ envelope = @pubnub.add_channels_to_push(push_token: @device_token, push_gateway: 'apns', channel: 'demo1,demo2', http_sync: false, callback: @callback)
115
+ envelope = envelope.value
116
+
117
+ expect(@fired).to eq true
118
+ expect(envelope.is_a?(Pubnub::Envelope)).to eq true
119
+ expect(envelope.error?).to eq false
120
+
121
+ expect(envelope.status[:code]).to eq(200)
122
+ expect(envelope.status[:operation]).to eq(:add_channels_to_push)
123
+ expect(envelope.status[:category]).to eq(:ack)
124
+ expect(envelope.status[:config]).to eq({:tls => false, :uuid => "ruby-test-uuid-client-one", auth_key: "ruby-test-auth-client-one", :origin => "ps.pndsn.com"})
125
+
126
+ expect(envelope.result[:code]).to eq(200)
127
+ expect(envelope.result[:operation]).to eq(:add_channels_to_push)
128
+ end
129
+ end
130
+
131
+ it "002_channel___demo1_demo2___push_gateway___apns2___push_token__valid___topic__ruby_test___environment__default___http_sync__true___callback__nil_" do
132
+ VCR.use_cassette("examples/add_channels_to_push/002", record: :once) do
133
+ envelope = @pubnub.add_channels_to_push(push_token: @device_token, push_gateway: 'apns2', channel: 'demo1,demo2', topic: 'ruby_test', http_sync: true)
134
+
135
+ expect(envelope.is_a?(Pubnub::Envelope)).to eq true
136
+ expect(envelope.error?).to eq false
137
+
138
+ expect(envelope.status[:code]).to eq(200)
139
+ expect(envelope.status[:operation]).to eq(:add_channels_to_push)
140
+ expect(envelope.status[:category]).to eq(:ack)
141
+ expect(envelope.status[:config]).to eq({:tls => false, :uuid => "ruby-test-uuid-client-one", auth_key: "ruby-test-auth-client-one", :origin => "ps.pndsn.com"})
142
+
143
+ expect(envelope.result[:code]).to eq(200)
144
+ expect(envelope.result[:operation]).to eq(:add_channels_to_push)
145
+ end
146
+ end
147
+
148
+ it "003_channel___demo1_demo2___push_gateway___apns2___push_token__valid___topic__ruby_test___environment__production___http_sync__true___callback__nil_" do
149
+ VCR.use_cassette("examples/add_channels_to_push/003", record: :once) do
150
+ envelope = @pubnub.add_channels_to_push(push_token: @device_token, push_gateway: 'apns2', channel: 'demo1,demo2', topic: 'ruby_test', environment: 'production', http_sync: true)
151
+
152
+ expect(envelope.is_a?(Pubnub::Envelope)).to eq true
153
+ expect(envelope.error?).to eq false
154
+
155
+ expect(envelope.status[:code]).to eq(200)
156
+ expect(envelope.status[:operation]).to eq(:add_channels_to_push)
157
+ expect(envelope.status[:category]).to eq(:ack)
158
+ expect(envelope.status[:config]).to eq({:tls => false, :uuid => "ruby-test-uuid-client-one", auth_key: "ruby-test-auth-client-one", :origin => "ps.pndsn.com"})
159
+
160
+ expect(envelope.result[:code]).to eq(200)
161
+ expect(envelope.result[:operation]).to eq(:add_channels_to_push)
162
+ end
163
+ end
164
+
165
+ it "004_channel___demo1_demo2___push_gateway___apns2___push_token__invalid___topic__ruby_test___environment__production___http_sync__true___callback__nil_" do
166
+ VCR.use_cassette("examples/add_channels_to_push/004", record: :once) do
167
+ envelope = @pubnub.add_channels_to_push(push_token: "invalid_token", push_gateway: 'apns2', channel: 'demo1,demo2', topic: 'ruby_test', environment: 'production', http_sync: true)
168
+
169
+ expect(envelope.is_a?(Pubnub::Envelope)).to eq true
170
+ expect(envelope.error?).to eq true
171
+
172
+ expect(envelope.status[:code]).to eq(400)
173
+ expect(envelope.status[:operation]).to eq(:add_channels_to_push)
174
+ expect(envelope.status[:category]).to eq(:error)
175
+ expect(envelope.status[:config]).to eq({:tls => false, :uuid => "ruby-test-uuid-client-one", auth_key: "ruby-test-auth-client-one", :origin => "ps.pndsn.com"})
176
+ end
177
+ end
178
+ end