pushpad 1.4.0 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|