chartmogul-ruby 3.2.0 → 3.3.1

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.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/changelog.md +11 -0
  4. data/chartmogul-ruby.gemspec +1 -1
  5. data/lib/chartmogul/api/actions/custom.rb +2 -1
  6. data/lib/chartmogul/concerns/pageable_with_cursor.rb +4 -0
  7. data/lib/chartmogul/contact.rb +1 -4
  8. data/lib/chartmogul/customer.rb +13 -1
  9. data/lib/chartmogul/customer_invoices.rb +5 -1
  10. data/lib/chartmogul/enrichment/customer.rb +1 -0
  11. data/lib/chartmogul/invoice.rb +1 -0
  12. data/lib/chartmogul/metrics/activity.rb +1 -4
  13. data/lib/chartmogul/metrics/customers/activity.rb +5 -0
  14. data/lib/chartmogul/metrics/customers/subscription.rb +5 -0
  15. data/lib/chartmogul/plan.rb +1 -0
  16. data/lib/chartmogul/plan_group.rb +1 -0
  17. data/lib/chartmogul/plan_groups/plans.rb +11 -0
  18. data/lib/chartmogul/subscription.rb +5 -0
  19. data/lib/chartmogul/subscription_event.rb +17 -0
  20. data/lib/chartmogul/version.rb +1 -1
  21. metadata +5 -102
  22. data/fixtures/vcr_cassettes/ChartMogul_APIResource/connection/works_in_a_threaded_environment.yml +0 -112
  23. data/fixtures/vcr_cassettes/ChartMogul_APIResource/connection/works_when_credentials_are_updated.yml +0 -77
  24. data/fixtures/vcr_cassettes/ChartMogul_Account/returns_details_of_current_account.yml +0 -64
  25. data/fixtures/vcr_cassettes/ChartMogul_Contact/API_Interactions/creates_contact_correctly.yml +0 -134
  26. data/fixtures/vcr_cassettes/ChartMogul_Contact/API_Interactions/destroys_contact_correctly.yml +0 -99
  27. data/fixtures/vcr_cassettes/ChartMogul_Contact/API_Interactions/merges_contact_correctly.yml +0 -105
  28. data/fixtures/vcr_cassettes/ChartMogul_Contact/API_Interactions/paginates_correctly.yml +0 -133
  29. data/fixtures/vcr_cassettes/ChartMogul_Contact/API_Interactions/updates_contact_correctly.yml +0 -102
  30. data/fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/adds_custom_attributes.yml +0 -80
  31. data/fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/adds_required_tags.yml +0 -79
  32. data/fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/can_page_through_search_endpoint.yml +0 -43
  33. data/fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/correctly_handles_a_422_response.yml +0 -50
  34. data/fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/correctly_interracts_with_the_API.yml +0 -192
  35. data/fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/creates_a_contact_belonging_to_the_customer_correctly.yml +0 -72
  36. data/fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/lists_the_contacts_belonging_to_the_customer_correctly.yml +0 -72
  37. data/fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/merges_customers.yml +0 -185
  38. data/fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/raises_401_if_invalid_credentials.yml +0 -38
  39. data/fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/raises_404_if_no_customers_found.yml +0 -38
  40. data/fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/raises_422_for_update_with_invalid_data.yml +0 -86
  41. data/fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/removes_custom_attributes.yml +0 -80
  42. data/fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/removes_tags.yml +0 -80
  43. data/fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/respects_camel_case_for_all_customers_endpoint.yml +0 -45
  44. data/fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/returns_all_customers_through_list_all_endpoint.yml +0 -47
  45. data/fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/returns_customer_through_retrieve_endpoint.yml +0 -42
  46. data/fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/returns_right_customers_through_search_endpoint.yml +0 -43
  47. data/fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/updates_custom_attributes.yml +0 -81
  48. data/fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/updates_customer.yml +0 -139
  49. data/fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/updates_customer_using_class_method.yml +0 -53
  50. data/fixtures/vcr_cassettes/ChartMogul_Customer/_find_by_external_id/when_external_id_is_provided/returns_matching_user_if_exists.yml +0 -102
  51. data/fixtures/vcr_cassettes/ChartMogul_Customer/_find_by_external_id/when_external_id_is_provided/returns_nil_if_customer_does_not_exist.yml +0 -101
  52. data/fixtures/vcr_cassettes/ChartMogul_CustomerInvoices/API_Interactions/correctly_interracts_with_the_API.yml +0 -337
  53. data/fixtures/vcr_cassettes/ChartMogul_DataSource/API_Interactions/correctly_interracts_with_the_API.yml +0 -189
  54. data/fixtures/vcr_cassettes/ChartMogul_DataSource/API_Interactions/correctly_raises_errors_on_404.yml +0 -46
  55. data/fixtures/vcr_cassettes/ChartMogul_DataSource/API_Interactions/correctly_raises_errors_on_422.yml +0 -48
  56. data/fixtures/vcr_cassettes/ChartMogul_DataSource/API_Interactions/retrieves_existing_data_source_matching_uuid.yml +0 -101
  57. data/fixtures/vcr_cassettes/ChartMogul_Invoice/API_Interactions/deletes_an_invoice.yml +0 -37
  58. data/fixtures/vcr_cassettes/ChartMogul_Invoice/API_Interactions/deletes_an_invoice_with_class_method.yml +0 -37
  59. data/fixtures/vcr_cassettes/ChartMogul_Invoice/API_Interactions/raises_error_on_deleting_non-existing_invoice.yml +0 -42
  60. data/fixtures/vcr_cassettes/ChartMogul_Invoice/API_Interactions/retrieves_existing_invoice_by_uuid.yml +0 -50
  61. data/fixtures/vcr_cassettes/ChartMogul_Invoice/API_Interactions/returns_all_invoices_through_list_all_endpoint.yml +0 -46
  62. data/fixtures/vcr_cassettes/ChartMogul_Metrics_ARPA/behaves_like_Metrics_API_resource/behaves_like_Summary/should_have_summary.yml +0 -42
  63. data/fixtures/vcr_cassettes/ChartMogul_Metrics_ARPA/behaves_like_Metrics_API_resource/should_have_entries.yml +0 -42
  64. data/fixtures/vcr_cassettes/ChartMogul_Metrics_ARR/behaves_like_Metrics_API_resource/behaves_like_Summary/should_have_summary.yml +0 -42
  65. data/fixtures/vcr_cassettes/ChartMogul_Metrics_ARR/behaves_like_Metrics_API_resource/should_have_entries.yml +0 -42
  66. data/fixtures/vcr_cassettes/ChartMogul_Metrics_ASP/behaves_like_Metrics_API_resource/behaves_like_Summary/should_have_summary.yml +0 -40
  67. data/fixtures/vcr_cassettes/ChartMogul_Metrics_ASP/behaves_like_Metrics_API_resource/should_have_entries.yml +0 -40
  68. data/fixtures/vcr_cassettes/ChartMogul_Metrics_ActivitiesExport/get_activities_export.yml +0 -43
  69. data/fixtures/vcr_cassettes/ChartMogul_Metrics_ActivitiesExport/post_activities_export.yml +0 -83
  70. data/fixtures/vcr_cassettes/ChartMogul_Metrics_Activity/behaves_like_PageableWithAnchor/should_be_pageable.yml +0 -44
  71. data/fixtures/vcr_cassettes/ChartMogul_Metrics_Activity/should_have_Activity_entries.yml +0 -44
  72. data/fixtures/vcr_cassettes/ChartMogul_Metrics_Activity.yml +0 -37
  73. data/fixtures/vcr_cassettes/ChartMogul_Metrics_AllKeyMetric/should_have_entries.yml +0 -42
  74. data/fixtures/vcr_cassettes/ChartMogul_Metrics_AllKeyMetric/should_have_summary.yml +0 -42
  75. data/fixtures/vcr_cassettes/ChartMogul_Metrics_CustomerChurnRate/behaves_like_Metrics_API_resource/behaves_like_Summary/should_have_summary.yml +0 -40
  76. data/fixtures/vcr_cassettes/ChartMogul_Metrics_CustomerChurnRate/behaves_like_Metrics_API_resource/should_have_entries.yml +0 -40
  77. data/fixtures/vcr_cassettes/ChartMogul_Metrics_CustomerCount/behaves_like_Metrics_API_resource/behaves_like_Summary/should_have_summary.yml +0 -42
  78. data/fixtures/vcr_cassettes/ChartMogul_Metrics_CustomerCount/behaves_like_Metrics_API_resource/should_have_entries.yml +0 -42
  79. data/fixtures/vcr_cassettes/ChartMogul_Metrics_Customers_Activity/behaves_like_Pageable/should_be_pageable.yml +0 -41
  80. data/fixtures/vcr_cassettes/ChartMogul_Metrics_Customers_Activity/should_have_Activity_entries.yml +0 -41
  81. data/fixtures/vcr_cassettes/ChartMogul_Metrics_Customers_Subscription/behaves_like_Pageable/should_be_pageable.yml +0 -40
  82. data/fixtures/vcr_cassettes/ChartMogul_Metrics_Customers_Subscription/should_have_Subscription_entries.yml +0 -40
  83. data/fixtures/vcr_cassettes/ChartMogul_Metrics_LTV/behaves_like_Metrics_API_resource/behaves_like_Summary/should_have_summary.yml +0 -40
  84. data/fixtures/vcr_cassettes/ChartMogul_Metrics_LTV/behaves_like_Metrics_API_resource/should_have_entries.yml +0 -40
  85. data/fixtures/vcr_cassettes/ChartMogul_Metrics_MRR/behaves_like_Summary/should_have_summary.yml +0 -42
  86. data/fixtures/vcr_cassettes/ChartMogul_Metrics_MRR/should_have_entries.yml +0 -42
  87. data/fixtures/vcr_cassettes/ChartMogul_Metrics_MRRChurnRate/behaves_like_Metrics_API_resource/behaves_like_Summary/should_have_summary.yml +0 -40
  88. data/fixtures/vcr_cassettes/ChartMogul_Metrics_MRRChurnRate/behaves_like_Metrics_API_resource/should_have_entries.yml +0 -40
  89. data/fixtures/vcr_cassettes/ChartMogul_Ping/pings/and_fails_on_incorrect_credentials.yml +0 -38
  90. data/fixtures/vcr_cassettes/ChartMogul_Ping/pings/and_fails_with_500_internal_server_error.yml +0 -40
  91. data/fixtures/vcr_cassettes/ChartMogul_Ping/pings/and_fails_with_504_gateway_timeout_error.yml +0 -40
  92. data/fixtures/vcr_cassettes/ChartMogul_Ping/pings/when_credentials_correct.yml +0 -38
  93. data/fixtures/vcr_cassettes/ChartMogul_Plan/API_Interactions/correctly_handles_a_422_error.yml +0 -51
  94. data/fixtures/vcr_cassettes/ChartMogul_Plan/API_Interactions/correctly_interacts_with_the_API.yml +0 -152
  95. data/fixtures/vcr_cassettes/ChartMogul_Plan/API_Interactions/deletes_existing_plan.yml +0 -198
  96. data/fixtures/vcr_cassettes/ChartMogul_Plan/API_Interactions/retrieves_existing_plan_by_uuid.yml +0 -151
  97. data/fixtures/vcr_cassettes/ChartMogul_Plan/API_Interactions/updates_existing_plan.yml +0 -198
  98. data/fixtures/vcr_cassettes/ChartMogul_Plan/API_Interactions/updates_existing_plan_using_class_method.yml +0 -164
  99. data/fixtures/vcr_cassettes/ChartMogul_PlanGroup/API_interactions/correctly_handles_a_422_error.yml +0 -50
  100. data/fixtures/vcr_cassettes/ChartMogul_PlanGroup/API_interactions/deletes_a_plan_group.yml +0 -293
  101. data/fixtures/vcr_cassettes/ChartMogul_PlanGroup/API_interactions/retrieves_existing_plan_group_by_uuid.yml +0 -251
  102. data/fixtures/vcr_cassettes/ChartMogul_PlanGroup/API_interactions/returns_an_array_of_plan_groups.yml +0 -357
  103. data/fixtures/vcr_cassettes/ChartMogul_PlanGroup/API_interactions/updates_existing_plan_group_name.yml +0 -304
  104. data/fixtures/vcr_cassettes/ChartMogul_PlanGroup/API_interactions/updates_existing_plan_group_name_via_class_method.yml +0 -297
  105. data/fixtures/vcr_cassettes/ChartMogul_PlanGroup/API_interactions/updates_existing_plan_group_plans.yml +0 -411
  106. data/fixtures/vcr_cassettes/ChartMogul_PlanGroups_Plans/API_interactions/given_a_plan_group_uuid_returns_an_array_of_plans_in_the_plan_group.yml +0 -252
  107. data/fixtures/vcr_cassettes/ChartMogul_Subscription/API_Interactions/connects_subscriptions.yml +0 -436
  108. data/fixtures/vcr_cassettes/ChartMogul_Subscription/API_Interactions/correctly_interracts_with_the_API.yml +0 -340
  109. data/fixtures/vcr_cassettes/ChartMogul_Subscription/API_Interactions/has_multiple_aliases.yml +0 -101
  110. data/fixtures/vcr_cassettes/ChartMogul_Subscription/_update_cancellation_dates/when_array_has_time_objects/is_setting_the_cancellation_dates_of_the_subscription.yml +0 -138
  111. data/fixtures/vcr_cassettes/ChartMogul_Subscription/_update_cancellation_dates/when_array_includes_invalid_entries/raises_an_exception.yml +0 -93
  112. data/fixtures/vcr_cassettes/ChartMogul_Subscription/_update_cancellation_dates/when_array_includes_valid_entries/is_setting_the_cancellation_dates_of_the_subscription.yml +0 -138
  113. data/fixtures/vcr_cassettes/ChartMogul_Subscription/_update_cancellation_dates/when_array_is_empty/makes_an_API_call_and_removes_the_cancellation_dates.yml +0 -138
  114. data/fixtures/vcr_cassettes/ChartMogul_SubscriptionEvent/API_interactions/creates_a_new_subscription_event.yml +0 -320
  115. data/fixtures/vcr_cassettes/ChartMogul_SubscriptionEvent/API_interactions/deletes_the_subscription_event.yml +0 -377
  116. data/fixtures/vcr_cassettes/ChartMogul_SubscriptionEvent/API_interactions/lists_all_subscription_events.yml +0 -320
  117. data/fixtures/vcr_cassettes/ChartMogul_SubscriptionEvent/API_interactions/updates_the_subscription_event.yml +0 -377
  118. data/fixtures/vcr_cassettes/ChartMogul_Transactions_Payment/API_Interactions/correctly_interracts_with_the_API.yml +0 -243
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ab4919c76f5171e56a194669e8b74fca6493ff75471a16f91ba0d75ff0465221
4
- data.tar.gz: 68a1c21253bf2198caa041d22dfb459dfafbae69073d098923f71d0854b0a8e9
3
+ metadata.gz: 21d9a4cf92007310afc20b247902c00c7f8b9ff72af318b68f2ead99d684e883
4
+ data.tar.gz: 21839b81aa52218acbc90283dd41da929bf5e3962c3beb14fc3002a8b7b80ed2
5
5
  SHA512:
