rcs 2.0.8 → 2.0.11

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: 590b411e508f73fca0c216d2f1631cc5107cc582718ffea4fd72dee8c2dc0244
4
- data.tar.gz: 2f98d564922456b6004cd6156765a352b8b5a4ade8667c6d7f4b2783b7693ef6
3
+ metadata.gz: a5841ff03fdde7a2ead0de8ccdd774f8c507d378cc47777af4133e30579d0aea
4
+ data.tar.gz: 95b18d886ba057009f2123858129beed4bedbc2f09cb1e72752c9bd056cd3749
5
5
  SHA512:
6
- metadata.gz: b4f47ed174e4fcc83a839111a8351c5e9f3a8c76851b7c7962d10f8ccfaca5eb8e3d9403a4f473664bc7b1c1fe9bcd9e4e8a909d412ec860219f49aecd156c1d
7
- data.tar.gz: be334c846aa0c477e7dd5bf25218e90097e16bbaa1ce9c8d526b0c2da0bcc451e023d4414032e1fb6db270cd18923dd1aba57206527ddd8c130c7528d272f563
6
+ metadata.gz: 8925e03ef43e31adb11bd6161dc75e0e7d7a124b3eded1d2db8db7ebe2f553372f4b29357d591804e17683bcfd0e6ec45e732cb4d6428ccef94f561d1b25bcfb
7
+ data.tar.gz: 3038a74a20d551c85121e2b1a0eb5d6b6169b2d76efaca1aac0553bdfa12eb0d51850cbbaecd7bcd92ca7930dd969ab88e208a93c2b36a73fef45d2bb37f11b3
data/.fern/metadata.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
- "cliVersion": "3.40.1",
2
+ "cliVersion": "3.51.3",
3
3
  "generatorName": "fernapi/fern-ruby-sdk",
4
- "generatorVersion": "1.0.0-rc78",
4
+ "generatorVersion": "1.0.0-rc84",
5
5
  "generatorConfig": {
6
6
  "clientModuleName": "PinnacleBaseClient",
7
7
  "flattenModuleStructure": true,
8
8
  "useProvidedDefaults": true
9
9
  },
10
- "sdkVersion": "2.0.8"
10
+ "sdkVersion": "2.0.11"
11
11
  }
data/.fernignore CHANGED
@@ -2,9 +2,4 @@
2
2
  README.md
3
3
  lib/pinnacle/wrapper
4
4
  lib/pinnacle/pinnacle_client.rb
5
- lib/pinnacle.rb
6
- custom.gemspec.rb
7
- pinnacle.gemspec
8
- Gemfile.lock
9
- .rubocop.yml
10
- Rakefile
5
+ lib/rcs.rb
data/.rubocop.yml CHANGED
@@ -58,6 +58,3 @@ Minitest/MultipleAssertions:
58
58
 
59
59
  Minitest/UselessAssertion:
60
60
  Enabled: false
61
-
62
- Style/ModuleMemberExistenceCheck:
63
- Enabled: false
data/Rakefile CHANGED
@@ -3,14 +3,6 @@
3
3
  require "bundler/gem_tasks"
4
4
  require "minitest/test_task"
5
5
 
6
- # Skip git push in CI - just build and push to RubyGems
7
- if ENV["CI"]
8
- Rake::Task["release:source_control_push"].clear
9
- task "release:source_control_push" do
10
- # No-op in CI
11
- end
12
- end
13
-
14
6
  Minitest::TestTask.create
15
7
 
16
8
  require "rubocop/rake_task"
data/custom.gemspec.rb CHANGED
@@ -7,7 +7,10 @@
7
7
  # need to add it to the .fernignore file to prevent your changes from being overwritten.
8
8
 
9
9
  def add_custom_gemspec_data(spec)
10
- spec.name = "rcs"
11
- spec.homepage = "https://github.com/pinnacle-dev/rcs-ruby"
12
- spec.license = "MIT"
10
+ # Example custom configurations (uncomment and modify as needed)
11
+
12
+ # spec.authors = ["Your name"]
13
+ # spec.email = ["your.email@example.com"]
14
+ # spec.homepage = "https://github.com/your-org/pinnacle-ruby"
15
+ # spec.license = "Your license"
13
16
  end
@@ -68,14 +68,11 @@ module Pinnacle
68
68
  # @return [Pinnacle::Types::AudienceCountOnly]
69
69
  def create(request_options: {}, **params)
70
70
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
71
- body_prop_names = %i[name description contacts]
72
- body_bag = params.slice(*body_prop_names)
73
-
74
71
  request = Pinnacle::Internal::JSON::Request.new(
75
72
  base_url: request_options[:base_url],
76
73
  method: "POST",
77
74
  path: "audiences",
78
- body: Pinnacle::Audiences::Types::CreateAudienceParams.new(body_bag).to_h,
75
+ body: Pinnacle::Audiences::Types::CreateAudienceParams.new(params).to_h,
79
76
  request_options: request_options
80
77
  )
81
78
  begin
@@ -150,14 +147,11 @@ module Pinnacle
150
147
  # @return [Pinnacle::Types::AudienceCountOnly]
151
148
  def update(request_options: {}, **params)
152
149
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
153
- body_prop_names = %i[id name description]
154
- body_bag = params.slice(*body_prop_names)
155
-
156
150
  request = Pinnacle::Internal::JSON::Request.new(
157
151
  base_url: request_options[:base_url],
158
152
  method: "PATCH",
159
153
  path: "audiences",
160
- body: Pinnacle::Audiences::Types::UpdateAudienceParams.new(body_bag).to_h,
154
+ body: Pinnacle::Audiences::Types::UpdateAudienceParams.new(params).to_h,
161
155
  request_options: request_options
162
156
  )
