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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5a4c81351920b86c10b9926e94eb2aca07a9da9b87ddb3f9d4725459a0993e9c
4
- data.tar.gz: 657f63d05bcabe69c8a197199ab516452d893450ad221b33a07b28162eb7d9be
3
+ metadata.gz: 917e13bafb6ed1f686bb914ca94d76142db3e5e0bc170889c225832e245bf901
4
+ data.tar.gz: 3a5031fda8ea89b8daafb8c39180ca3901102eb19bdfe61f8ac0f9352d120131
5
5
  SHA512:
6
- metadata.gz: 6a1e76b5ebfc31b43af6ff17d394c3f4bc88b41f359ab42359e018e5a213bda46c93ca830b3ec663b6b04d915244eda457463305ded412eb56fc448b50cac332
7
- data.tar.gz: cebbc1b3610953a2064549998acc12348e9bd33c69ef97d20bbfb5f6bdcc4d7c94357cc0296dd4584ec68cb4ac8b3cb883cfa0cd774bff842dc326c1c760abd6
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-2022 Pushpad (https://pushpad.xyz)
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
@@ -4,6 +4,7 @@ require "pushpad/request"
4
4
  require "pushpad/notification"
5
5
  require "pushpad/subscription"
6
6
  require "pushpad/project"
7
+ require "pushpad/sender"
7
8
 
8
9
  module Pushpad
9
10
  @@auth_token = nil
data/pushpad.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "pushpad"
3
- spec.version = '1.4.0'
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.0
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.5.16
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