6
- metadata.gz: 58b6b5379791fbd767466e3a841e1e4f2951e50896a8ef44c17ea04ff789ca6bc106c5a54733539e2232ec25de8b4924fe07a75fbdb12ac8752429c531a73c45
7
- data.tar.gz: 3e44c3234b916381053aa0e60eff2bba3c48d468ffd24cf69c5f3b80afcc4a78e38cdd4865842f714fe6f7412deb7796791fd3e69e03259aa503e266ee3da344
6
+ metadata.gz: 936baf5615aca48e08be7dca9d6cee0af52742ee4514d8a17300891cd192f857c99be4e12809932b808e2e2c2c7ed1116b577f6d5968a94e1ce1782555e42465
7
+ data.tar.gz: f27864dd15a8ab31d0faa8ccf9dd66b04a45da59d703b523437b84b632677b7396f6d23b1266629754452df12116c761e95139df3c33e2df68d005a06c136a01
data/.gitignore CHANGED
@@ -9,4 +9,5 @@
9
9
  /tmp/
10
10
  *.swp
11
11
  vendor/bundle
12
- /.idea
12
+ /.idea
13
+ .DS_Store
data/changelog.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # chartmogul-ruby Change Log
2
2
 
3
+ ## Version 3.3.1 - October 27 2023
4
+ - Add support for cursor based pagination to `.all` endpoints.
5
+ - Add `.next` pagination method for all supported cursor based endpoints.
6
+ - Move `fixtures/` folder inside the `spec/` folder.
7
+ - Update `.merge!` methods to always return `true` when successful.
8
+ - Add new attributes to `ChartMogul::Customer` resource.
9
+ - Do not error when the server returns an empty body from `.custom!` methods.
10
+
11
+ ## Version 3.3.0 - August 14 2023
12
+ - Fix an issue with creating using `SubscriptionEvents.create!(attrs)`.
13
+
3
14
  ## Version 3.2.0 - June 14 2023