163
157
  begin
@@ -27,14 +27,11 @@ module Pinnacle
27
27
  # @return [Pinnacle::Types::AudienceCountOnly]
28
28
  def remove(request_options: {}, **params)
29
29
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
30
- body_prop_names = %i[id contacts]
31
- body_bag = params.slice(*body_prop_names)
32
-
33
30
  request = Pinnacle::Internal::JSON::Request.new(
34
31
  base_url: request_options[:base_url],
35
32
  method: "DELETE",
36
33
  path: "audiences/contacts",
37
- body: Pinnacle::Audiences::Contacts::Types::RemoveContactsParams.new(body_bag).to_h,
34
+ body: Pinnacle::Audiences::Contacts::Types::RemoveContactsParams.new(params).to_h,
38
35
  request_options: request_options
39
36
  )
40
37
  begin
@@ -68,14 +65,11 @@ module Pinnacle
68
65
  # @return [Pinnacle::Types::AudienceCountOnly]
69
66
  def add(request_options: {}, **params)
70
67
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
71
- body_prop_names = %i[id contacts]
72
- body_bag = params.slice(*body_prop_names)
73
-
74
68
  request = Pinnacle::Internal::JSON::Request.new(
75
69
  base_url: request_options[:base_url],
76
70
  method: "PATCH",
77
71
  path: "audiences/contacts",
78
- body: Pinnacle::Audiences::Contacts::Types::AddContactsParams.new(body_bag).to_h,
72
+ body: Pinnacle::Audiences::Contacts::Types::AddContactsParams.new(params).to_h,
79
73
  request_options: request_options
80
74
  )
81
75
  begin
@@ -23,14 +23,11 @@ module Pinnacle
23
23
  # @return [Pinnacle::Types::OptionalBrandInfo]
24
24
  def autofill(request_options: {}, **params)
25
25
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
26
- body_prop_names = %i[additional_info name options website]
27
- body_bag = params.slice(*body_prop_names)
28
-
29
26
  request = Pinnacle::Internal::JSON::Request.new(
30
27
  base_url: request_options[:base_url],
31
28
  method: "POST",
32
29
  path: "brands/autofill",
33
- body: Pinnacle::Brands::Types::AutofillBrandParams.new(body_bag).to_h,
30
+ body: Pinnacle::Brands::Types::AutofillBrandParams.new(params).to_h,
34
31
  request_options: request_options
35
32
  )
36
33
  begin
@@ -67,14 +64,11 @@ module Pinnacle
67
64
  # @return [Pinnacle::Types::ExtendedBrand]
68
65
  def upsert(request_options: {}, **params)
69
66
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
70
- body_prop_names = %i[address contact dba description ein email id name sector type entity_type website]
71
- body_bag = params.slice(*body_prop_names)
72
-
73
67
  request = Pinnacle::Internal::JSON::Request.new(
74
68
  base_url: request_options[:base_url],
75
69
  method: "POST",
76
70
  path: "brands",
77
- body: Pinnacle::Brands::Types::UpsertBrandParams.new(body_bag).to_h,
71
+ body: Pinnacle::Brands::Types::UpsertBrandParams.new(params).to_h,
78
72
  request_options: request_options
79
73
  )
80
74
  begin
@@ -215,16 +209,15 @@ module Pinnacle
215
209
  # @return [Pinnacle::Types::VettingResults]
216
210
  def vet(request_options: {}, **params)
217
211
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
218
- path_param_names = %i[brand_id]
219
- body_params = params.except(*path_param_names)
220
- body_prop_names = %i[type provider vetting_class]
221
- body_bag = body_params.slice(*body_prop_names)
212
+ request_data = Pinnacle::Brands::Types::VetBrandParams.new(params).to_h
213
+ non_body_param_names = ["brandId"]
214
+ body = request_data.except(*non_body_param_names)
222
215
 
223
216
  request = Pinnacle::Internal::JSON::Request.new(
224
217
  base_url: request_options[:base_url],
225
218
  method: "POST",
226
219
  path: "brands/#{params[:brand_id]}/vet",
227
- body: Pinnacle::Brands::Types::VetBrandParams.new(body_bag).to_h,
220
+ body: body,
228
221
  request_options: request_options
229
222
  )
230
223
  begin
@@ -138,14 +138,11 @@ module Pinnacle
138
138
  # @return [Pinnacle::Types::DlcCampaignWithExtendedBrandAndStatus]
139
139
  def upsert(request_options: {}, **params)
140
140
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
141
- body_prop_names = %i[auto_renew brand campaign_id description keywords links message_flow name options sample_messages use_case]
142
- body_bag = params.slice(*body_prop_names)
143
-
144
141
  request = Pinnacle::Internal::JSON::Request.new(
145
142
  base_url: request_options[:base_url],
146
143
  method: "POST",
147
144
  path: "campaigns/dlc",
148
- body: Pinnacle::Campaigns::Dlc::Types::UpsertDlcCampaignParams.new(body_bag).to_h,
145
+ body: Pinnacle::Campaigns::Dlc::Types::UpsertDlcCampaignParams.new(params).to_h,
149
146
  request_options: request_options
150
147
  )
151
148
  begin
