delighted 2.0.0 → 2.1.0rc1
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/CHANGELOG.md +13 -0
- data/README.md +74 -0
- data/lib/delighted.rb +3 -0
- data/lib/delighted/client.rb +1 -1
- data/lib/delighted/resources/autopilot_configuration.rb +7 -0
- data/lib/delighted/resources/autopilot_membership.rb +28 -0
- data/lib/delighted/version.rb +1 -1
- data/test/delighted_test.rb +208 -0
- metadata +8 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3ce86b0edf1b9df5dab8e46ba0fc4213c6c14667b7a4fe28d441e03fbf1b747e
|
4
|
+
data.tar.gz: 9eee58a5c861c75a0e7b33e6aacf54648da80fd8969ebeadac75e1d418fb95dc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f759a34fe7d102ae00aa9e1b048cdebc9c5731c3fad3bd502af77db8e16b311d4782465a5a47d4885c883435e930433b24b4972676cd72ecf85f5f37b954f1f8
|
7
|
+
data.tar.gz: cc905c3739263c36fdf92ccf62407c814721828e70ae50e36d1d7e79218abb58fbfd73209b21b56585c553915e86db53dfab54e17bcfa407c146ed4fa630b903
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
## 2.1.0rc1 (unreleased)
|
2
|
+
|
3
|
+
Features:
|
4
|
+
|
5
|
+
- Add `Delighted::AutopilotConfiguration.retrieve`
|
6
|
+
- Add `Delighted::AutopilotMembership.list`
|
7
|
+
- Add `Delighted::AutopilotMembership.create`
|
8
|
+
- Add `Delighted::AutopilotMembership.delete`
|
9
|
+
|
10
|
+
Compatibility changes:
|
11
|
+
|
12
|
+
- Replace deprecated `URI::regexp` with `URI::DEFAULT_PARSER.make_regexp`
|
13
|
+
|
1
14
|
## 2.0.0 (2020-03-18)
|
2
15
|
|
3
16
|
Features:
|
data/README.md
CHANGED
@@ -171,6 +171,80 @@ filtered_survey_responses = Delighted::SurveyResponse.all(:page => 5,
|
|
171
171
|
:until => Time.utc(2013, 11, 01))
|
172
172
|
```
|
173
173
|
|
174
|
+
Getting Autopilot state:
|
175
|
+
|
176
|
+
```ruby
|
177
|
+
email_autopilot_state = Delighted::AutopilotConfiguration.retrieve("email")
|
178
|
+
sms_autopilot_state = Delighted::AutopilotConfiguration.retrieve("sms")
|
179
|
+
```
|
180
|
+
|
181
|
+
Listing Autopilot members:
|
182
|
+
|
183
|
+
```ruby
|
184
|
+
email_autopilot_members = Delighted::AutopilotMembership::Email.list
|
185
|
+
begin
|
186
|
+
email_autopilot_members.auto_paging_each do |membership|
|
187
|
+
# Do something with membership
|
188
|
+
end
|
189
|
+
rescue Delighted::RateLimitError => e
|
190
|
+
# Indicates how long to wait before making this request again
|
191
|
+
e.retry_after
|
192
|
+
retry
|
193
|
+
end
|
194
|
+
|
195
|
+
# For convenience, this method can use a sleep to automatically handle rate limits
|
196
|
+
email_autopilot_members.auto_paging_each({ auto_handle_rate_limits: true }) do |membership|
|
197
|
+
# Do something with membership
|
198
|
+
end
|
199
|
+
```
|
200
|
+
|
201
|
+
Look up specific Autopilot member:
|
202
|
+
|
203
|
+
```ruby
|
204
|
+
Delighted::AutopilotMembership::Email
|
205
|
+
.list(person_email: "foo+test1@delighted.com") # or person_id or person_phone_number
|
206
|
+
.auto_paging_each({ auto_handle_rate_limits: true }) do |membership|
|
207
|
+
# Do something with membership. If no membership for this person exists,
|
208
|
+
# this block will never be called.
|
209
|
+
end
|
210
|
+
```
|
211
|
+
|
212
|
+
Add a person to Autopilot:
|
213
|
+
|
214
|
+
```ruby
|
215
|
+
props = {
|
216
|
+
"Shoe Type" => "Sneaker",
|
217
|
+
"Handedness" => "Left"
|
218
|
+
}
|
219
|
+
result = Delighted::AutopilotMembership::Email.create(
|
220
|
+
person_email: "foo+test1@delighted.com",
|
221
|
+
properties: props
|
222
|
+
)
|
223
|
+
```
|
224
|
+
|
225
|
+
Update a person in Autopilot:
|
226
|
+
|
227
|
+
```ruby
|
228
|
+
props = {
|
229
|
+
"Shoe Type" => "Sandal",
|
230
|
+
"Handedness" => "Left"
|
231
|
+
}
|
232
|
+
result = Delighted::AutopilotMembership::Email.create(
|
233
|
+
person_email: "foo+test1@delighted.com",
|
234
|
+
properties: props
|
235
|
+
)
|
236
|
+
```
|
237
|
+
|
238
|
+
Remove a person from Autopilot:
|
239
|
+
|
240
|
+
```ruby
|
241
|
+
result = Delighted::AutopilotMembership::Sms.delete(
|
242
|
+
person_phone_number: "+15555551212"
|
243
|
+
)
|
244
|
+
|
245
|
+
result = Delighted::AutopilotMembership::Sms.delete(person_id: "433523")
|
246
|
+
```
|
247
|
+
|
174
248
|
Retrieving metrics:
|
175
249
|
|
176
250
|
```ruby
|
data/lib/delighted.rb
CHANGED
@@ -26,6 +26,9 @@ require 'delighted/resources/survey_request'
|
|
26
26
|
require 'delighted/resources/survey_response'
|
27
27
|
require 'delighted/resources/unsubscribe'
|
28
28
|
|
29
|
+
require 'delighted/resources/autopilot_configuration'
|
30
|
+
require 'delighted/resources/autopilot_membership'
|
31
|
+
|
29
32
|
require 'delighted/errors'
|
30
33
|
require 'delighted/http_response'
|
31
34
|
require 'delighted/http_adapter'
|
data/lib/delighted/client.rb
CHANGED
@@ -0,0 +1,28 @@
|
|
1
|
+
module Delighted
|
2
|
+
class AutopilotMembership < Resource
|
3
|
+
# This is a class purely so that Sms and Email share a common semantic base class
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def delete(person_id_hash, client = Delighted.shared_client)
|
7
|
+
json = client.delete_json(path, person_id_hash)
|
8
|
+
json.merge(:person => Person.new(json[:person]))
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class Sms < AutopilotMembership
|
13
|
+
self.path = "/autopilot/sms/memberships"
|
14
|
+
self.expandable_attributes = { :person => Person, :next_survey_request => SurveyRequest }
|
15
|
+
|
16
|
+
include Operations::List
|
17
|
+
include Operations::Create
|
18
|
+
end
|
19
|
+
|
20
|
+
class Email < AutopilotMembership
|
21
|
+
self.path = "/autopilot/email/memberships"
|
22
|
+
self.expandable_attributes = { :person => Person, :next_survey_request => SurveyRequest }
|
23
|
+
|
24
|
+
include Operations::List
|
25
|
+
include Operations::Create
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/delighted/version.rb
CHANGED
data/test/delighted_test.rb
CHANGED
@@ -387,3 +387,211 @@ class Delighted::BouncesTest < Delighted::TestCase
|
|
387
387
|
end
|
388
388
|
end
|
389
389
|
|
390
|
+
class Delighted::AutopilotConfigurationsTest < Delighted::TestCase
|
391
|
+
def test_getting_sms_autopilot_configuration
|
392
|
+
uri = URI.parse("https://api.delightedapp.com/v1/autopilot/sms")
|
393
|
+
headers = { 'Authorization' => @auth_header, "Accept" => "application/json", 'User-Agent' => "Delighted RubyGem #{Delighted::VERSION}" }
|
394
|
+
response = Delighted::HTTPResponse.new(200, {}, Delighted::JSON.dump({ :platform_id => 'sms', :active => true, :frequency => 7776000, :created_at => 1611253998, :updated_at => 1618421598 }))
|
395
|
+
mock_http_adapter.expects(:request).with(:get, uri, headers).once.returns(response)
|
396
|
+
|
397
|
+
configuration = Delighted::AutopilotConfiguration.retrieve('sms')
|
398
|
+
assert_kind_of Delighted::AutopilotConfiguration, configuration
|
399
|
+
assert_equal({ :platform_id => 'sms', :active => true, :frequency => 7776000, :created_at => 1611253998, :updated_at => 1618421598 }, configuration.to_hash)
|
400
|
+
assert_equal 'sms', configuration.platform_id
|
401
|
+
assert_equal true, configuration.active
|
402
|
+
assert_equal 7776000, configuration.frequency
|
403
|
+
assert_equal 1611253998, configuration.created_at
|
404
|
+
assert_equal 1618421598, configuration.updated_at
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
408
|
+
class Delighted::AutopilotMembershipsTest < Delighted::TestCase
|
409
|
+
def test_listing_autopilot_memberships
|
410
|
+
first_membership = {
|
411
|
+
:created_at => 1611253998,
|
412
|
+
:updated_at => 1618421598,
|
413
|
+
:person => {
|
414
|
+
:id => "34",
|
415
|
+
:name => "Leslie",
|
416
|
+
:email => "leslie@example.com",
|
417
|
+
:created_at => 1611365037,
|
418
|
+
:phone_number => "+1555555112",
|
419
|
+
:last_sent_at => nil
|
420
|
+
},
|
421
|
+
:next_survey_request => {
|
422
|
+
:id => "42",
|
423
|
+
:created_at => 1614043237,
|
424
|
+
:survey_scheduled_at => 1620087437,
|
425
|
+
:properties => { :"Purchase Experience" => "Web", :"State" => "OR" }
|
426
|
+
}
|
427
|
+
}
|
428
|
+
second_membership = {
|
429
|
+
:created_at => 1611243998,
|
430
|
+
:updated_at => 1618420598,
|
431
|
+
:person => {
|
432
|
+
:id => "42",
|
433
|
+
:name => "Taylor",
|
434
|
+
:email => "taylor@example.com",
|
435
|
+
:created_at => 1611242998,
|
436
|
+
:phone_number => "+1555551212",
|
437
|
+
:last_sent_at => 1611242998
|
438
|
+
},
|
439
|
+
:next_survey_request => {
|
440
|
+
:id => "3445",
|
441
|
+
:created_at => 1614043437,
|
442
|
+
:survey_scheduled_at => 1620087837,
|
443
|
+
:properties => { :"Purchase Experience" => "Mobile", :"State" => "CA" }
|
444
|
+
}
|
445
|
+
}
|
446
|
+
third_membership = {
|
447
|
+
:created_at => 1611143998,
|
448
|
+
:updated_at => 1618320598,
|
449
|
+
:person => {
|
450
|
+
:id => "47",
|
451
|
+
:name => "Casey",
|
452
|
+
:email => "casey@example.com",
|
453
|
+
:created_at => 1610242998,
|
454
|
+
:phone_number => "+1555551234",
|
455
|
+
:last_sent_at => 1610242998
|
456
|
+
},
|
457
|
+
:next_survey_request => {
|
458
|
+
:id => "3449",
|
459
|
+
:created_at => 1614063437,
|
460
|
+
:survey_scheduled_at => 1620097837,
|
461
|
+
:properties => { :"Purchase Experience" => "Store", :"State" => "WA" }
|
462
|
+
}
|
463
|
+
}
|
464
|
+
uri = URI.parse("https://api.delightedapp.com/v1/autopilot/sms/memberships")
|
465
|
+
uri_next = URI.parse("https://api.delightedapp.com/v1/autopilot/sms/memberships?page_info=123456789")
|
466
|
+
headers = { "Authorization" => @auth_header, "Accept" => "application/json", "User-Agent" => "Delighted RubyGem #{Delighted::VERSION}" }
|
467
|
+
|
468
|
+
# First request mock
|
469
|
+
response = Delighted::HTTPResponse.new(200, {"Link" => "<#{uri_next}>; rel=\"next\""}, Delighted::JSON.dump([first_membership, second_membership]))
|
470
|
+
mock_http_adapter.expects(:request).with(:get, uri, headers).once.returns(response)
|
471
|
+
|
472
|
+
# Next request mock
|
473
|
+
response = Delighted::HTTPResponse.new(200, {}, Delighted::JSON.dump([third_membership]))
|
474
|
+
mock_http_adapter.expects(:request).with(:get, uri_next, headers).once.returns(response)
|
475
|
+
|
476
|
+
memberships = []
|
477
|
+
Delighted::AutopilotMembership::Sms.list.auto_paging_each do |membership|
|
478
|
+
memberships << membership
|
479
|
+
end
|
480
|
+
|
481
|
+
assert_equal 3, memberships.size
|
482
|
+
assert_kind_of Delighted::AutopilotMembership::Sms, memberships[0]
|
483
|
+
assert_kind_of Delighted::Person, memberships[0].person
|
484
|
+
assert_kind_of Delighted::SurveyRequest, memberships[0].next_survey_request
|
485
|
+
assert_equal 1611253998, memberships[0].created_at
|
486
|
+
assert_equal "34", memberships[0].person.id
|
487
|
+
assert_nil memberships[0].person.last_sent_at
|
488
|
+
assert_equal first_membership[:person].reject { |k,_| k == :id }, memberships[0].person.to_hash
|
489
|
+
assert_equal "+1555555112", memberships[0].person.phone_number
|
490
|
+
assert_equal 1620087437, memberships[0].next_survey_request.survey_scheduled_at
|
491
|
+
assert_equal first_membership[:next_survey_request][:properties], memberships[0].next_survey_request.properties
|
492
|
+
assert_kind_of Delighted::AutopilotMembership, memberships[1]
|
493
|
+
assert_equal 1611242998, memberships[1].person.last_sent_at
|
494
|
+
end
|
495
|
+
|
496
|
+
def test_listing_specific_autopilot_memberships
|
497
|
+
specific_membership = {
|
498
|
+
:created_at => 1611253998,
|
499
|
+
:updated_at => 1618421598,
|
500
|
+
:person => {
|
501
|
+
:id => "34",
|
502
|
+
:name => "Leslie",
|
503
|
+
:email => "leslie@example.com",
|
504
|
+
:created_at => 1611365037,
|
505
|
+
:phone_number => "+1555555112",
|
506
|
+
:last_sent_at => nil
|
507
|
+
},
|
508
|
+
:next_survey_request => {
|
509
|
+
:id => "42",
|
510
|
+
:created_at => 1614043237,
|
511
|
+
:survey_scheduled_at => 1620087437,
|
512
|
+
:properties => {
|
513
|
+
:"Purchase Experience" => "Web",
|
514
|
+
:"State" => "OR"
|
515
|
+
}
|
516
|
+
}
|
517
|
+
}
|
518
|
+
uri = URI.parse("https://api.delightedapp.com/v1/autopilot/sms/memberships?person_id=34")
|
519
|
+
headers = { "Authorization" => @auth_header, "Accept" => "application/json", "User-Agent" => "Delighted RubyGem #{Delighted::VERSION}" }
|
520
|
+
response = Delighted::HTTPResponse.new(200, {}, Delighted::JSON.dump([specific_membership]))
|
521
|
+
mock_http_adapter.expects(:request).with(:get, uri, headers).once.returns(response)
|
522
|
+
|
523
|
+
memberships = []
|
524
|
+
Delighted::AutopilotMembership::Sms.list(person_id: 34).auto_paging_each do |membership|
|
525
|
+
memberships << membership
|
526
|
+
end
|
527
|
+
|
528
|
+
assert_equal 1, memberships.size
|
529
|
+
assert_kind_of Delighted::AutopilotMembership::Sms, memberships[0]
|
530
|
+
assert_kind_of Delighted::Person, memberships[0].person
|
531
|
+
assert_kind_of Delighted::SurveyRequest, memberships[0].next_survey_request
|
532
|
+
assert_equal 1, memberships.size
|
533
|
+
end
|
534
|
+
|
535
|
+
def test_adding_autopilot_membership
|
536
|
+
params = {
|
537
|
+
person_email: "leslie@example.com",
|
538
|
+
person_name: "Leslie",
|
539
|
+
properties: {
|
540
|
+
:"Purchase Experience" => "Web",
|
541
|
+
:"State" => "OR"
|
542
|
+
}
|
543
|
+
}
|
544
|
+
uri = URI.parse("https://api.delightedapp.com/v1/autopilot/email/memberships")
|
545
|
+
headers = { "Authorization" => @auth_header, "Accept" => "application/json", 'Content-Type' => 'application/json', "User-Agent" => "Delighted RubyGem #{Delighted::VERSION}" }
|
546
|
+
response = Delighted::HTTPResponse.new(200, {}, Delighted::JSON.dump({ person: { id: "333", name: params[:person_name], email: params[:person_email] }, properties: params[:properties] }))
|
547
|
+
mock_http_adapter.expects(:request).with(:post, uri, headers, Delighted::JSON.dump(params)).once.returns(response)
|
548
|
+
|
549
|
+
result = Delighted::AutopilotMembership::Email.create(params)
|
550
|
+
|
551
|
+
assert_kind_of Delighted::AutopilotMembership::Email, result
|
552
|
+
assert_kind_of Delighted::Person, result.person
|
553
|
+
assert_equal params[:properties], result.properties
|
554
|
+
assert_equal params[:person_email], result.person.email
|
555
|
+
assert_equal params[:person_name], result.person.name
|
556
|
+
assert result.person.id
|
557
|
+
assert_equal params[:properties], result.properties
|
558
|
+
end
|
559
|
+
|
560
|
+
def test_updating_autopilot_membership
|
561
|
+
params = {
|
562
|
+
person_id: "333",
|
563
|
+
properties: {
|
564
|
+
:"Purchase Experience" => "Web",
|
565
|
+
:"State" => "OR"
|
566
|
+
}
|
567
|
+
}
|
568
|
+
uri = URI.parse("https://api.delightedapp.com/v1/autopilot/sms/memberships")
|
569
|
+
headers = { "Authorization" => @auth_header, "Accept" => "application/json", 'Content-Type' => 'application/json', "User-Agent" => "Delighted RubyGem #{Delighted::VERSION}" }
|
570
|
+
response = Delighted::HTTPResponse.new(200, {}, Delighted::JSON.dump({ person: { id: "333", name: "Leslie", email: "leslie@example.com", phone_numer: "+15555551212" }, properties: params[:properties] }))
|
571
|
+
mock_http_adapter.expects(:request).with(:post, uri, headers, Delighted::JSON.dump(params)).once.returns(response)
|
572
|
+
|
573
|
+
result = Delighted::AutopilotMembership::Sms.create(params)
|
574
|
+
|
575
|
+
assert_kind_of Delighted::AutopilotMembership::Sms, result
|
576
|
+
assert_kind_of Delighted::Person, result.person
|
577
|
+
assert_equal params[:properties], result.properties
|
578
|
+
assert_equal "leslie@example.com", result.person.email
|
579
|
+
assert_equal "Leslie", result.person.name
|
580
|
+
assert_equal "333", result.person.id
|
581
|
+
assert_equal params[:properties], result.properties
|
582
|
+
end
|
583
|
+
|
584
|
+
def test_removing_autopilot_membership
|
585
|
+
uri = URI.parse("https://api.delightedapp.com/v1/autopilot/sms/memberships")
|
586
|
+
headers = { "Authorization" => @auth_header, "Accept" => "application/json", 'Content-Type' => 'application/json', "User-Agent" => "Delighted RubyGem #{Delighted::VERSION}" }
|
587
|
+
response = Delighted::HTTPResponse.new(200, {}, Delighted::JSON.dump({ person: { id: "333", name: "Leslie", email: "leslie@example.com"} }))
|
588
|
+
mock_http_adapter.expects(:request).with(:delete, uri, headers, Delighted::JSON.dump({person_id: "455"})).once.returns(response)
|
589
|
+
|
590
|
+
result = Delighted::AutopilotMembership::Sms.delete(:person_id => "455")
|
591
|
+
|
592
|
+
assert_kind_of Hash, result
|
593
|
+
assert_equal "leslie@example.com", result[:person].email
|
594
|
+
assert_equal "Leslie", result[:person].name
|
595
|
+
assert_equal "333", result[:person].id
|
596
|
+
end
|
597
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: delighted
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark Dodwell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-05-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: multi_json
|
@@ -96,6 +96,8 @@ files:
|
|
96
96
|
- lib/delighted/operations/retrieve.rb
|
97
97
|
- lib/delighted/operations/update.rb
|
98
98
|
- lib/delighted/resource.rb
|
99
|
+
- lib/delighted/resources/autopilot_configuration.rb
|
100
|
+
- lib/delighted/resources/autopilot_membership.rb
|
99
101
|
- lib/delighted/resources/bounce.rb
|
100
102
|
- lib/delighted/resources/metrics.rb
|
101
103
|
- lib/delighted/resources/person.rb
|
@@ -122,11 +124,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
122
124
|
version: '0'
|
123
125
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
126
|
requirements:
|
125
|
-
- - "
|
127
|
+
- - ">"
|
126
128
|
- !ruby/object:Gem::Version
|
127
|
-
version:
|
129
|
+
version: 1.3.1
|
128
130
|
requirements: []
|
129
|
-
|
131
|
+
rubyforge_project:
|
132
|
+
rubygems_version: 2.7.6.2
|
130
133
|
signing_key:
|
131
134
|
specification_version: 4
|
132
135
|
summary: Delighted is the fastest and easiest way to gather actionable feedback from
|