4
15
  - Adds support for Faraday 2.7
5
16
  - Removes support for Ruby 2.3, 2.4, and 2.5
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.add_dependency 'faraday-retry', '~> 2.2'
32
32
 
33
33
  spec.add_development_dependency 'bundler', '~> 2'
34
- spec.add_development_dependency 'pry', '~> 0.12.2'
34
+ spec.add_development_dependency 'pry', '~> 0.14.2'
35
35
  spec.add_development_dependency 'rake', '~> 13.0'
36
36
  spec.add_development_dependency 'rspec', '~> 3.0'
37
37
  spec.add_development_dependency 'rubocop', '0.79'
@@ -25,7 +25,8 @@ module ChartMogul
25
25
  req.body = JSON.dump(body_data)
26
26
  end
27
27
  end
28
- ChartMogul::Utils::JSONParser.parse(resp.body, immutable_keys: immutable_keys)
28
+ parsed_body = resp.body.empty? ? '{}' : resp.body
29
+ ChartMogul::Utils::JSONParser.parse(parsed_body, immutable_keys: immutable_keys)
29
30
  end
30
31
 
31
32
  def custom!(http_method, http_path, body_data = {})
@@ -9,6 +9,10 @@ module ChartMogul
9
9
  readonly_attr :cursor
10
10
  end
