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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2b2ab9c1649cd662512a80f7259a1058563dd3d2fa1dcd3d00f8b1839d83db3d
4
- data.tar.gz: d5d610d96c21c25886c1b2b9d48a6194ebd86dd3ad31d098bbc89cb753e9843c
3
+ metadata.gz: 3ce86b0edf1b9df5dab8e46ba0fc4213c6c14667b7a4fe28d441e03fbf1b747e
4
+ data.tar.gz: 9eee58a5c861c75a0e7b33e6aacf54648da80fd8969ebeadac75e1d418fb95dc
5
5
  SHA512:
6
- metadata.gz: 36f4c851d012b0938cb61ce6df3d134921a058527bf9167b7d91c46da52015ca81e6c7e76fe2b7a2a6ddcce46616fa5ad1dcfa6b0bcccc077d3fe5ef85993121
7
- data.tar.gz: 23529a8c285db0c0f477af3cc9a3d624747cadafa55ffb8a575d890bf25ee3293bdc60368138f977779d4055d414c3eaf90700e96243c8d07a3d68c5e3bdb471
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'
@@ -87,7 +87,7 @@ module Delighted
87
87
  end
88
88
 
89
89
  def is_full_url(url)
90
- !!(URI::regexp(%w(http https)) =~ url)
90
+ !!(URI::DEFAULT_PARSER.make_regexp(%w(http https)) =~ url)
91
91
  end
92
92
  end
93
93
  end
@@ -0,0 +1,7 @@
1
+ module Delighted
2
+ class AutopilotConfiguration < Resource
3
+ self.path = "/autopilot"
4
+
5
+ include Operations::Retrieve
6
+ end
7
+ end
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Delighted
2
- VERSION = "2.0.0"
2
+ VERSION = "2.1.0rc1"
3
3
  end
@@ -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.0.0
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: 2020-03-18 00:00:00.000000000 Z
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: '0'
129
+ version: 1.3.1
128
130
  requirements: []
129
- rubygems_version: 3.1.2
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