pushpad 1.4.0 → 1.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.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +32 -0
- data/lib/pushpad/sender.rb +90 -0
- data/lib/pushpad.rb +1 -0
- data/pushpad.gemspec +1 -1
- data/spec/pushpad/sender_spec.rb +199 -0
- metadata +9 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 917e13bafb6ed1f686bb914ca94d76142db3e5e0bc170889c225832e245bf901
|
4
|
+
data.tar.gz: 3a5031fda8ea89b8daafb8c39180ca3901102eb19bdfe61f8ac0f9352d120131
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a6d0fd32f9312c3938af25bfdc94975cdd383d273e3ede4a84f502092f3c4bdbba18f4776b29675a97a282895646c7c7dd5a49295e4ee73bc4bdae70eb2aa55
|
7
|
+
data.tar.gz: 4c984708c630416ade56a76c311471ce4dd7117e12eb75ea577b4af474bf64a839ccca894fa79c81d096f7319b9c3ca8b9d16bb488f9a1038e5262a5e50eed20
|
data/LICENSE.txt
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
The MIT License (MIT)
|
2
2
|
|
3
|
-
Copyright (c) 2016-
|
3
|
+
Copyright (c) 2016-2024 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
@@ -350,6 +350,38 @@ project.update(name: 'The New Project Name')
|
|
350
350
|
project.delete
|
351
351
|
```
|
352
352
|
|
353
|
+
## Managing senders
|
354
|
+
|
355
|
+
Senders are usually created manually from the Pushpad dashboard. However you can also create senders from code.
|
356
|
+
|
357
|
+
```ruby
|
358
|
+
attributes = {
|
359
|
+
# required attributes
|
360
|
+
name: "My sender",
|
361
|
+
|
362
|
+
# optional configurations
|
363
|
+
# do not include these fields if you want to generate them automatically
|
364
|
+
vapid_private_key: "-----BEGIN EC PRIVATE KEY----- ...",
|
365
|
+
vapid_public_key: "-----BEGIN PUBLIC KEY----- ..."
|
366
|
+
}
|
367
|
+
|
368
|
+
sender = Pushpad::Sender.create(attributes)
|
369
|
+
```
|
370
|
+
|
371
|
+
You can also find, update and delete senders:
|
372
|
+
|
373
|
+
```ruby
|
374
|
+
Pushpad::Sender.find_all.each do |s|
|
375
|
+
puts "Sender #{s.id}: #{s.name}"
|
376
|
+
end
|
377
|
+
|
378
|
+
sender = Pushpad::Sender.find 987
|
379
|
+
|
380
|
+
sender.update(name: 'The New Sender Name')
|
381
|
+
|
382
|
+
sender.delete
|
383
|
+
```
|
384
|
+
|
353
385
|
## License
|
354
386
|
|
355
387
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module Pushpad
|
2
|
+
class Sender
|
3
|
+
class CreateError < RuntimeError
|
4
|
+
end
|
5
|
+
|
6
|
+
class FindError < RuntimeError
|
7
|
+
end
|
8
|
+
|
9
|
+
class UpdateError < RuntimeError
|
10
|
+
end
|
11
|
+
|
12
|
+
class DeleteError < RuntimeError
|
13
|
+
end
|
14
|
+
|
15
|
+
ATTRIBUTES = :id, :name, :vapid_private_key, :vapid_public_key, :created_at
|
16
|
+
|
17
|
+
attr_reader *ATTRIBUTES
|
18
|
+
|
19
|
+
def initialize(options)
|
20
|
+
@id = options[:id]
|
21
|
+
@name = options[:name]
|
22
|
+
@vapid_private_key = options[:vapid_private_key]
|
23
|
+
@vapid_public_key = options[:vapid_public_key]
|
24
|
+
@created_at = options[:created_at] && Time.parse(options[:created_at])
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.create(attributes)
|
28
|
+
endpoint = "https://pushpad.xyz/api/v1/senders"
|
29
|
+
response = Request.post(endpoint, attributes.to_json)
|
30
|
+
|
31
|
+
unless response.code == "201"
|
32
|
+
raise CreateError, "Response #{response.code} #{response.message}: #{response.body}"
|
33
|
+
end
|
34
|
+
|
35
|
+
new(JSON.parse(response.body, symbolize_names: true))
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.find(id)
|
39
|
+
response = Request.get("https://pushpad.xyz/api/v1/senders/#{id}")
|
40
|
+
|
41
|
+
unless response.code == "200"
|
42
|
+
raise FindError, "Response #{response.code} #{response.message}: #{response.body}"
|
43
|
+
end
|
44
|
+
|
45
|
+
new(JSON.parse(response.body, symbolize_names: true))
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.find_all
|
49
|
+
response = Request.get("https://pushpad.xyz/api/v1/senders")
|
50
|
+
|
51
|
+
unless response.code == "200"
|
52
|
+
raise FindError, "Response #{response.code} #{response.message}: #{response.body}"
|
53
|
+
end
|
54
|
+
|
55
|
+
JSON.parse(response.body, symbolize_names: true).map do |attributes|
|
56
|
+
new(attributes)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def update(attributes)
|
61
|
+
raise "You must set id" unless id
|
62
|
+
|
63
|
+
endpoint = "https://pushpad.xyz/api/v1/senders/#{id}"
|
64
|
+
response = Request.patch(endpoint, attributes.to_json)
|
65
|
+
|
66
|
+
unless response.code == "200"
|
67
|
+
raise UpdateError, "Response #{response.code} #{response.message}: #{response.body}"
|
68
|
+
end
|
69
|
+
|
70
|
+
updated = self.class.new(JSON.parse(response.body, symbolize_names: true))
|
71
|
+
|
72
|
+
ATTRIBUTES.each do |attr|
|
73
|
+
self.instance_variable_set("@#{attr}", updated.instance_variable_get("@#{attr}"))
|
74
|
+
end
|
75
|
+
|
76
|
+
self
|
77
|
+
end
|
78
|
+
|
79
|
+
def delete
|
80
|
+
raise "You must set id" unless id
|
81
|
+
|
82
|
+
response = Request.delete("https://pushpad.xyz/api/v1/senders/#{id}")
|
83
|
+
|
84
|
+
unless response.code == "204"
|
85
|
+
raise DeleteError, "Response #{response.code} #{response.message}: #{response.body}"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
data/lib/pushpad.rb
CHANGED
data/pushpad.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = "pushpad"
|
3
|
-
spec.version = '1.
|
3
|
+
spec.version = '1.5.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."
|
@@ -0,0 +1,199 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
module Pushpad
|
4
|
+
describe Sender do
|
5
|
+
|
6
|
+
def stub_senders_post(attributes = {})
|
7
|
+
stub_request(:post, "https://pushpad.xyz/api/v1/senders").
|
8
|
+
with(body: hash_including(attributes)).
|
9
|
+
to_return(status: 201, body: attributes.to_json)
|
10
|
+
end
|
11
|
+
|
12
|
+
def stub_failing_senders_post
|
13
|
+
stub_request(:post, "https://pushpad.xyz/api/v1/senders").
|
14
|
+
to_return(status: 422)
|
15
|
+
end
|
16
|
+
|
17
|
+
def stub_sender_get(attributes)
|
18
|
+
stub_request(:get, "https://pushpad.xyz/api/v1/senders/#{attributes[:id]}").
|
19
|
+
to_return(status: 200, body: attributes.to_json)
|
20
|
+
end
|
21
|
+
|
22
|
+
def stub_failing_sender_get(attributes)
|
23
|
+
stub_request(:get, "https://pushpad.xyz/api/v1/senders/#{attributes[:id]}").
|
24
|
+
to_return(status: 404)
|
25
|
+
end
|
26
|
+
|
27
|
+
def stub_senders_get(list)
|
28
|
+
stub_request(:get, "https://pushpad.xyz/api/v1/senders").
|
29
|
+
to_return(status: 200, body: list.to_json)
|
30
|
+
end
|
31
|
+
|
32
|
+
def stub_failing_senders_get
|
33
|
+
stub_request(:get, "https://pushpad.xyz/api/v1/senders").
|
34
|
+
to_return(status: 401)
|
35
|
+
end
|
36
|
+
|
37
|
+
def stub_sender_patch(id, attributes)
|
38
|
+
stub_request(:patch, "https://pushpad.xyz/api/v1/senders/#{id}").
|
39
|
+
with(body: hash_including(attributes)).
|
40
|
+
to_return(status: 200, body: attributes.to_json)
|
41
|
+
end
|
42
|
+
|
43
|
+
def stub_failing_sender_patch(id)
|
44
|
+
stub_request(:patch, "https://pushpad.xyz/api/v1/senders/#{id}").
|
45
|
+
to_return(status: 422)
|
46
|
+
end
|
47
|
+
|
48
|
+
def stub_sender_delete(id)
|
49
|
+
stub_request(:delete, "https://pushpad.xyz/api/v1/senders/#{id}").
|
50
|
+
to_return(status: 204)
|
51
|
+
end
|
52
|
+
|
53
|
+
def stub_failing_sender_delete(id)
|
54
|
+
stub_request(:delete, "https://pushpad.xyz/api/v1/senders/#{id}").
|
55
|
+
to_return(status: 403)
|
56
|
+
end
|
57
|
+
|
58
|
+
describe ".create" do
|
59
|
+
it "creates a new sender with the given attributes and returns it" do
|
60
|
+
attributes = {
|
61
|
+
name: "My sender"
|
62
|
+
}
|
63
|
+
stub = stub_senders_post(attributes)
|
64
|
+
|
65
|
+
sender = Sender.create(attributes)
|
66
|
+
expect(sender).to have_attributes(attributes)
|
67
|
+
|
68
|
+
expect(stub).to have_been_requested
|
69
|
+
end
|
70
|
+
|
71
|
+
it "fails with CreateError if response status code is not 201" do
|
72
|
+
attributes = { name: "" }
|
73
|
+
stub_failing_senders_post
|
74
|
+
|
75
|
+
expect {
|
76
|
+
Sender.create(attributes)
|
77
|
+
}.to raise_error(Sender::CreateError)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe ".find" do
|
82
|
+
it "returns sender with attributes from json response" do
|
83
|
+
attributes = {
|
84
|
+
id: 182,
|
85
|
+
name: "My sender",
|
86
|
+
vapid_private_key: "-----BEGIN EC PRIVATE KEY----- ...",
|
87
|
+
vapid_public_key: "-----BEGIN PUBLIC KEY----- ...",
|
88
|
+
created_at: "2016-07-06T11:28:21.266Z"
|
89
|
+
}
|
90
|
+
stub_sender_get(attributes)
|
91
|
+
|
92
|
+
sender = Sender.find(182)
|
93
|
+
|
94
|
+
attributes.delete(:created_at)
|
95
|
+
expect(sender).to have_attributes(attributes)
|
96
|
+
expect(sender.created_at.utc.to_s).to eq(Time.utc(2016, 7, 6, 11, 28, 21.266).to_s)
|
97
|
+
end
|
98
|
+
|
99
|
+
it "fails with FindError if response status code is not 200" do
|
100
|
+
attributes = { id: 362 }
|
101
|
+
stub_failing_sender_get(attributes)
|
102
|
+
|
103
|
+
expect {
|
104
|
+
Sender.find(362)
|
105
|
+
}.to raise_error(Sender::FindError)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe ".find_all" do
|
110
|
+
it "returns senders with attributes from json response" do
|
111
|
+
attributes = {
|
112
|
+
id: 182,
|
113
|
+
name: "My sender",
|
114
|
+
vapid_private_key: "-----BEGIN EC PRIVATE KEY----- ...",
|
115
|
+
vapid_public_key: "-----BEGIN PUBLIC KEY----- ...",
|
116
|
+
created_at: "2016-07-06T11:28:21.266Z"
|
117
|
+
}
|
118
|
+
stub_senders_get([attributes])
|
119
|
+
|
120
|
+
senders = Sender.find_all
|
121
|
+
|
122
|
+
attributes.delete(:created_at)
|
123
|
+
expect(senders[0]).to have_attributes(attributes)
|
124
|
+
expect(senders[0].created_at.utc.to_s).to eq(Time.utc(2016, 7, 6, 11, 28, 21.266).to_s)
|
125
|
+
end
|
126
|
+
|
127
|
+
it "fails with FindError if response status code is not 200" do
|
128
|
+
stub_failing_senders_get
|
129
|
+
|
130
|
+
expect {
|
131
|
+
Sender.find_all
|
132
|
+
}.to raise_error(Sender::FindError)
|
133
|
+
end
|
134
|
+
|
135
|
+
it "works properly when there are no results" do
|
136
|
+
stub_senders_get([])
|
137
|
+
|
138
|
+
senders = Sender.find_all
|
139
|
+
|
140
|
+
expect(senders).to eq([])
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
describe "#update" do
|
145
|
+
it "updates a sender with the given attributes and returns it" do
|
146
|
+
attributes = {
|
147
|
+
name: "The New Sender Name"
|
148
|
+
}
|
149
|
+
stub = stub_sender_patch(5, attributes)
|
150
|
+
|
151
|
+
sender = Sender.new(id: 5)
|
152
|
+
sender.update attributes
|
153
|
+
expect(sender).to have_attributes(attributes)
|
154
|
+
|
155
|
+
expect(stub).to have_been_requested
|
156
|
+
end
|
157
|
+
|
158
|
+
it "fails with UpdateError if response status code is not 200" do
|
159
|
+
attributes = { name: "" }
|
160
|
+
stub_failing_sender_patch(5)
|
161
|
+
|
162
|
+
sender = Sender.new(id: 5)
|
163
|
+
|
164
|
+
expect {
|
165
|
+
sender.update attributes
|
166
|
+
}.to raise_error(Sender::UpdateError)
|
167
|
+
end
|
168
|
+
|
169
|
+
it "fails with helpful error message when id is missing" do
|
170
|
+
expect {
|
171
|
+
Sender.new(id: nil).update({})
|
172
|
+
}.to raise_error(/must set id/)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
describe "#delete" do
|
177
|
+
it "deletes a sender" do
|
178
|
+
stub = stub_sender_delete(5)
|
179
|
+
|
180
|
+
sender = Sender.new(id: 5)
|
181
|
+
res = sender.delete
|
182
|
+
expect(res).to be_nil
|
183
|
+
|
184
|
+
expect(stub).to have_been_requested
|
185
|
+
end
|
186
|
+
|
187
|
+
it "fails with DeleteError if response status code is not 204" do
|
188
|
+
stub_failing_sender_delete(5)
|
189
|
+
|
190
|
+
sender = Sender.new(id: 5)
|
191
|
+
|
192
|
+
expect {
|
193
|
+
sender.delete
|
194
|
+
}.to raise_error(Sender::DeleteError)
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
end
|
199
|
+
end
|
metadata
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pushpad
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pushpad
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
date: 2024-10-21 00:00:00.000000000 Z
|
@@ -38,7 +38,7 @@ 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: []
|
@@ -56,11 +56,13 @@ files:
|
|
56
56
|
- lib/pushpad/notification.rb
|
57
57
|
- lib/pushpad/project.rb
|
58
58
|
- lib/pushpad/request.rb
|
59
|
+
- lib/pushpad/sender.rb
|
59
60
|
- lib/pushpad/subscription.rb
|
60
61
|
- pushpad.gemspec
|
61
62
|
- spec/pushpad/notification_spec.rb
|
62
63
|
- spec/pushpad/project_spec.rb
|
63
64
|
- spec/pushpad/request_spec.rb
|
65
|
+
- spec/pushpad/sender_spec.rb
|
64
66
|
- spec/pushpad/subscription_spec.rb
|
65
67
|
- spec/pushpad_spec.rb
|
66
68
|
- spec/spec_helper.rb
|
@@ -68,7 +70,7 @@ homepage: https://pushpad.xyz
|
|
68
70
|
licenses:
|
69
71
|
- MIT
|
70
72
|
metadata: {}
|
71
|
-
post_install_message:
|
73
|
+
post_install_message:
|
72
74
|
rdoc_options: []
|
73
75
|
require_paths:
|
74
76
|
- lib
|
@@ -83,8 +85,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
85
|
- !ruby/object:Gem::Version
|
84
86
|
version: '0'
|
85
87
|
requirements: []
|
86
|
-
rubygems_version: 3.
|
87
|
-
signing_key:
|
88
|
+
rubygems_version: 3.0.3.1
|
89
|
+
signing_key:
|
88
90
|
specification_version: 4
|
89
91
|
summary: Web push notifications for Chrome, Firefox, Opera, Edge and Safari using
|
90
92
|
Pushpad.
|
@@ -92,6 +94,7 @@ test_files:
|
|
92
94
|
- spec/pushpad/notification_spec.rb
|
93
95
|
- spec/pushpad/project_spec.rb
|
94
96
|
- spec/pushpad/request_spec.rb
|
97
|
+
- spec/pushpad/sender_spec.rb
|
95
98
|
- spec/pushpad/subscription_spec.rb
|
96
99
|
- spec/pushpad_spec.rb
|
97
100
|
- spec/spec_helper.rb
|