11
11
  end
12
+
13
+ def next(options = {})
14
+ self.class.all(options.merge(cursor: cursor))
15
+ end
12
16
  end
13
17
  end
14
18
  end
@@ -34,6 +34,7 @@ module ChartMogul
34
34
 
35
35
  def self.merge!(into_uuid:, from_uuid:)
36
36
  custom!(:post, "/v1/contacts/#{into_uuid}/merge/#{from_uuid}")
37
+ true
37
38
  end
38
39
 
39
40
  def serialize_for_write
@@ -61,9 +62,5 @@ module ChartMogul
61
62
  include Concerns::PageableWithCursor
62
63
 
63
64
  set_entry_class Contact
64
-
65
- def next(options = {})
66
- Contacts.all(options.merge(cursor: cursor))
67
- end
68
65
  end
69
66
  end
@@ -34,6 +34,8 @@ module ChartMogul
34
34
  writeable_attr :data_source_uuid
35
35
  writeable_attr :lead_created_at, type: :time
36
36
  writeable_attr :free_trial_started_at, type: :time
37
+ writeable_attr :owner
38
+ writeable_attr :primary_contact
37
39
 
38
40
  include API::Actions::Create
39
41
  include API::Actions::Custom
@@ -53,6 +55,15 @@ module ChartMogul
53
55
  all(external_id: external_id).first
54
56
  end
55
57
 
58
+ def self.merge!(into_uuid:, from_uuid:)
59
+ options = {
60
+ from: { customer_uuid: from_uuid },
61
+ into: { customer_uuid: into_uuid }
62
+ }
63
+ custom!(:post, '/v1/customers/merges', options)
64
+ true
65
+ end
66
+
56
67
  def subscriptions(options = {})
57
68
  @subscriptions ||= ChartMogul::Subscription.all(uuid, options)
58
69
  end
@@ -109,7 +120,7 @@ module ChartMogul
109
120
  def remove_custom_attributes!(*custom_attrs)
110
121
  self.custom_attributes = custom_without_assign!(:delete,
111
122
  "/v1/customers/#{uuid}/attributes/custom",
112
- custom: custom_attrs)[:custom]
123
+ custom: custom_attrs)
113
124
  end
114
125
 
115
126
  def merge_into!(other_customer)
@@ -146,6 +157,7 @@ module ChartMogul
146
157
  include API::Actions::Custom
147
158
  include Concerns::Pageable
148
159
  include Concerns::Pageable2
160
+ include Concerns::PageableWithCursor
149
161
 
150
162
  set_entry_class Customer
151
163
 
@@ -17,6 +17,7 @@ module ChartMogul
17
17
  include API::Actions::All
18
18
  include API::Actions::Create
19
19
  include Concerns::Pageable2
20
+ include Concerns::PageableWithCursor
20
21
 
21
22
  def serialize_invoices
22
23
  map(&:serialize_for_write)
@@ -26,6 +27,10 @@ module ChartMogul
26
27
  super(options.merge(customer_uuid: customer_uuid))
27
28
  end
28
29
 
30
+ def next(options = {})
31
+ CustomerInvoices.all(customer_uuid, options.merge(cursor: cursor))
32
+ end
33
+
29
34
  def self.destroy_all!(data_source_uuid, customer_uuid)
30
35
  path = ChartMogul::ResourcePath.new('v1/data_sources/:data_source_uuid/customers/:customer_uuid/invoices')
31
36
  handling_errors do
@@ -34,7 +39,6 @@ module ChartMogul
34
39
  true
35
40
  end
36
41
 
37
-
38
42
  def_delegators :invoices, :each, :[], :<<, :size, :length, :empty?, :first
39
43
 
40
44
  private
@@ -120,6 +120,7 @@ module ChartMogul
120
120
  include Concerns::Entries
121
121
  include API::Actions::Custom
122
122
  include Concerns::Pageable
123
+ include Concerns::PageableWithCursor
123
124
 
124
125
  set_entry_class DeprecatedCustomer
125
126
 
@@ -83,6 +83,7 @@ module ChartMogul
83
83
 
84
84
  include Concerns::Entries
85
85
  include Concerns::Pageable2
86
+ include Concerns::PageableWithCursor
86
87
 
87
88
  set_entry_class Invoice
88
89
  end
@@ -29,12 +29,9 @@ module ChartMogul
29
29
 
30
30
  include Concerns::Entries
31
31
  include Concerns::PageableWithAnchor
