pushpad 0.11.0 → 0.13.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.
- checksums.yaml +5 -5
- data/.github/workflows/ci.yml +22 -0
- data/LICENSE.txt +1 -1
- data/README.md +16 -12
- data/lib/pushpad/notification.rb +8 -4
- data/lib/pushpad/subscription.rb +1 -1
- data/pushpad.gemspec +1 -1
- data/spec/pushpad/notification_spec.rb +26 -18
- data/spec/pushpad/subscription_spec.rb +2 -2
- metadata +8 -9
- data/.travis.yml +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 859e8674ef09ee84c2bb6ab00a837aef0d48b2039774625974aae32f2ca3a2ee
|
4
|
+
data.tar.gz: 71086f6109284229c8c02d01d48ca0980a4621065d43875a4131bc867b7c002a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2cd5ae106f55214c5c16a7fc2eae7d33ecb4e6fb0c9b2917d44c643a754b5a6b124630b356969d9a230a25ed89fe0726b900d001452c777dba677f629c52ce6d
|
7
|
+
data.tar.gz: f06eb68e6b96bbf6b6f59ab687c838fdc72a6a5f9df61a86e48772bd7f74d6990416d69ddbe8ea71855b8a42ba453e363c2fb4a1ae4b97268d437a545b9a0166
|
@@ -0,0 +1,22 @@
|
|
1
|
+
name: CI
|
2
|
+
on:
|
3
|
+
push:
|
4
|
+
branches: [ master ]
|
5
|
+
pull_request:
|
6
|
+
branches: [ master ]
|
7
|
+
jobs:
|
8
|
+
test:
|
9
|
+
runs-on: ubuntu-latest
|
10
|
+
strategy:
|
11
|
+
fail-fast: false
|
12
|
+
matrix:
|
13
|
+
ruby-version: ['2.7', '3.0', '3.1']
|
14
|
+
steps:
|
15
|
+
- uses: actions/checkout@v2
|
16
|
+
- name: Set up Ruby
|
17
|
+
uses: ruby/setup-ruby@v1
|
18
|
+
with:
|
19
|
+
ruby-version: ${{ matrix.ruby-version }}
|
20
|
+
bundler-cache: true
|
21
|
+
- name: Run tests
|
22
|
+
run: bundle exec rspec
|
data/LICENSE.txt
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
The MIT License (MIT)
|
2
2
|
|
3
|
-
Copyright (c) 2016 Pushpad (https://pushpad.xyz)
|
3
|
+
Copyright (c) 2016-2022 Pushpad (https://pushpad.xyz)
|
4
4
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Pushpad - Web Push Notifications
|
2
2
|
|
3
|
-
[](https://travis-ci.org/pushpad/pushpad-ruby)
|
4
3
|
[](https://badge.fury.io/rb/pushpad)
|
4
|
+

|
5
5
|
|
6
6
|
[Pushpad](https://pushpad.xyz) is a service for sending push notifications from your web app. It supports the **Push API** (Chrome, Firefox, Opera, Edge) and **APNs** (Safari).
|
7
7
|
|
@@ -55,22 +55,24 @@ Pushpad.signature_for current_user.id
|
|
55
55
|
|
56
56
|
```ruby
|
57
57
|
notification = Pushpad::Notification.new({
|
58
|
-
body: "Hello world!",
|
59
|
-
title: "Website Name", # optional, defaults to your project name
|
60
|
-
target_url: "
|
61
|
-
icon_url: "
|
62
|
-
|
58
|
+
body: "Hello world!",
|
59
|
+
title: "Website Name", # optional, defaults to your project name
|
60
|
+
target_url: "https://example.com", # optional, defaults to your project website
|
61
|
+
icon_url: "https://example.com/assets/icon.png", # optional, defaults to the project icon
|
62
|
+
badge_url: "https://example.com/assets/badge.png" # optional, defaults to the project badge
|
63
|
+
image_url: "https://example.com/assets/image.png", # optional, an image to display in the notification content
|
63
64
|
ttl: 604800, # optional, drop the notification after this number of seconds if a device is offline
|
64
65
|
require_interaction: true, # optional, prevent Chrome on desktop from automatically closing the notification after a few seconds
|
66
|
+
silent: false, # optional, enable this option if you want a mute notification without any sound
|
65
67
|
urgent: false, # optional, enable this option only for time-sensitive alerts (e.g. incoming phone call)
|
66
68
|
custom_data: "123", # optional, a string that is passed as an argument to action button callbacks
|
67
69
|
# optional, add some action buttons to the notification
|
68
70
|
# see https://pushpad.xyz/docs/action_buttons
|
69
71
|
actions: [
|
70
72
|
{
|
71
|
-
title: "My Button 1",
|
72
|
-
target_url: "
|
73
|
-
icon: "
|
73
|
+
title: "My Button 1",
|
74
|
+
target_url: "https://example.com/button-link", # optional
|
75
|
+
icon: "https://example.com/assets/button-icon.png", # optional
|
74
76
|
action: "myActionName" # optional
|
75
77
|
}
|
76
78
|
],
|
@@ -114,7 +116,7 @@ The methods above return an hash:
|
|
114
116
|
|
115
117
|
- `"id"` is the id of the notification on Pushpad
|
116
118
|
- `"scheduled"` is the estimated reach of the notification (i.e. the number of devices to which the notification will be sent, which can be different from the number of users, since a user may receive notifications on multiple devices)
|
117
|
-
- `"uids"` (`deliver_to` only) are the user IDs that will be actually reached by the notification because they are subscribed to your notifications. For example if you send a notification to `['uid1', 'uid2', 'uid3']`, but only `'uid1'` is subscribed, you will get `['uid1']` in response. Note that if a user has unsubscribed after the last notification sent to him, he may still be reported for one time as subscribed (this is due to [the way](
|
119
|
+
- `"uids"` (`deliver_to` only) are the user IDs that will be actually reached by the notification because they are subscribed to your notifications. For example if you send a notification to `['uid1', 'uid2', 'uid3']`, but only `'uid1'` is subscribed, you will get `['uid1']` in response. Note that if a user has unsubscribed after the last notification sent to him, he may still be reported for one time as subscribed (this is due to [the way](https://blog.pushpad.xyz/2016/05/the-push-api-and-its-wild-unsubscription-mechanism/) the W3C Push API works).
|
118
120
|
- `"send_at"` is present only for scheduled notifications. The fields `"scheduled"` and `"uids"` are not available in this case.
|
119
121
|
|
120
122
|
The `id` and `scheduled_count` attribute are also stored on the notification object:
|
@@ -138,11 +140,13 @@ notification = Pushpad::Notification.find(42)
|
|
138
140
|
notification.id # => 42
|
139
141
|
notification.title # => "Foo Bar",
|
140
142
|
notification.body # => "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
|
141
|
-
notification.target_url # => "
|
143
|
+
notification.target_url # => "https://example.com",
|
142
144
|
notification.ttl # => 604800,
|
143
145
|
notification.require_interaction # => false,
|
146
|
+
notification.silent # => false,
|
144
147
|
notification.urgent # => false,
|
145
|
-
notification.icon_url # => "
|
148
|
+
notification.icon_url # => "https://example.com/assets/icon.png",
|
149
|
+
notification.badge_url # => "https://example.com/assets/badge.png",
|
146
150
|
|
147
151
|
# `created_at` is a `Time` instance
|
148
152
|
notification.created_at.utc.to_s # => "2016-07-06 10:09:14 UTC",
|
data/lib/pushpad/notification.rb
CHANGED
@@ -12,7 +12,7 @@ module Pushpad
|
|
12
12
|
class ReadonlyError < RuntimeError
|
13
13
|
end
|
14
14
|
|
15
|
-
attr_accessor :body, :title, :target_url, :icon_url, :image_url, :ttl, :require_interaction, :urgent, :custom_data, :custom_metrics, :actions, :starred, :send_at
|
15
|
+
attr_accessor :body, :title, :target_url, :icon_url, :badge_url, :image_url, :ttl, :require_interaction, :silent, :urgent, :custom_data, :custom_metrics, :actions, :starred, :send_at
|
16
16
|
attr_reader :id, :created_at, :scheduled_count, :successfully_sent_count, :opened_count
|
17
17
|
|
18
18
|
def initialize(options)
|
@@ -26,9 +26,11 @@ module Pushpad
|
|
26
26
|
@title = options[:title]
|
27
27
|
@target_url = options[:target_url]
|
28
28
|
@icon_url = options[:icon_url]
|
29
|
+
@badge_url = options[:badge_url]
|
29
30
|
@image_url = options[:image_url]
|
30
31
|
@ttl = options[:ttl]
|
31
32
|
@require_interaction = options[:require_interaction]
|
33
|
+
@silent = options[:silent]
|
32
34
|
@urgent = options[:urgent]
|
33
35
|
@custom_data = options[:custom_data]
|
34
36
|
@custom_metrics = options[:custom_metrics]
|
@@ -38,7 +40,7 @@ module Pushpad
|
|
38
40
|
end
|
39
41
|
|
40
42
|
def self.find(id)
|
41
|
-
response = Request.get("https://pushpad.xyz/notifications/#{id}")
|
43
|
+
response = Request.get("https://pushpad.xyz/api/v1/notifications/#{id}")
|
42
44
|
|
43
45
|
unless response.code == "200"
|
44
46
|
raise FindError, "Response #{response.code} #{response.message}: #{response.body}"
|
@@ -54,7 +56,7 @@ module Pushpad
|
|
54
56
|
query_parameters = {}
|
55
57
|
query_parameters[:page] = options[:page] if options.key?(:page)
|
56
58
|
|
57
|
-
response = Request.get("https://pushpad.xyz/projects/#{project_id}/notifications",
|
59
|
+
response = Request.get("https://pushpad.xyz/api/v1/projects/#{project_id}/notifications",
|
58
60
|
query_parameters: query_parameters)
|
59
61
|
|
60
62
|
unless response.code == "200"
|
@@ -97,7 +99,7 @@ module Pushpad
|
|
97
99
|
project_id = options[:project_id] || Pushpad.project_id
|
98
100
|
raise "You must set project_id" unless project_id
|
99
101
|
|
100
|
-
endpoint = "https://pushpad.xyz/projects/#{project_id}/notifications"
|
102
|
+
endpoint = "https://pushpad.xyz/api/v1/projects/#{project_id}/notifications"
|
101
103
|
response = Request.post(endpoint, req_body)
|
102
104
|
|
103
105
|
unless response.code == "201"
|
@@ -115,9 +117,11 @@ module Pushpad
|
|
115
117
|
notification_params["title"] = self.title if self.title
|
116
118
|
notification_params["target_url"] = self.target_url if self.target_url
|
117
119
|
notification_params["icon_url"] = self.icon_url if self.icon_url
|
120
|
+
notification_params["badge_url"] = self.badge_url if self.badge_url
|
118
121
|
notification_params["image_url"] = self.image_url if self.image_url
|
119
122
|
notification_params["ttl"] = self.ttl if self.ttl
|
120
123
|
notification_params["require_interaction"] = self.require_interaction unless self.require_interaction.nil?
|
124
|
+
notification_params["silent"] = self.silent unless self.silent.nil?
|
121
125
|
notification_params["urgent"] = self.urgent unless self.urgent.nil?
|
122
126
|
notification_params["custom_data"] = self.custom_data if self.custom_data
|
123
127
|
notification_params["custom_metrics"] = self.custom_metrics if self.custom_metrics
|
data/lib/pushpad/subscription.rb
CHANGED
@@ -18,7 +18,7 @@ module Pushpad
|
|
18
18
|
project_id = options[:project_id] || Pushpad.project_id
|
19
19
|
raise "You must set project_id" unless project_id
|
20
20
|
|
21
|
-
endpoint = "https://pushpad.xyz/projects/#{project_id}/subscriptions"
|
21
|
+
endpoint = "https://pushpad.xyz/api/v1/projects/#{project_id}/subscriptions"
|
22
22
|
response = Request.head(endpoint, query_parameters: query_parameters)
|
23
23
|
|
24
24
|
unless response.code == "200"
|
data/pushpad.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = "pushpad"
|
3
|
-
spec.version = '0.
|
3
|
+
spec.version = '0.13.0'
|
4
4
|
spec.authors = ["Pushpad"]
|
5
5
|
spec.email = ["support@pushpad.xyz"]
|
6
6
|
spec.summary = "Web push notifications for Chrome, Firefox, Opera, Edge and Safari using Pushpad."
|
@@ -7,35 +7,35 @@ module Pushpad
|
|
7
7
|
let(:notification) { Pushpad::Notification.new body: "Example message" }
|
8
8
|
|
9
9
|
def stub_notification_get(attributes)
|
10
|
-
stub_request(:get, "https://pushpad.xyz/notifications/#{attributes[:id]}").
|
10
|
+
stub_request(:get, "https://pushpad.xyz/api/v1/notifications/#{attributes[:id]}").
|
11
11
|
to_return(status: 200, body: attributes.to_json)
|
12
12
|
end
|
13
13
|
|
14
14
|
def stub_failing_notification_get(notification_id)
|
15
|
-
stub_request(:get, "https://pushpad.xyz/notifications/#{notification_id}").
|
15
|
+
stub_request(:get, "https://pushpad.xyz/api/v1/notifications/#{notification_id}").
|
16
16
|
to_return(status: 404)
|
17
17
|
end
|
18
18
|
|
19
19
|
def stub_notifications_get(options)
|
20
|
-
stub_request(:get, "https://pushpad.xyz/projects/#{options[:project_id]}/notifications").
|
20
|
+
stub_request(:get, "https://pushpad.xyz/api/v1/projects/#{options[:project_id]}/notifications").
|
21
21
|
with(query: hash_including(options.fetch(:query, {}))).
|
22
22
|
to_return(status: 200, body: options[:list].to_json)
|
23
23
|
end
|
24
24
|
|
25
25
|
def stub_failing_notifications_get(options)
|
26
|
-
stub_request(:get, "https://pushpad.xyz/projects/#{options[:project_id]}/notifications").
|
26
|
+
stub_request(:get, "https://pushpad.xyz/api/v1/projects/#{options[:project_id]}/notifications").
|
27
27
|
to_return(status: 403)
|
28
28
|
end
|
29
29
|
|
30
30
|
def stub_notification_post(project_id, params = {}, response_body = "{}")
|
31
31
|
|
32
|
-
stub_request(:post, "https://pushpad.xyz/projects/#{project_id}/notifications").
|
32
|
+
stub_request(:post, "https://pushpad.xyz/api/v1/projects/#{project_id}/notifications").
|
33
33
|
with(body: hash_including(params)).
|
34
34
|
to_return(status: 201, body: response_body)
|
35
35
|
end
|
36
36
|
|
37
37
|
def stub_failing_notification_post(project_id)
|
38
|
-
stub_request(:post, "https://pushpad.xyz/projects/#{project_id}/notifications").
|
38
|
+
stub_request(:post, "https://pushpad.xyz/api/v1/projects/#{project_id}/notifications").
|
39
39
|
to_return(status: 403)
|
40
40
|
end
|
41
41
|
|
@@ -55,12 +55,14 @@ module Pushpad
|
|
55
55
|
id: 5,
|
56
56
|
title: "Foo Bar",
|
57
57
|
body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
|
58
|
-
target_url: "
|
58
|
+
target_url: "https://example.com",
|
59
59
|
created_at: "2016-07-06T10:09:14.835Z",
|
60
60
|
ttl: 604800,
|
61
61
|
require_interaction: false,
|
62
|
+
silent: false,
|
62
63
|
urgent: false,
|
63
64
|
icon_url: "https://example.com/assets/icon.png",
|
65
|
+
badge_url: "https://example.com/assets/badge.png",
|
64
66
|
scheduled_count: 2,
|
65
67
|
successfully_sent_count: 4,
|
66
68
|
opened_count: 1
|
@@ -109,12 +111,14 @@ module Pushpad
|
|
109
111
|
id: 5,
|
110
112
|
title: "Foo Bar",
|
111
113
|
body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
|
112
|
-
target_url: "
|
114
|
+
target_url: "https://example.com",
|
113
115
|
created_at: "2016-07-06T10:09:14.835Z",
|
114
116
|
ttl: 604800,
|
115
117
|
require_interaction: false,
|
118
|
+
silent: false,
|
116
119
|
urgent: false,
|
117
120
|
icon_url: "https://example.com/assets/icon.png",
|
121
|
+
badge_url: "https://example.com/assets/badge.png",
|
118
122
|
scheduled_count: 2,
|
119
123
|
successfully_sent_count: 4,
|
120
124
|
opened_count: 1
|
@@ -274,19 +278,21 @@ module Pushpad
|
|
274
278
|
{
|
275
279
|
body: "Example message",
|
276
280
|
title: "Website Name",
|
277
|
-
target_url: "
|
278
|
-
icon_url: "
|
279
|
-
|
281
|
+
target_url: "https://example.com",
|
282
|
+
icon_url: "https://example.com/assets/icon.png",
|
283
|
+
badge_url: "https://example.com/assets/badge.png",
|
284
|
+
image_url: "https://example.com/assets/image.png",
|
280
285
|
ttl: 604800,
|
281
286
|
require_interaction: true,
|
287
|
+
silent: true,
|
282
288
|
urgent: true,
|
283
289
|
custom_data: "123",
|
284
290
|
custom_metrics: ["examples", "another_metric"],
|
285
291
|
actions: [
|
286
292
|
{
|
287
293
|
title: "My Button 1",
|
288
|
-
target_url: "
|
289
|
-
icon: "
|
294
|
+
target_url: "https://example.com/button-link",
|
295
|
+
icon: "https://example.com/assets/button-icon.png",
|
290
296
|
action: "myActionName"
|
291
297
|
}
|
292
298
|
],
|
@@ -356,19 +362,21 @@ module Pushpad
|
|
356
362
|
{
|
357
363
|
body: "Example message",
|
358
364
|
title: "Website Name",
|
359
|
-
target_url: "
|
360
|
-
icon_url: "
|
361
|
-
|
365
|
+
target_url: "https://example.com",
|
366
|
+
icon_url: "https://example.com/assets/icon.png",
|
367
|
+
badge_url: "https://example.com/assets/badge.png",
|
368
|
+
image_url: "https://example.com/assets/image.png",
|
362
369
|
ttl: 604800,
|
363
370
|
require_interaction: true,
|
371
|
+
silent: true,
|
364
372
|
urgent: true,
|
365
373
|
custom_data: "123",
|
366
374
|
custom_metrics: ["examples", "another_metric"],
|
367
375
|
actions: [
|
368
376
|
{
|
369
377
|
title: "My Button 1",
|
370
|
-
target_url: "
|
371
|
-
icon: "
|
378
|
+
target_url: "https://example.com/button-link",
|
379
|
+
icon: "https://example.com/assets/button-icon.png",
|
372
380
|
action: "myActionName"
|
373
381
|
}
|
374
382
|
],
|
@@ -3,14 +3,14 @@ require "spec_helper"
|
|
3
3
|
module Pushpad
|
4
4
|
describe Subscription do
|
5
5
|
def stub_subscriptions_head(options)
|
6
|
-
stub_request(:head, "https://pushpad.xyz/projects/#{options[:project_id]}/subscriptions").
|
6
|
+
stub_request(:head, "https://pushpad.xyz/api/v1/projects/#{options[:project_id]}/subscriptions").
|
7
7
|
with(query: hash_including(options.fetch(:query, {}))).
|
8
8
|
to_return(status: 200,
|
9
9
|
headers: { "X-Total-Count" => options.fetch(:total_count, 10) })
|
10
10
|
end
|
11
11
|
|
12
12
|
def stub_failing_subscriptions_head(options)
|
13
|
-
stub_request(:head, "https://pushpad.xyz/projects/#{options[:project_id]}/subscriptions").
|
13
|
+
stub_request(:head, "https://pushpad.xyz/api/v1/projects/#{options[:project_id]}/subscriptions").
|
14
14
|
to_return(status: 503)
|
15
15
|
end
|
16
16
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pushpad
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pushpad
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-03-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -38,16 +38,16 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
-
description:
|
41
|
+
description:
|
42
42
|
email:
|
43
43
|
- support@pushpad.xyz
|
44
44
|
executables: []
|
45
45
|
extensions: []
|
46
46
|
extra_rdoc_files: []
|
47
47
|
files:
|
48
|
+
- ".github/workflows/ci.yml"
|
48
49
|
- ".gitignore"
|
49
50
|
- ".rspec"
|
50
|
-
- ".travis.yml"
|
51
51
|
- Gemfile
|
52
52
|
- LICENSE.txt
|
53
53
|
- README.md
|
@@ -66,7 +66,7 @@ homepage: https://pushpad.xyz
|
|
66
66
|
licenses:
|
67
67
|
- MIT
|
68
68
|
metadata: {}
|
69
|
-
post_install_message:
|
69
|
+
post_install_message:
|
70
70
|
rdoc_options: []
|
71
71
|
require_paths:
|
72
72
|
- lib
|
@@ -81,9 +81,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
requirements: []
|
84
|
-
|
85
|
-
|
86
|
-
signing_key:
|
84
|
+
rubygems_version: 3.2.32
|
85
|
+
signing_key:
|
87
86
|
specification_version: 4
|
88
87
|
summary: Web push notifications for Chrome, Firefox, Opera, Edge and Safari using
|
89
88
|
Pushpad.
|
data/.travis.yml
DELETED