@@ -136,14 +136,11 @@ module Pinnacle
136
136
  # @return [Pinnacle::Types::ExtendedRcsCampaign]
137
137
  def upsert(request_options: {}, **params)
138
138
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
139
- body_prop_names = %i[agent brand campaign_id expected_agent_responses links use_case opt_in_terms_and_conditions messaging_type carrier_description keywords traffic agent_triggers interaction_description is_conversational cta_language demo_trigger]
140
- body_bag = params.slice(*body_prop_names)
141
-
142
139
  request = Pinnacle::Internal::JSON::Request.new(
143
140
  base_url: request_options[:base_url],
144
141
  method: "POST",
145
142
  path: "campaigns/rcs",
146
- body: Pinnacle::Campaigns::Rcs::Types::UpsertRcsCampaignParams.new(body_bag).to_h,
143
+ body: Pinnacle::Campaigns::Rcs::Types::UpsertRcsCampaignParams.new(params).to_h,
147
144
  request_options: request_options
148
145
  )
149
146
  begin
@@ -138,14 +138,11 @@ module Pinnacle
138
138
  # @return [Pinnacle::Types::TollFreeCampaignWithExtendedBrandAndStatus]
139
139
  def upsert(request_options: {}, **params)
140
140
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
141
- body_prop_names = %i[brand campaign_id keywords links monthly_volume name opt_in options production_message_content use_case]
142
- body_bag = params.slice(*body_prop_names)
143
-
144
141
  request = Pinnacle::Internal::JSON::Request.new(
145
142
  base_url: request_options[:base_url],
146
143
  method: "POST",
147
144
  path: "campaigns/toll-free",
148
- body: Pinnacle::Campaigns::TollFree::Types::UpsertTollFreeCampaignParams.new(body_bag).to_h,
145
+ body: Pinnacle::Campaigns::TollFree::Types::UpsertTollFreeCampaignParams.new(params).to_h,
149
146
  request_options: request_options
150
147
  )
151
148
  begin
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Pinnacle
4
- class Client
4
+ class PinnacleBaseClient
5
5
  # @param base_url [String, nil]
6
6
  # @param api_key [String]
7
7
  #