32
+ include Concerns::PageableWithCursor
32
33
 
33
34
  set_entry_class Activity
34
-
35
- def self.all(options = {})
36
- super(options)
37
- end
38
35
  end
39
36
  end
40
37
  end
@@ -26,12 +26,17 @@ module ChartMogul
26
26
 
27
27
  include Concerns::Entries
28
28
  include Concerns::Pageable
29
+ include Concerns::PageableWithCursor
29
30
 
30
31
  set_entry_class Activity
31
32
 
32
33
  def self.all(customer_uuid, options = {})
33
34
  super(options.merge(customer_uuid: customer_uuid))
34
35
  end
36
+
37
+ def next(customer_uuid, options = {})
38
+ Activities.all(customer_uuid, options.merge(cursor: cursor))
39
+ end
35
40
  end
36
41
  end
37
42
  end
@@ -29,12 +29,17 @@ module ChartMogul
29
29
 
30
30
  include Concerns::Entries
31
31
  include Concerns::Pageable
32
+ include Concerns::PageableWithCursor
32
33
 
33
34
  set_entry_class Subscription
34
35
 
35
36
  def self.all(customer_uuid, options = {})
36
37
  super(options.merge(customer_uuid: customer_uuid))
37
38
  end
39
+
40
+ def next(customer_uuid, options = {})
41
+ Subscriptions.all(customer_uuid, options.merge(cursor: cursor))
42
+ end
38
43
  end
39
44
  end
40
45
  end
@@ -33,6 +33,7 @@ module ChartMogul
33
33
 
34
34
  include Concerns::Entries
35
35
  include Concerns::Pageable2
36
+ include Concerns::PageableWithCursor
36
37
 
37
38
  set_entry_class Plan
38
39
  end
@@ -32,6 +32,7 @@ module ChartMogul
32
32
 
33
33
  include Concerns::Entries
34
34
  include Concerns::Pageable2
35
+ include Concerns::PageableWithCursor
35
36
 
36
37
  set_entry_class PlanGroup
37
38
  end
@@ -10,8 +10,19 @@ module ChartMogul
10
10
 
11
11
  include Concerns::Entries
12
12
  include Concerns::Pageable2
13
+ include Concerns::PageableWithCursor
14
+ include API::Actions::Custom
13
15
 
14
16
  set_entry_class Plan
17
+
18
+ def self.all(plan_group_uuid, options = {})
19
+ super(options.merge(plan_group_uuid: plan_group_uuid))
20
+ end
21
+
22
+ def next(plan_group_uuid, options = {})
23
+ path = ChartMogul::ResourcePath.new("/v1/plan_groups/#{plan_group_uuid}/plans")
24
+ custom!(:get, path.apply_with_get_params(options.merge(cursor: cursor)))
25
+ end
15
26
  end
16
27
  end
17
28
  end
@@ -55,11 +55,16 @@ module ChartMogul
55
55
 
56
56
  include Concerns::Entries
57
57
  include Concerns::Pageable2
58
+ include Concerns::PageableWithCursor
58
59
 
59
60
  set_entry_class Subscription
60
61
 
61
62
  def self.all(customer_uuid, options = {})
62
63
  super(options.merge(customer_uuid: customer_uuid))
63
64
  end
65
+
66
+ def next(customer_uuid, options = {})
67
+ Subscriptions.all(customer_uuid, options.merge(cursor: cursor))
68
+ end
64
69
  end
65
70
  end
@@ -35,6 +35,22 @@ module ChartMogul
35
35
  custom!(:post, resource_path.path, subscription_event: instance_attributes)
36
36
  end
37
37
 
38
+ # This endpoint requires we send the attributes as:
39
+ # { subscription_event: { key: value }}
40
+ # So we do not include the API::Actions::Create module here and rather use a
41
+ # variation of the method there to accommodate this difference in behaviour.
42
+ def self.create!(attributes)
43
+ resp = handling_errors do
44
+ connection.post(resource_path.path) do |req|
45
+ req.headers['Content-Type'] = 'application/json'
46
+ req.body = JSON.dump({ subscription_event: attributes })
47
+ end
48
+ end
49
+ json = ChartMogul::Utils::JSONParser.parse(resp.body, immutable_keys: immutable_keys)
50
+
51
+ new_from_json(json)
52
+ end
53
+
38
54
  def update!(attrs)
39
55
  custom!(:patch, resource_path.path, subscription_event: attrs.merge(id: instance_attributes[:id]))
40
56
  end
@@ -56,6 +72,7 @@ module ChartMogul
56
72
 
57
73
  include API::Actions::All
58
74
  include Concerns::Entries
75
+ include Concerns::PageableWithCursor
59
76
 
60
77
  set_entry_class SubscriptionEvent
61
78
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ChartMogul
4
- VERSION = '3.2.0'
4
+ VERSION = '3.3.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chartmogul-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.0
4
+ version: 3.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Petr Kopac
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-06-15 00:00:00.000000000 Z
11
+ date: 2023-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.12.2
61
+ version: 0.14.2
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.12.2
68
+ version: 0.14.2
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -197,103 +197,6 @@ files:
197
197
  - bin/setup
198
198
  - changelog.md
199
199
  - chartmogul-ruby.gemspec
