delighted 2.0.0 → 2.1.0rc1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|