@@ -10,7 +10,7 @@ module Pinnacle
10
10
  @raw_client = Pinnacle::Internal::Http::RawClient.new(
11
11
  base_url: base_url || Pinnacle::Environment::DEFAULT,
12
12
  headers: {
13
- "User-Agent" => "rcs/2.0.8",
13
+ "User-Agent" => "rcs/2.0.11",
14
14
  "X-Fern-Language" => "Ruby",
15
15
  "PINNACLE-API-KEY" => api_key.to_s
16
16
  }
@@ -65,14 +65,11 @@ module Pinnacle
65
65
  # @return [Pinnacle::Types::ContactId]
66
66
  def create(request_options: {}, **params)
67
67
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
68
- body_prop_names = %i[phone_number description email name tags]
69
- body_bag = params.slice(*body_prop_names)
70
-
71
68
  request = Pinnacle::Internal::JSON::Request.new(
72
69
  base_url: request_options[:base_url],
73
70
  method: "POST",
74
71
  path: "contacts",
75
- body: Pinnacle::Contacts::Types::CreateContactParams.new(body_bag).to_h,
72
+ body: Pinnacle::Contacts::Types::CreateContactParams.new(params).to_h,
76
73
  request_options: request_options
77
74
  )
78
75
  begin
@@ -102,14 +99,11 @@ module Pinnacle
102
99
  # @return [Pinnacle::Types::UpdatedContactId]
103
100
  def update(request_options: {}, **params)
104
101
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
105
- body_prop_names = %i[id description email name tags]
106
- body_bag = params.slice(*body_prop_names)
107
-
108
102
  request = Pinnacle::Internal::JSON::Request.new(
109
103
  base_url: request_options[:base_url],
110
104
  method: "PUT",
111
105
  path: "contacts",
112
- body: Pinnacle::Contacts::Types::UpdateContactParams.new(body_bag).to_h,
106
+ body: Pinnacle::Contacts::Types::UpdateContactParams.new(params).to_h,
113
107
  request_options: request_options
114
108
  )
115
109
  begin
@@ -55,14 +55,11 @@ module Pinnacle
55
55
  # @return [Pinnacle::Types::ConversationList]
56
56
  def list(request_options: {}, **params)
57
57
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
58
- body_prop_names = %i[brand_id campaign_id campaign_type page_index page_size receiver sender]
59
- body_bag = params.slice(*body_prop_names)
60
-
61
58
  request = Pinnacle::Internal::JSON::Request.new(
62
59
  base_url: request_options[:base_url],
63
60
  method: "POST",
64
61
  path: "conversations/list",
65
- body: Pinnacle::Conversations::Types::ListConversationsParams.new(body_bag).to_h,
62
+ body: Pinnacle::Conversations::Types::ListConversationsParams.new(params).to_h,
66
63
  request_options: request_options
67
64
  )
68
65
  begin
@@ -92,14 +89,11 @@ module Pinnacle
92
89
  # @return [Pinnacle::Types::SuccessfulConversationUpdate]
93
90
  def update(request_options: {}, **params)
94
91
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
95
- body_prop_names = %i[id notes]
96
- body_bag = params.slice(*body_prop_names)
97
-
98
92
  request = Pinnacle::Internal::JSON::Request.new(
99
93
  base_url: request_options[:base_url],
100
94
  method: "POST",
101
95
  path: "conversations/update",
102
- body: Pinnacle::Conversations::Types::UpdateConversationParams.new(body_bag).to_h,
96
+ body: Pinnacle::Conversations::Types::UpdateConversationParams.new(params).to_h,
103
97
  request_options: request_options
104
98
  )
105
99
  begin
@@ -22,6 +22,12 @@ module Pinnacle
22
22
  @request_options = request_options
23
23
  end
24
24
 
25
+ # @return [Hash] The query parameters merged with additional query parameters from request options.
26
+ def encode_query
27
+ additional_query = @request_options&.dig(:additional_query_parameters) || @request_options&.dig("additional_query_parameters") || {}
28
+ @query.merge(additional_query)
29
+ end
30
+
25
31
  # Child classes should implement:
26
32
  # - encode_headers: Returns the encoded HTTP request headers.
27
33
  # - encode_body: Returns the encoded HTTP request body.
@@ -5,6 +5,15 @@ module Pinnacle
5
5
  module Http
6
6
  # @api private
7
7
  class RawClient
8
+ # Default HTTP status codes that trigger a retry
9
+ RETRYABLE_STATUSES = [408, 429, 500, 502, 503, 504, 521, 522, 524].freeze
10
+ # Initial delay between retries in seconds
11
+ INITIAL_RETRY_DELAY = 0.5
12
+ # Maximum delay between retries in seconds
13
+ MAX_RETRY_DELAY = 60.0
14
+ # Jitter factor for randomizing retry delays (20%)
15
+ JITTER_FACTOR = 0.2
16
+
8
17
  # @return [String] The base URL for requests
9
18
  attr_reader :base_url
10
19
 
@@ -27,37 +36,106 @@ module Pinnacle
27
36
  # @return [HTTP::Response] The HTTP response.
28
37
  def send(request)
29
38
  url = build_url(request)
39
+ attempt = 0
40
+ response = nil
41
+
42
+ loop do
43
+ http_request = build_http_request(
44
+ url:,
45
+ method: request.method,
46
+ headers: request.encode_headers,
47
+ body: request.encode_body
48
+ )
49
+
50
+ conn = connect(url)
51
+ conn.open_timeout = @timeout
52
+ conn.read_timeout = @timeout
53
+ conn.write_timeout = @timeout
54
+ conn.continue_timeout = @timeout
55
+
56
+ response = conn.request(http_request)
57
+
58
+ break unless should_retry?(response, attempt)
59
+
60
+ delay = retry_delay(response, attempt)
61
+ sleep(delay)
62
+ attempt += 1
63
+ end
30
64
 
31
- http_request = build_http_request(
32
- url:,
33
- method: request.method,
34
- headers: request.encode_headers,
35
- body: request.encode_body
36
- )
65
+ response
66
+ end
67
+
68
+ # Determines if a request should be retried based on the response status code.
69
+ # @param response [Net::HTTPResponse] The HTTP response.
70
+ # @param attempt [Integer] The current retry attempt (0-indexed).
71
+ # @return [Boolean] Whether the request should be retried.
72
+ def should_retry?(response, attempt)
73
+ return false if attempt >= @max_retries
74
+
75
+ status = response.code.to_i
76
+ RETRYABLE_STATUSES.include?(status)
77
+ end
37
78
 
38
- conn = connect(url)
39
- conn.open_timeout = @timeout
40
- conn.read_timeout = @timeout
41
- conn.write_timeout = @timeout
42
- conn.continue_timeout = @timeout
79
+ # Calculates the delay before the next retry attempt using exponential backoff with jitter.
80
+ # Respects Retry-After header if present.
81
+ # @param response [Net::HTTPResponse] The HTTP response.
82
+ # @param attempt [Integer] The current retry attempt (0-indexed).
83
+ # @return [Float] The delay in seconds before the next retry.
84
+ def retry_delay(response, attempt)
85
+ # Check for Retry-After header (can be seconds or HTTP date)
86
+ retry_after = response["Retry-After"]
87
+ if retry_after
88
+ delay = parse_retry_after(retry_after)
89
+ return [delay, MAX_RETRY_DELAY].min if delay&.positive?
90
+ end
91
+
92
+ # Exponential backoff with jitter: base_delay * 2^attempt
93
+ base_delay = INITIAL_RETRY_DELAY * (2**attempt)
94
+ add_jitter([base_delay, MAX_RETRY_DELAY].min)
95
+ end
43
96
 
44
- conn.request(http_request)
97
+ # Parses the Retry-After header value.
98
+ # @param value [String] The Retry-After header value (seconds or HTTP date).
99
+ # @return [Float, nil] The delay in seconds, or nil if parsing fails.
100
+ def parse_retry_after(value)
101
+ # Try parsing as integer (seconds)
102
+ seconds = Integer(value, exception: false)
103
+ return seconds.to_f if seconds
104
+
105
+ # Try parsing as HTTP date
106
+ begin
107
+ retry_time = Time.httpdate(value)
108
+ delay = retry_time - Time.now
109
+ delay.positive? ? delay : nil
110
+ rescue ArgumentError
111
+ nil
112
+ end
113
+ end
114
+
115
+ # Adds random jitter to a delay value.
116
+ # @param delay [Float] The base delay in seconds.
117
+ # @return [Float] The delay with jitter applied.
118
+ def add_jitter(delay)
119
+ jitter = delay * JITTER_FACTOR * (rand - 0.5) * 2
120
+ [delay + jitter, 0].max
45
121
  end
46
122
 
47
123
  # @param request [Pinnacle::Internal::Http::BaseRequest] The HTTP request.
48
124
  # @return [URI::Generic] The URL.
49
125
  def build_url(request)
126
+ encoded_query = request.encode_query
127
+
50
128
  # If the path is already an absolute URL, use it directly
51
129
  if request.path.start_with?("http://", "https://")
52
130
  url = request.path
53
- url = "#{url}?#{encode_query(request.query)}" if request.query&.any?
131
+ url = "#{url}?#{encode_query(encoded_query)}" if encoded_query&.any?
54
132
  return URI.parse(url)
55
133
  end
56
134
 
57
135
  path = request.path.start_with?("/") ? request.path[1..] : request.path
58
136
  base = request.base_url || @base_url
59
137
  url = "#{base.chomp("/")}/#{path}"
60
- url = "#{url}?#{encode_query(request.query)}" if request.query&.any?
138
+ url = "#{url}?#{encode_query(encoded_query)}" if encoded_query&.any?
61
139
  URI.parse(url)
62
140
  end
63
141
 
@@ -102,7 +180,9 @@ module Pinnacle
102
180
 
103
181
  http = Net::HTTP.new(url.host, port)
104
182
  http.use_ssl = is_https
105
- http.max_retries = @max_retries
183
+ # NOTE: We handle retries at the application level with HTTP status code awareness,
184
+ # so we set max_retries to 0 to disable Net::HTTP's built-in network-level retries.
185
+ http.max_retries = 0
106
186
  http
107
187
  end
108
188
 
@@ -76,8 +76,8 @@ module Pinnacle
76
76
  in Module
77
77
  case type
78
78
  in ->(t) {
79
- t.singleton_class.included_modules.include?(Enum) ||
80
- t.singleton_class.included_modules.include?(Union)
79
+ t.singleton_class.include?(Enum) ||
80
+ t.singleton_class.include?(Union)
81
81
  }
82
82
  return type.coerce(value, strict: strict)
83
83
  else
@@ -29,14 +29,11 @@ module Pinnacle
29
29
  # @return [Pinnacle::Messages::Blast::Types::BlastSmsResponse]
30
30
  def sms(request_options: {}, **params)
31
31
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
32
- body_prop_names = %i[audience_id senders message options]
33
- body_bag = params.slice(*body_prop_names)
34
-
35
32
  request = Pinnacle::Internal::JSON::Request.new(
36
33
  base_url: request_options[:base_url],
37
34
  method: "POST",
38
35
  path: "messages/blast/sms",
39
- body: Pinnacle::Messages::Blast::Types::BlastSms.new(body_bag).to_h,
36
+ body: Pinnacle::Messages::Blast::Types::BlastSms.new(params).to_h,
40
37
  request_options: request_options
41
38
  )
42
39
  begin
@@ -71,14 +68,11 @@ module Pinnacle
71
68
  # @return [Pinnacle::Messages::Blast::Types::BlastMmsResponse]
72
69
  def mms(request_options: {}, **params)
73
70
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
74
- body_prop_names = %i[audience_id senders message options]
75
- body_bag = params.slice(*body_prop_names)
76
-
77
71
  request = Pinnacle::Internal::JSON::Request.new(
78
72
  base_url: request_options[:base_url],
79
73
  method: "POST",
80
74
  path: "messages/blast/mms",
81
- body: Pinnacle::Messages::Blast::Types::BlastMms.new(body_bag).to_h,
75
+ body: Pinnacle::Messages::Blast::Types::BlastMms.new(params).to_h,
82
76
  request_options: request_options
83
77
  )
84
78
  begin
@@ -114,14 +108,11 @@ module Pinnacle
114
108
  # @return [Pinnacle::Messages::Blast::Types::BlastRcsResponse]
115
109
  def rcs(request_options: {}, **params)
116
110
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
117
- body_prop_names = %i[audience_id senders message options]
118
- body_bag = params.slice(*body_prop_names)
119
-
120
111
  request = Pinnacle::Internal::JSON::Request.new(
121
112
  base_url: request_options[:base_url],
122
113
  method: "POST",
123
114
  path: "messages/blast/rcs",
124
- body: Pinnacle::Messages::Blast::Types::BlastRcs.new(body_bag).to_h,
115
+ body: Pinnacle::Messages::Blast::Types::BlastRcs.new(params).to_h,
125
116
  request_options: request_options
126
117
  )
127
118
  begin
@@ -57,14 +57,11 @@ module Pinnacle
57
57
  # @return [Pinnacle::Types::ReactionResult]
58
58
  def react(request_options: {}, **params)
59
59
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
60
- body_prop_names = %i[message_id options reaction]
61
- body_bag = params.slice(*body_prop_names)
62
-
63
60
  request = Pinnacle::Internal::JSON::Request.new(
64
61
  base_url: request_options[:base_url],
65
62
  method: "POST",
66
63
  path: "messages/react",
67
- body: Pinnacle::Messages::Types::ReactMessageParams.new(body_bag).to_h,
64
+ body: Pinnacle::Messages::Types::ReactMessageParams.new(params).to_h,
68
65
  request_options: request_options
69
66
  )
70
67
  begin
@@ -24,14 +24,11 @@ module Pinnacle
24
24
  # @return [Pinnacle::Messages::Mms::Types::MmsSendResponse]
25
25
  def send_(request_options: {}, **params)
26
26
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
27
- body_prop_names = %i[from media_urls options text to]
28
- body_bag = params.slice(*body_prop_names)
29
-
30
27
  request = Pinnacle::Internal::JSON::Request.new(
31
28
  base_url: request_options[:base_url],
32
29
  method: "POST",
33
30
  path: "messages/send/mms",
34
- body: Pinnacle::Messages::Mms::Types::Mms.new(body_bag).to_h,
31
+ body: Pinnacle::Messages::Mms::Types::Mms.new(params).to_h,
35
32
  request_options: request_options
36
33
  )
37
34
  begin
@@ -77,14 +77,11 @@ module Pinnacle
77
77
  # @return [Pinnacle::Types::SendTypingIndicatorResponse]
78
78
  def send_typing(request_options: {}, **params)
79
79
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
80
- body_prop_names = %i[agent_id to options]
81
- body_bag = params.slice(*body_prop_names)
82
-
83
80
  request = Pinnacle::Internal::JSON::Request.new(
84
81
  base_url: request_options[:base_url],
85
82
  method: "POST",
86
83
  path: "messages/send/typing",
87
- body: Pinnacle::Messages::Rcs::Types::SendTypingIndicatorSchema.new(body_bag).to_h,
84
+ body: Pinnacle::Messages::Rcs::Types::SendTypingIndicatorSchema.new(params).to_h,
88
85
  request_options: request_options
89
86
  )
90
87
  begin
@@ -24,14 +24,11 @@ module Pinnacle
24
24
  # @return [Pinnacle::Messages::Sms::Types::SmsSendResponse]
25
25
  def send_(request_options: {}, **params)
26
26
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
27
- body_prop_names = %i[from options text to]
28
- body_bag = params.slice(*body_prop_names)
29
-
30
27
  request = Pinnacle::Internal::JSON::Request.new(
31
28
  base_url: request_options[:base_url],
32
29
  method: "POST",
33
30
  path: "messages/send/sms",
34
- body: Pinnacle::Messages::Sms::Types::Sms.new(body_bag).to_h,
31
+ body: Pinnacle::Messages::Sms::Types::Sms.new(params).to_h,
35
32
  request_options: request_options
36
33
  )
37
34
  begin
@@ -24,14 +24,11 @@ module Pinnacle
24
24
  # @return [Pinnacle::Types::AttachedPhoneNumberResult]
25
25
  def attach(request_options: {}, **params)
26
26
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
27
- body_prop_names = %i[phones campaign_type campaign_id]
28
- body_bag = params.slice(*body_prop_names)
29
-
30
27
  request = Pinnacle::Internal::JSON::Request.new(
31
28
  base_url: request_options[:base_url],
32
29
  method: "POST",
33
30
  path: "phone-numbers/attach-campaign",
34
- body: Pinnacle::PhoneNumbers::Campaign::Types::AttachCampaignParams.new(body_bag).to_h,
31
+ body: Pinnacle::PhoneNumbers::Campaign::Types::AttachCampaignParams.new(params).to_h,
35
32
  request_options: request_options
36
33
  )
37
34
  begin
@@ -61,14 +58,11 @@ module Pinnacle
61
58
  # @return [Pinnacle::Types::DetachedPhoneNumberResult]
62
59
  def detach(request_options: {}, **params)
63
60
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
64
- body_prop_names = %i[phones]
65
- body_bag = params.slice(*body_prop_names)
66
-
67
61
  request = Pinnacle::Internal::JSON::Request.new(
68
62
  base_url: request_options[:base_url],
69
63
  method: "DELETE",
70
64
  path: "phone-numbers/detach-campaign",
71
- body: Pinnacle::PhoneNumbers::Campaign::Types::DetachCampaignParams.new(body_bag).to_h,
65
+ body: Pinnacle::PhoneNumbers::Campaign::Types::DetachCampaignParams.new(params).to_h,
72
66
  request_options: request_options
73
67
  )
74
68
  begin
@@ -23,14 +23,11 @@ module Pinnacle
23
23
  # @return [Array[Pinnacle::Types::PhoneNumberDetails]]
24
24
  def search(request_options: {}, **params)
25
25
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
26
- body_prop_names = %i[features location number options type]
27
- body_bag = params.slice(*body_prop_names)
28
-
29
26
  request = Pinnacle::Internal::JSON::Request.new(
30
27
  base_url: request_options[:base_url],
31
28
  method: "POST",
32
29
  path: "phone-numbers/search",
33
- body: Pinnacle::PhoneNumbers::Types::SearchPhoneNumberParams.new(body_bag).to_h,
30
+ body: Pinnacle::PhoneNumbers::Types::SearchPhoneNumberParams.new(params).to_h,
34
31
  request_options: request_options
35
32
  )
36
33
  begin
@@ -60,14 +57,11 @@ module Pinnacle
60
57
  # @return [Array[Pinnacle::Types::PurchasedNumber]]
61
58
  def buy(request_options: {}, **params)
62
59
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
63
- body_prop_names = %i[numbers]
64
- body_bag = params.slice(*body_prop_names)
65
-
66
60
  request = Pinnacle::Internal::JSON::Request.new(
67
61
  base_url: request_options[:base_url],
68
62
  method: "POST",
69
63
  path: "phone-numbers/buy",
70
- body: Pinnacle::PhoneNumbers::Types::BuyPhoneNumberParams.new(body_bag).to_h,
64
+ body: Pinnacle::PhoneNumbers::Types::BuyPhoneNumberParams.new(params).to_h,
71
65
  request_options: request_options
72
66
  )
73
67
  begin
@@ -95,14 +89,11 @@ module Pinnacle
95
89
  # @return [Pinnacle::PhoneNumbers::Types::PhoneNumbersGetResponse]
96
90
  def get(request_options: {}, **params)
97
91
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
98
- body_prop_names = %i[phone level options]
99
- body_bag = params.slice(*body_prop_names)
100
-
101
92
  request = Pinnacle::Internal::JSON::Request.new(
102
93
  base_url: request_options[:base_url],
103
94
  method: "POST",
104
95
  path: "phone-numbers/details",
105
- body: Pinnacle::PhoneNumbers::Types::RetrievePhoneNumberDetailsParams.new(body_bag).to_h,
96
+ body: Pinnacle::PhoneNumbers::Types::RetrievePhoneNumberDetailsParams.new(params).to_h,
106
97
  request_options: request_options
107
98
  )
108
99
  begin
@@ -5,8 +5,8 @@ require_relative "wrapper/tools/file_uploader"
5
5
  require_relative "wrapper/tools/client"
6
6
 
7
7
  module Pinnacle
8
- # Reopen the Client class to add custom methods for webhook processing and file uploads.
9
- class Client
8
+ # Client class that extends PinnacleBaseClient with custom methods for webhook processing and file uploads.
9
+ class Client < PinnacleBaseClient
10
10
  # Returns an enhanced messages client with webhook processing support.
11
11
  #
12
12
  # @return [Pinnacle::Wrapper::Messages::Client]
@@ -26,14 +26,11 @@ module Pinnacle
26
26
  # @return [Hash[String, Pinnacle::Types::RcsCapability, nil]]
27
27
  def get_capabilities(request_options: {}, **params)
28
28
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
29
- body_prop_names = %i[phone_numbers]
30
- body_bag = params.slice(*body_prop_names)
31
-
32
29
  request = Pinnacle::Internal::JSON::Request.new(
33
30
  base_url: request_options[:base_url],
34
31
  method: "POST",
35
32
  path: "rcs/capabilities",
36
- body: Pinnacle::Rcs::Types::RcsCapabilitiesQuery.new(body_bag).to_h,
33
+ body: Pinnacle::Rcs::Types::RcsCapabilitiesQuery.new(params).to_h,
37
34
  request_options: request_options
38
35
  )
39
36
  begin
@@ -91,14 +88,11 @@ module Pinnacle
91
88
  # @return [Pinnacle::Types::RcsWhitelistResponse]
92
89
  def whitelist(request_options: {}, **params)
93
90
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
94
- body_prop_names = %i[agent_id phone_number]
95
- body_bag = params.slice(*body_prop_names)
96
-
97
91
  request = Pinnacle::Internal::JSON::Request.new(
98
92
  base_url: request_options[:base_url],
99
93
  method: "POST",
100
94
  path: "rcs/whitelist",
101
- body: Pinnacle::Rcs::Types::RcsWhitelistRequest.new(body_bag).to_h,
95
+ body: Pinnacle::Rcs::Types::RcsWhitelistRequest.new(params).to_h,
102
96
  request_options: request_options
103
97
  )
104
98
  begin
@@ -131,14 +125,11 @@ module Pinnacle
131
125
  # @return [Pinnacle::Types::RcsLinkResult]
132
126
  def get_link(request_options: {}, **params)
133
127
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
134
- body_prop_names = %i[agent_id test_mode phone_number body]
135
- body_bag = params.slice(*body_prop_names)
136
-
137
128
  request = Pinnacle::Internal::JSON::Request.new(
138
129
  base_url: request_options[:base_url],
139
130
  method: "POST",
140
131
  path: "rcs/link",
141
- body: Pinnacle::Rcs::Types::RcsLinkRequest.new(body_bag).to_h,
132
+ body: Pinnacle::Rcs::Types::RcsLinkRequest.new(params).to_h,
142
133
  request_options: request_options
143
134
  )
144
135
  begin
@@ -25,14 +25,11 @@ module Pinnacle
25
25
  # @return [Pinnacle::Types::VCardData]
26
26
  def get(request_options: {}, **params)
27
27
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
28
- body_prop_names = %i[id options]
29
- body_bag = params.slice(*body_prop_names)
30
-
31
28
  request = Pinnacle::Internal::JSON::Request.new(
32
29
  base_url: request_options[:base_url],
33
30
  method: "POST",
34
31
  path: "tools/contact-card",
35
- body: Pinnacle::Tools::ContactCard::Types::GetVcardParams.new(body_bag).to_h,
32
+ body: Pinnacle::Tools::ContactCard::Types::GetVcardParams.new(params).to_h,
36
33
  request_options: request_options
37
34
  )
38
35
  begin
@@ -63,14 +60,11 @@ module Pinnacle
63
60
  # @return [Pinnacle::Types::VcardResource]
64
61
  def upsert(request_options: {}, **params)
65
62
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
66
- body_prop_names = %i[photo id formatted_name name nickname birthday addresses url phones emails timezone geo title role organization categories note]
67
- body_bag = params.slice(*body_prop_names)
68
-
69
63
  request = Pinnacle::Internal::JSON::Request.new(
70
64
  base_url: request_options[:base_url],
71
65
  method: "POST",
72
66
  path: "tools/contact-card/upsert",
73
- body: Pinnacle::Tools::ContactCard::Types::UpsertVcardParams.new(body_bag).to_h,
67
+ body: Pinnacle::Tools::ContactCard::Types::UpsertVcardParams.new(params).to_h,
74
68
  request_options: request_options
75
69
  )
76
70
  begin
@@ -25,14 +25,11 @@ module Pinnacle
25
25
  # @return [Pinnacle::Types::UploadResults]
26
26
  def upload(request_options: {}, **params)
27
27
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
28
- body_prop_names = %i[content_type size name options]
29
- body_bag = params.slice(*body_prop_names)
30
-
31
28
  request = Pinnacle::Internal::JSON::Request.new(
32
29
  base_url: request_options[:base_url],
33
30
  method: "POST",
34
31
  path: "tools/files/upload",
35
- body: Pinnacle::Tools::File::Types::UploadFileParams.new(body_bag).to_h,
32
+ body: Pinnacle::Tools::File::Types::UploadFileParams.new(params).to_h,
36
33
  request_options: request_options
37
34
  )
38
35
  begin
@@ -67,14 +64,11 @@ module Pinnacle
67
64
  # @return [Array[Pinnacle::Types::RefreshedFile]]
68
65
  def refresh(request_options: {}, **params)
69
66
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
70
- body_prop_names = %i[urls]
71
- body_bag = params.slice(*body_prop_names)
72
-
73
67
  request = Pinnacle::Internal::JSON::Request.new(
74
68
  base_url: request_options[:base_url],
75
69
  method: "POST",
76
70
  path: "tools/files/refresh",
77
- body: Pinnacle::Tools::File::Types::RefreshFileParams.new(body_bag).to_h,
71
+ body: Pinnacle::Tools::File::Types::RefreshFileParams.new(params).to_h,
78
72
  request_options: request_options
79
73
  )
80
74
  begin
@@ -24,14 +24,11 @@ module Pinnacle
24
24
  # @return [Pinnacle::Types::ShortenedUrl]
25
25
  def create(request_options: {}, **params)
26
26
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
27
- body_prop_names = %i[url options]
28
- body_bag = params.slice(*body_prop_names)
29
-
30
27
  request = Pinnacle::Internal::JSON::Request.new(
31
28
  base_url: request_options[:base_url],
32
29
  method: "POST",
33
30
  path: "tools/url",
34
- body: Pinnacle::Tools::Url::Types::CreateUrlParams.new(body_bag).to_h,
31
+ body: Pinnacle::Tools::Url::Types::CreateUrlParams.new(params).to_h,
35
32
  request_options: request_options
36
33
  )
37
34
  begin
@@ -97,16 +94,15 @@ module Pinnacle
97
94
  # @return [Pinnacle::Types::ShortenedUrl]
98
95
  def update(request_options: {}, **params)
99
96
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
100
- path_param_names = %i[link_id]
101
- body_params = params.except(*path_param_names)
102
- body_prop_names = %i[url options]
103
- body_bag = body_params.slice(*body_prop_names)
97
+ request_data = Pinnacle::Tools::Url::Types::UpdateUrlParams.new(params).to_h
98
+ non_body_param_names = ["linkId"]
99
+ body = request_data.except(*non_body_param_names)
104
100
 
105
101
  request = Pinnacle::Internal::JSON::Request.new(
106
102
  base_url: request_options[:base_url],
107
103
  method: "PUT",
108
104
  path: "tools/url/#{params[:link_id]}",
109
- body: Pinnacle::Tools::Url::Types::UpdateUrlParams.new(body_bag).to_h,
105
+ body: body,
110
106
  request_options: request_options
111
107
  )
112
108
  begin
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Pinnacle
4
- VERSION = "2.0.8"
4
+ VERSION = "2.0.11"
5
5
  end
@@ -23,14 +23,11 @@ module Pinnacle
23
23
  # @return [Pinnacle::Types::WebhookResult]
24
24
  def get(request_options: {}, **params)
25
25
  params = Pinnacle::Internal::Types::Utils.normalize_keys(params)
26
- body_prop_names = %i[identifiers]
27
- body_bag = params.slice(*body_prop_names)
28
-
29
26
  request = Pinnacle::Internal::JSON::Request.new(
30
27
  base_url: request_options[:base_url],
31
28
  method: "POST",
32
29
  path: "webhooks",
33
- body: Pinnacle::Webhooks::Types::GetWebhookParams.new(body_bag).to_h,
30
+ body: Pinnacle::Webhooks::Types::GetWebhookParams.new(params).to_h,
34
31
  request_options: request_options
35
32
  )
36
33
  begin
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rcs
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.8
4
+ version: 2.0.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pinnacle
@@ -23,7 +23,6 @@ files:
23
23
  - README.md
24
24
  - Rakefile
25
25
  - custom.gemspec.rb
26
- - lib/pinnacle.rb
27
26
  - lib/pinnacle/audiences/client.rb
28
27
  - lib/pinnacle/audiences/contacts/client.rb
29
28
  - lib/pinnacle/audiences/contacts/types/add_contacts_params.rb
@@ -469,10 +468,10 @@ files:
469
468
  - lib/pinnacle/wrapper/messages/client.rb
470
469
  - lib/pinnacle/wrapper/tools/client.rb
471
470
  - lib/pinnacle/wrapper/tools/file_uploader.rb
471
+ - lib/rcs.rb
472
472
  - reference.md
473
- homepage: https://github.com/pinnacle-dev/rcs-ruby
474
- licenses:
475
- - MIT
473
+ homepage:
474
+ licenses: []
476
475
  metadata:
477
476
  rubygems_mfa_required: 'true'
478
477
  post_install_message:
File without changes