200
- - fixtures/vcr_cassettes/ChartMogul_APIResource/connection/works_in_a_threaded_environment.yml
201
- - fixtures/vcr_cassettes/ChartMogul_APIResource/connection/works_when_credentials_are_updated.yml
202
- - fixtures/vcr_cassettes/ChartMogul_Account/returns_details_of_current_account.yml
203
- - fixtures/vcr_cassettes/ChartMogul_Contact/API_Interactions/creates_contact_correctly.yml
204
- - fixtures/vcr_cassettes/ChartMogul_Contact/API_Interactions/destroys_contact_correctly.yml
205
- - fixtures/vcr_cassettes/ChartMogul_Contact/API_Interactions/merges_contact_correctly.yml
206
- - fixtures/vcr_cassettes/ChartMogul_Contact/API_Interactions/paginates_correctly.yml
207
- - fixtures/vcr_cassettes/ChartMogul_Contact/API_Interactions/updates_contact_correctly.yml
208
- - fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/adds_custom_attributes.yml
209
- - fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/adds_required_tags.yml
210
- - fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/can_page_through_search_endpoint.yml
211
- - fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/correctly_handles_a_422_response.yml
212
- - fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/correctly_interracts_with_the_API.yml
213
- - fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/creates_a_contact_belonging_to_the_customer_correctly.yml
214
- - fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/lists_the_contacts_belonging_to_the_customer_correctly.yml
215
- - fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/merges_customers.yml
216
- - fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/raises_401_if_invalid_credentials.yml
217
- - fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/raises_404_if_no_customers_found.yml
218
- - fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/raises_422_for_update_with_invalid_data.yml
219
- - fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/removes_custom_attributes.yml
220
- - fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/removes_tags.yml
221
- - fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/respects_camel_case_for_all_customers_endpoint.yml
222
- - fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/returns_all_customers_through_list_all_endpoint.yml
223
- - fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/returns_customer_through_retrieve_endpoint.yml
224
- - fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/returns_right_customers_through_search_endpoint.yml
225
- - fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/updates_custom_attributes.yml
226
- - fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/updates_customer.yml
227
- - fixtures/vcr_cassettes/ChartMogul_Customer/API_Interactions/updates_customer_using_class_method.yml
228
- - fixtures/vcr_cassettes/ChartMogul_Customer/_find_by_external_id/when_external_id_is_provided/returns_matching_user_if_exists.yml
229
- - fixtures/vcr_cassettes/ChartMogul_Customer/_find_by_external_id/when_external_id_is_provided/returns_nil_if_customer_does_not_exist.yml
230
- - fixtures/vcr_cassettes/ChartMogul_CustomerInvoices/API_Interactions/correctly_interracts_with_the_API.yml
231
- - fixtures/vcr_cassettes/ChartMogul_DataSource/API_Interactions/correctly_interracts_with_the_API.yml
232
- - fixtures/vcr_cassettes/ChartMogul_DataSource/API_Interactions/correctly_raises_errors_on_404.yml
233
- - fixtures/vcr_cassettes/ChartMogul_DataSource/API_Interactions/correctly_raises_errors_on_422.yml
234
- - fixtures/vcr_cassettes/ChartMogul_DataSource/API_Interactions/retrieves_existing_data_source_matching_uuid.yml
235
- - fixtures/vcr_cassettes/ChartMogul_Invoice/API_Interactions/deletes_an_invoice.yml
236
- - fixtures/vcr_cassettes/ChartMogul_Invoice/API_Interactions/deletes_an_invoice_with_class_method.yml
237
- - fixtures/vcr_cassettes/ChartMogul_Invoice/API_Interactions/raises_error_on_deleting_non-existing_invoice.yml
238
- - fixtures/vcr_cassettes/ChartMogul_Invoice/API_Interactions/retrieves_existing_invoice_by_uuid.yml
239
- - fixtures/vcr_cassettes/ChartMogul_Invoice/API_Interactions/returns_all_invoices_through_list_all_endpoint.yml
240
- - fixtures/vcr_cassettes/ChartMogul_Metrics_ARPA/behaves_like_Metrics_API_resource/behaves_like_Summary/should_have_summary.yml
241
- - fixtures/vcr_cassettes/ChartMogul_Metrics_ARPA/behaves_like_Metrics_API_resource/should_have_entries.yml
242
- - fixtures/vcr_cassettes/ChartMogul_Metrics_ARR/behaves_like_Metrics_API_resource/behaves_like_Summary/should_have_summary.yml
243
- - fixtures/vcr_cassettes/ChartMogul_Metrics_ARR/behaves_like_Metrics_API_resource/should_have_entries.yml
244
- - fixtures/vcr_cassettes/ChartMogul_Metrics_ASP/behaves_like_Metrics_API_resource/behaves_like_Summary/should_have_summary.yml
245
- - fixtures/vcr_cassettes/ChartMogul_Metrics_ASP/behaves_like_Metrics_API_resource/should_have_entries.yml
246
- - fixtures/vcr_cassettes/ChartMogul_Metrics_ActivitiesExport/get_activities_export.yml
247
- - fixtures/vcr_cassettes/ChartMogul_Metrics_ActivitiesExport/post_activities_export.yml
248
- - fixtures/vcr_cassettes/ChartMogul_Metrics_Activity.yml
249
- - fixtures/vcr_cassettes/ChartMogul_Metrics_Activity/behaves_like_PageableWithAnchor/should_be_pageable.yml
250
- - fixtures/vcr_cassettes/ChartMogul_Metrics_Activity/should_have_Activity_entries.yml
251
- - fixtures/vcr_cassettes/ChartMogul_Metrics_AllKeyMetric/should_have_entries.yml
252
- - fixtures/vcr_cassettes/ChartMogul_Metrics_AllKeyMetric/should_have_summary.yml
253
- - fixtures/vcr_cassettes/ChartMogul_Metrics_CustomerChurnRate/behaves_like_Metrics_API_resource/behaves_like_Summary/should_have_summary.yml
254
- - fixtures/vcr_cassettes/ChartMogul_Metrics_CustomerChurnRate/behaves_like_Metrics_API_resource/should_have_entries.yml
255
- - fixtures/vcr_cassettes/ChartMogul_Metrics_CustomerCount/behaves_like_Metrics_API_resource/behaves_like_Summary/should_have_summary.yml
256
- - fixtures/vcr_cassettes/ChartMogul_Metrics_CustomerCount/behaves_like_Metrics_API_resource/should_have_entries.yml
257
- - fixtures/vcr_cassettes/ChartMogul_Metrics_Customers_Activity/behaves_like_Pageable/should_be_pageable.yml
258
- - fixtures/vcr_cassettes/ChartMogul_Metrics_Customers_Activity/should_have_Activity_entries.yml
259
- - fixtures/vcr_cassettes/ChartMogul_Metrics_Customers_Subscription/behaves_like_Pageable/should_be_pageable.yml
260
- - fixtures/vcr_cassettes/ChartMogul_Metrics_Customers_Subscription/should_have_Subscription_entries.yml
261
- - fixtures/vcr_cassettes/ChartMogul_Metrics_LTV/behaves_like_Metrics_API_resource/behaves_like_Summary/should_have_summary.yml
262
- - fixtures/vcr_cassettes/ChartMogul_Metrics_LTV/behaves_like_Metrics_API_resource/should_have_entries.yml
263
- - fixtures/vcr_cassettes/ChartMogul_Metrics_MRR/behaves_like_Summary/should_have_summary.yml
264
- - fixtures/vcr_cassettes/ChartMogul_Metrics_MRR/should_have_entries.yml
265
- - fixtures/vcr_cassettes/ChartMogul_Metrics_MRRChurnRate/behaves_like_Metrics_API_resource/behaves_like_Summary/should_have_summary.yml
266
- - fixtures/vcr_cassettes/ChartMogul_Metrics_MRRChurnRate/behaves_like_Metrics_API_resource/should_have_entries.yml
267
- - fixtures/vcr_cassettes/ChartMogul_Ping/pings/and_fails_on_incorrect_credentials.yml
268
- - fixtures/vcr_cassettes/ChartMogul_Ping/pings/and_fails_with_500_internal_server_error.yml
269
- - fixtures/vcr_cassettes/ChartMogul_Ping/pings/and_fails_with_504_gateway_timeout_error.yml
270
- - fixtures/vcr_cassettes/ChartMogul_Ping/pings/when_credentials_correct.yml
271
- - fixtures/vcr_cassettes/ChartMogul_Plan/API_Interactions/correctly_handles_a_422_error.yml
272
- - fixtures/vcr_cassettes/ChartMogul_Plan/API_Interactions/correctly_interacts_with_the_API.yml
273
- - fixtures/vcr_cassettes/ChartMogul_Plan/API_Interactions/deletes_existing_plan.yml
274
- - fixtures/vcr_cassettes/ChartMogul_Plan/API_Interactions/retrieves_existing_plan_by_uuid.yml
275
- - fixtures/vcr_cassettes/ChartMogul_Plan/API_Interactions/updates_existing_plan.yml
276
- - fixtures/vcr_cassettes/ChartMogul_Plan/API_Interactions/updates_existing_plan_using_class_method.yml
277
- - fixtures/vcr_cassettes/ChartMogul_PlanGroup/API_interactions/correctly_handles_a_422_error.yml
278
- - fixtures/vcr_cassettes/ChartMogul_PlanGroup/API_interactions/deletes_a_plan_group.yml
279
- - fixtures/vcr_cassettes/ChartMogul_PlanGroup/API_interactions/retrieves_existing_plan_group_by_uuid.yml
280
- - fixtures/vcr_cassettes/ChartMogul_PlanGroup/API_interactions/returns_an_array_of_plan_groups.yml
281
- - fixtures/vcr_cassettes/ChartMogul_PlanGroup/API_interactions/updates_existing_plan_group_name.yml
282
- - fixtures/vcr_cassettes/ChartMogul_PlanGroup/API_interactions/updates_existing_plan_group_name_via_class_method.yml
283
- - fixtures/vcr_cassettes/ChartMogul_PlanGroup/API_interactions/updates_existing_plan_group_plans.yml
284
- - fixtures/vcr_cassettes/ChartMogul_PlanGroups_Plans/API_interactions/given_a_plan_group_uuid_returns_an_array_of_plans_in_the_plan_group.yml
285
- - fixtures/vcr_cassettes/ChartMogul_Subscription/API_Interactions/connects_subscriptions.yml
286
- - fixtures/vcr_cassettes/ChartMogul_Subscription/API_Interactions/correctly_interracts_with_the_API.yml
287
- - fixtures/vcr_cassettes/ChartMogul_Subscription/API_Interactions/has_multiple_aliases.yml
288
- - fixtures/vcr_cassettes/ChartMogul_Subscription/_update_cancellation_dates/when_array_has_time_objects/is_setting_the_cancellation_dates_of_the_subscription.yml
289
- - fixtures/vcr_cassettes/ChartMogul_Subscription/_update_cancellation_dates/when_array_includes_invalid_entries/raises_an_exception.yml
290
- - fixtures/vcr_cassettes/ChartMogul_Subscription/_update_cancellation_dates/when_array_includes_valid_entries/is_setting_the_cancellation_dates_of_the_subscription.yml
291
- - fixtures/vcr_cassettes/ChartMogul_Subscription/_update_cancellation_dates/when_array_is_empty/makes_an_API_call_and_removes_the_cancellation_dates.yml
292
- - fixtures/vcr_cassettes/ChartMogul_SubscriptionEvent/API_interactions/creates_a_new_subscription_event.yml
293
- - fixtures/vcr_cassettes/ChartMogul_SubscriptionEvent/API_interactions/deletes_the_subscription_event.yml
294
- - fixtures/vcr_cassettes/ChartMogul_SubscriptionEvent/API_interactions/lists_all_subscription_events.yml
295
- - fixtures/vcr_cassettes/ChartMogul_SubscriptionEvent/API_interactions/updates_the_subscription_event.yml
296
- - fixtures/vcr_cassettes/ChartMogul_Transactions_Payment/API_Interactions/correctly_interracts_with_the_API.yml
297
200
  - lib/chartmogul.rb
