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 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