298
201
  - lib/chartmogul/account.rb
299
202
  - lib/chartmogul/api/actions/all.rb
@@ -383,7 +286,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
383
286
  - !ruby/object:Gem::Version
384
287
  version: '0'
385
288
  requirements: []
386
- rubygems_version: 3.2.3
289
+ rubygems_version: 3.4.7
387
290
  signing_key:
388
291
  specification_version: 4
389
292
  summary: Chartmogul API Ruby Client
@@ -1,112 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: get
5
- uri: https://api.chartmogul.com/v1/ping
6
- body:
7
- encoding: UTF-8
8
- string: "{}"
9
- headers:
10
- User-Agent:
11
- - Faraday v0.17.3
12
- Content-Type:
13
- - application/json
14
- Authorization:
15
- - Basic hidden
16
- response:
17
- status:
18
- code: 401
19
- message: Unauthorized
20
- headers:
21
- server:
22
- - nginx/1.10.1
23
- date:
24
- - Fri, 17 Jul 2020 08:25:06 GMT
25
- content-type:
26
- - application/json
27
- transfer-encoding:
28
- - chunked
29
- connection:
30
- - keep-alive
31
- status:
32
- - 401 Unauthorized
33
- body:
34
- encoding: UTF-8
35
- string: '{"code":401,"message":"No valid API key provided","param":null}'
36
- http_version:
37
- recorded_at: Fri, 17 Jul 2020 08:25:06 GMT
38
- - request:
39
- method: get
40
- uri: https://api.chartmogul.com/v1/ping
41
- body:
42
- encoding: UTF-8
43
- string: "{}"
44
- headers:
45
- User-Agent:
46
- - Faraday v0.17.3
47
- Content-Type:
48
- - application/json
49
- Authorization:
50
- - Basic hidden
51
- response:
52
- status:
53
- code: 200
54
- message: OK
55
- headers:
56
- server:
57
- - nginx/1.10.1
58
- date:
59
- - Fri, 17 Jul 2020 08:25:11 GMT
60
- content-type:
61
- - application/json
62
- transfer-encoding:
63
- - chunked
64
- connection:
65
- - keep-alive
66
- vary:
67
- - Accept-Encoding, Accept-Encoding
68
- status:
69
- - 200 OK
70
- access-control-allow-credentials:
71
- - 'true'
72
- body:
73
- encoding: ASCII-8BIT
74
- string: '{"data":"pong!"}'
75
- http_version:
76
- recorded_at: Fri, 17 Jul 2020 08:25:11 GMT
77
- - request:
78
- method: get
79
- uri: https://api.chartmogul.com/v1/ping
80
- body:
81
- encoding: UTF-8
82
- string: "{}"
83
- headers:
84
- User-Agent:
85
- - Faraday v0.17.3
86
- Content-Type:
87
- - application/json
88
- Authorization:
89
- - Basic hidden
90
- response:
91
- status:
92
- code: 401
93
- message: Unauthorized
94
- headers:
95
- server:
96
- - nginx/1.10.1
97
- date:
98
- - Fri, 17 Jul 2020 08:25:11 GMT
99
- content-type:
100
- - application/json
101
- transfer-encoding:
102
- - chunked
103
- connection:
104
- - keep-alive
105
- status:
106
- - 401 Unauthorized
107
- body:
108
- encoding: UTF-8
109
- string: '{"code":401,"message":"No valid API key provided","param":null}'
110
- http_version:
111
- recorded_at: Fri, 17 Jul 2020 08:25:11 GMT
112
- recorded_with: VCR 5.1.0
@@ -1,77 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: get
5
- uri: https://api.chartmogul.com/v1/ping
6
- body:
7
- encoding: UTF-8
8
- string: "{}"
9
- headers:
10
- User-Agent:
11
- - Faraday v0.17.3
12
- Content-Type:
13
- - application/json
14
- Authorization:
15
- - Basic hidden
16
- response:
17
- status:
18
- code: 401
19
- message: Unauthorized
20
- headers:
21
- server:
22
- - nginx/1.10.1
23
- date:
24
- - Fri, 17 Jul 2020 08:25:25 GMT
25
- content-type:
26
- - application/json
27
- transfer-encoding:
28
- - chunked
29
- connection:
30
- - keep-alive
31
- status:
32
- - 401 Unauthorized
33
- body:
34
- encoding: UTF-8
35
- string: '{"code":401,"message":"No valid API key provided","param":null}'
36
- http_version:
37
- recorded_at: Fri, 17 Jul 2020 08:25:25 GMT
38
- - request:
39
- method: get
40
- uri: https://api.chartmogul.com/v1/ping
41
- body:
42
- encoding: UTF-8
43
- string: "{}"
44
- headers:
45
- User-Agent:
46
- - Faraday v0.17.3
47
- Content-Type:
48
- - application/json
49
- Authorization:
50
- - Basic hidden
51
- response:
52
- status:
53
- code: 200
54
- message: OK
55
- headers:
56
- server:
57
- - nginx/1.10.1
58
- date:
59
- - Fri, 17 Jul 2020 08:25:26 GMT
60
- content-type:
61
- - application/json
62
- transfer-encoding:
63
- - chunked
64
- connection:
65
- - keep-alive
66
- vary:
67
- - Accept-Encoding, Accept-Encoding
68
- status:
69
- - 200 OK
70
- access-control-allow-credentials:
71
- - 'true'
72
- body:
73
- encoding: ASCII-8BIT
74
- string: '{"data":"pong!"}'
75
- http_version:
76
- recorded_at: Fri, 17 Jul 2020 08:25:26 GMT
77
- recorded_with: VCR 5.1.0