voicetel 2.2.10

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.
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module VoiceTel
6
+ module Resources
7
+ # GatewaysService — outbound termination gateways on the account.
8
+ class Gateways < Base
9
+ def list
10
+ @transport.request(:get, "/v2.2/gateways")
11
+ end
12
+
13
+ def add(body)
14
+ @transport.request(:post, "/v2.2/gateways", body: body)
15
+ end
16
+
17
+ def get(id)
18
+ @transport.request(:get, "/v2.2/gateways/#{id}")
19
+ end
20
+
21
+ def update(id, body)
22
+ @transport.request(:put, "/v2.2/gateways/#{id}", body: body)
23
+ end
24
+
25
+ # Returns nil on 204 No Content.
26
+ def remove(id)
27
+ @transport.request(:delete, "/v2.2/gateways/#{id}")
28
+ end
29
+
30
+ def numbers(id)
31
+ @transport.request(:get, "/v2.2/gateways/#{id}/numbers")
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module VoiceTel
6
+ module Resources
7
+ # INumberingService — inventory searches, orders, and port-ins.
8
+ #
9
+ # PortAvailability returns the v2.2.10 fields `local_routing_number` and
10
+ # `rate_center_tier` alongside `number`, `portable`, `losing_carrier`, `reason`.
11
+ class INumbering < Base
12
+ # GET /v2.2/inventory — search available TNs.
13
+ def search_inventory(npa: nil, nxx: nil, state: nil, ratecenter: nil, contains: nil, endswith: nil, limit: nil)
14
+ q = compact_query(
15
+ "npa" => npa, "nxx" => nxx, "state" => state, "ratecenter" => ratecenter,
16
+ "contains" => contains, "endswith" => endswith, "limit" => limit
17
+ )
18
+ @transport.request(:get, "/v2.2/inventory", query: q)
19
+ end
20
+
21
+ # GET /v2.2/inventory/coverage — aggregated availability buckets.
22
+ def coverage(state: nil, ratecenter: nil)
23
+ q = compact_query("state" => state, "ratecenter" => ratecenter)
24
+ @transport.request(:get, "/v2.2/inventory/coverage", query: q)
25
+ end
26
+
27
+ # POST /v2.2/orders — purchase new TNs.
28
+ def order(body)
29
+ @transport.request(:post, "/v2.2/orders", body: body)
30
+ end
31
+
32
+ # GET /v2.2/ports — list every port-in record.
33
+ def ports
34
+ @transport.request(:get, "/v2.2/ports")
35
+ end
36
+
37
+ # GET /v2.2/ports/{id} — detail for one port-in.
38
+ def port(id)
39
+ @transport.request(:get, "/v2.2/ports/#{id}")
40
+ end
41
+
42
+ # POST /v2.2/ports — submit a port-in.
43
+ def submit_port(body)
44
+ @transport.request(:post, "/v2.2/ports", body: body)
45
+ end
46
+
47
+ # GET /v2.2/ports/availability/{number} — check whether a TN can be ported in.
48
+ def port_availability(number)
49
+ @transport.request(:get, "/v2.2/ports/availability/#{number}")
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module VoiceTel
6
+ module Resources
7
+ # LookupsService — CNAM and LRN dips.
8
+ #
9
+ # Each call costs money; meter accordingly.
10
+ class Lookups < Base
11
+ def cnam(number)
12
+ @transport.request(:get, "/v2.2/cnam/#{number}")
13
+ end
14
+
15
+ def lrn(number, ani)
16
+ @transport.request(:get, "/v2.2/lrn/#{number}/#{ani}")
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module VoiceTel
6
+ module Resources
7
+ # MessagingService — SMS/MMS sending and 10DLC brand/campaign registration.
8
+ #
9
+ # The message-send wire body uses `fromNumber` / `toNumber`. Pass those
10
+ # snake_case in your Ruby hash (`from_number`, `to_number`) and the
11
+ # transport will translate them when serializing.
12
+ class Messaging < Base
13
+ # GET /v2.2/messages — fetch message history.
14
+ def history(number: nil, start: nil, end_at: nil, type: nil)
15
+ q = compact_query(
16
+ "number" => number,
17
+ "start" => start,
18
+ "end" => end_at,
19
+ "type" => type
20
+ )
21
+ @transport.request(:get, "/v2.2/messages", query: q)
22
+ end
23
+
24
+ # POST /v2.2/messages — send an SMS or MMS.
25
+ def send_message(body)
26
+ @transport.request(:post, "/v2.2/messages", body: body)
27
+ end
28
+
29
+ # POST /v2.2/messaging/brands — register a 10DLC brand.
30
+ def create_brand(body)
31
+ @transport.request(:post, "/v2.2/messaging/brands", body: body)
32
+ end
33
+
34
+ # GET /v2.2/messaging/campaigns — current 10DLC campaign statuses.
35
+ def campaign_status
36
+ @transport.request(:get, "/v2.2/messaging/campaigns")
37
+ end
38
+
39
+ # POST /v2.2/messaging/campaigns — register a 10DLC campaign.
40
+ def create_campaign(body)
41
+ @transport.request(:post, "/v2.2/messaging/campaigns", body: body)
42
+ end
43
+
44
+ # GET /v2.2/numbers/messaging — messaging state for many numbers.
45
+ # Pass an empty array (or omit) for "all numbers on the account".
46
+ def numbers_state(numbers: nil)
47
+ q = compact_query(
48
+ "numbers" => (numbers && !numbers.empty? ? Array(numbers).join(",") : nil)
49
+ )
50
+ @transport.request(:get, "/v2.2/numbers/messaging", query: q)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,120 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module VoiceTel
6
+ module Resources
7
+ # NumbersService — every operation on a TN owned by the account.
8
+ #
9
+ # Most methods take the 10-digit TN as the first argument. Methods that
10
+ # return 204 No Content return nil. The two exceptions in this resource
11
+ # — DELETE /v2.2/numbers/{n}/messaging-campaign and
12
+ # DELETE /v2.2/numbers/messaging-campaign — return 200 with a body and
13
+ # are exposed via #unassign_campaign and #bulk_unassign_campaign.
14
+ class Numbers < Base
15
+ def list
16
+ @transport.request(:get, "/v2.2/numbers")
17
+ end
18
+
19
+ def add(body)
20
+ @transport.request(:post, "/v2.2/numbers", body: body)
21
+ end
22
+
23
+ def get(number)
24
+ @transport.request(:get, "/v2.2/numbers/#{number}")
25
+ end
26
+
27
+ # Returns nil on 204 No Content.
28
+ def remove(number)
29
+ @transport.request(:delete, "/v2.2/numbers/#{number}")
30
+ end
31
+
32
+ # PATCH /v2.2/numbers/{number} — move a TN to another account.
33
+ def move(number, body)
34
+ @transport.request(:patch, "/v2.2/numbers/#{number}", body: body)
35
+ end
36
+
37
+ # POST /v2.2/numbers/{number}/release — release a TN back to the network.
38
+ def release(number)
39
+ @transport.request(:post, "/v2.2/numbers/#{number}/release")
40
+ end
41
+
42
+ def set_route(number, body)
43
+ @transport.request(:put, "/v2.2/numbers/#{number}/route", body: body)
44
+ end
45
+
46
+ def set_translation(number, body)
47
+ @transport.request(:put, "/v2.2/numbers/#{number}/translation", body: body)
48
+ end
49
+
50
+ def set_cnam(number, body)
51
+ @transport.request(:put, "/v2.2/numbers/#{number}/cnam", body: body)
52
+ end
53
+
54
+ def set_lidb(number, body)
55
+ @transport.request(:put, "/v2.2/numbers/#{number}/lidb", body: body)
56
+ end
57
+
58
+ def get_fax(number)
59
+ @transport.request(:get, "/v2.2/numbers/#{number}/fax")
60
+ end
61
+
62
+ def set_fax(number, body)
63
+ @transport.request(:put, "/v2.2/numbers/#{number}/fax", body: body)
64
+ end
65
+
66
+ # Returns nil on 204 No Content.
67
+ def remove_fax(number)
68
+ @transport.request(:delete, "/v2.2/numbers/#{number}/fax")
69
+ end
70
+
71
+ def set_forward(number, body)
72
+ @transport.request(:put, "/v2.2/numbers/#{number}/forward", body: body)
73
+ end
74
+
75
+ # Returns nil on 204 No Content.
76
+ def remove_forward(number)
77
+ @transport.request(:delete, "/v2.2/numbers/#{number}/forward")
78
+ end
79
+
80
+ def get_sms(number)
81
+ @transport.request(:get, "/v2.2/numbers/#{number}/sms")
82
+ end
83
+
84
+ def set_sms(number, body)
85
+ @transport.request(:put, "/v2.2/numbers/#{number}/sms", body: body)
86
+ end
87
+
88
+ # Returns nil on 204 No Content.
89
+ def remove_sms(number)
90
+ @transport.request(:delete, "/v2.2/numbers/#{number}/sms")
91
+ end
92
+
93
+ def get_messaging(number)
94
+ @transport.request(:get, "/v2.2/numbers/#{number}/messaging")
95
+ end
96
+
97
+ def patch_messaging(number, body)
98
+ @transport.request(:patch, "/v2.2/numbers/#{number}/messaging", body: body)
99
+ end
100
+
101
+ def assign_campaign(number, body)
102
+ @transport.request(:put, "/v2.2/numbers/#{number}/messaging-campaign", body: body)
103
+ end
104
+
105
+ # Returns response data (200 with body, not 204).
106
+ def unassign_campaign(number)
107
+ @transport.request(:delete, "/v2.2/numbers/#{number}/messaging-campaign")
108
+ end
109
+
110
+ # Returns response data (200 with body, not 204).
111
+ def bulk_unassign_campaign(numbers)
112
+ @transport.request(:delete, "/v2.2/numbers/messaging-campaign", body: { numbers: numbers })
113
+ end
114
+
115
+ def set_port_out_pin(number, body)
116
+ @transport.request(:patch, "/v2.2/numbers/#{number}/port-out-pin", body: body)
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module VoiceTel
6
+ module Resources
7
+ # SupportService — support tickets (create, read, update, delete, reply).
8
+ #
9
+ # On the wire, SupportConversation.number is a ticket sequence integer
10
+ # (1015, 2114, ...), NOT a phone number. When the spec uses `number`
11
+ # in this context, that's the ticket id.
12
+ class Support < Base
13
+ def list
14
+ @transport.request(:get, "/v2.2/support/tickets")
15
+ end
16
+
17
+ def create(body)
18
+ @transport.request(:post, "/v2.2/support/tickets", body: body)
19
+ end
20
+
21
+ def get(id)
22
+ @transport.request(:get, "/v2.2/support/tickets/#{id}")
23
+ end
24
+
25
+ def update(id, body)
26
+ @transport.request(:put, "/v2.2/support/tickets/#{id}", body: body)
27
+ end
28
+
29
+ # Returns nil on 204 No Content.
30
+ def delete(id)
31
+ @transport.request(:delete, "/v2.2/support/tickets/#{id}")
32
+ end
33
+
34
+ def messages(id)
35
+ @transport.request(:get, "/v2.2/support/tickets/#{id}/messages")
36
+ end
37
+
38
+ def reply(id, body)
39
+ @transport.request(:post, "/v2.2/support/tickets/#{id}/replies", body: body)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VoiceTel
4
+ # The semantic version of the VoiceTel Ruby SDK. This tracks the API version
5
+ # it targets (currently v2.2.10).
6
+ VERSION = "2.2.10"
7
+
8
+ # The VoiceTel REST API version this SDK targets.
9
+ API_VERSION = "v2.2.10"
10
+
11
+ # Default production API endpoint.
12
+ DEFAULT_BASE_URL = "https://api.voicetel.com"
13
+
14
+ # User-Agent header sent on every request unless overridden.
15
+ USER_AGENT = "voicetel-ruby/#{VERSION} (+https://github.com/voicetel/ruby-sdk)".freeze
16
+ end
data/lib/voicetel.rb ADDED
@@ -0,0 +1,122 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "voicetel/version"
4
+ require_relative "voicetel/api_error"
5
+ require_relative "voicetel/internal/transport"
6
+ require_relative "voicetel/resources/account"
7
+ require_relative "voicetel/resources/acl"
8
+ require_relative "voicetel/resources/authentication"
9
+ require_relative "voicetel/resources/e911"
10
+ require_relative "voicetel/resources/gateways"
11
+ require_relative "voicetel/resources/i_numbering"
12
+ require_relative "voicetel/resources/lookups"
13
+ require_relative "voicetel/resources/messaging"
14
+ require_relative "voicetel/resources/numbers"
15
+ require_relative "voicetel/resources/support"
16
+
17
+ # VoiceTel is the official Ruby SDK for the VoiceTel REST API.
18
+ #
19
+ # See:
20
+ # - https://voicetel.com/docs/api/v2.2/ — full API reference
21
+ # - https://voicetel.com/docs/api/v2.2/playground/ — interactive playground
22
+ # - https://voicetel.com/docs/api/v2.2/credentials/ — obtain credentials
23
+ module VoiceTel
24
+ # Client is the entry point for the VoiceTel API. Construct with an API key
25
+ # (or call #login to exchange username/password) and reach the API through
26
+ # the resource accessors:
27
+ #
28
+ # c = VoiceTel::Client.new(api_key: ENV.fetch("VOICETEL_API_KEY"))
29
+ # c.numbers.list
30
+ #
31
+ # Client is safe to share across threads as long as you don't reassign
32
+ # the API key concurrently with in-flight requests.
33
+ class Client
34
+ attr_reader :transport
35
+
36
+ def initialize(api_key: nil, base_url: nil, timeout: 30, max_retries: 2, user_agent: nil, adapter: nil)
37
+ @transport = Internal::Transport.new(
38
+ base_url: base_url,
39
+ api_key: api_key,
40
+ timeout: timeout,
41
+ max_retries: max_retries,
42
+ user_agent: user_agent,
43
+ adapter: adapter
44
+ )
45
+ end
46
+
47
+ # Exchange username + password for a 32-hex API key and install it on
48
+ # this client. Shares the 6 req/hour/IP rate limit with the rest of the
49
+ # account/* endpoints.
50
+ #
51
+ # @return [String] the freshly exchanged bearer token
52
+ def login(username:, password:)
53
+ data = @transport.request(
54
+ :post, "/v2.2/account/api-key",
55
+ body: { username: username, password: password },
56
+ require_auth: false
57
+ )
58
+ key = data.is_a?(Hash) ? data["apikey"] : nil
59
+ if key.nil? || key.empty?
60
+ raise ApiError.new(
61
+ "voicetel: api-key response did not contain data.apikey",
62
+ kind: :authentication,
63
+ body: data
64
+ )
65
+ end
66
+ @transport.api_key = key
67
+ key
68
+ end
69
+
70
+ # Currently installed bearer token (nil if none).
71
+ def api_key
72
+ @transport.api_key
73
+ end
74
+
75
+ # API endpoint this client is pointed at.
76
+ def base_url
77
+ @transport.base_url
78
+ end
79
+
80
+ # --- resource accessors ------------------------------------------------
81
+
82
+ def account
83
+ @account ||= Resources::Account.new(@transport)
84
+ end
85
+
86
+ def acl
87
+ @acl ||= Resources::Acl.new(@transport)
88
+ end
89
+
90
+ def authentication
91
+ @authentication ||= Resources::Authentication.new(@transport)
92
+ end
93
+
94
+ def e911
95
+ @e911 ||= Resources::E911.new(@transport)
96
+ end
97
+
98
+ def gateways
99
+ @gateways ||= Resources::Gateways.new(@transport)
100
+ end
101
+
102
+ def i_numbering
103
+ @i_numbering ||= Resources::INumbering.new(@transport)
104
+ end
105
+
106
+ def lookups
107
+ @lookups ||= Resources::Lookups.new(@transport)
108
+ end
109
+
110
+ def messaging
111
+ @messaging ||= Resources::Messaging.new(@transport)
112
+ end
113
+
114
+ def numbers
115
+ @numbers ||= Resources::Numbers.new(@transport)
116
+ end
117
+
118
+ def support
119
+ @support ||= Resources::Support.new(@transport)
120
+ end
121
+ end
122
+ end
data/sig/voicetel.rbs ADDED
@@ -0,0 +1,206 @@
1
+ # RBS type signatures for the VoiceTel Ruby SDK.
2
+ #
3
+ # Hashes/Arrays are deliberately typed as untyped throughout — request bodies
4
+ # and response shapes are spec-defined and would explode this file's size if
5
+ # fully modelled. The public API (Client, Resources, ApiError) is statically
6
+ # typed; payloads pass through as `untyped`.
7
+
8
+ module VoiceTel
9
+ VERSION: String
10
+ API_VERSION: String
11
+ DEFAULT_BASE_URL: String
12
+ USER_AGENT: String
13
+
14
+ class ApiError < StandardError
15
+ KINDS: Array[Symbol]
16
+
17
+ attr_reader kind: Symbol
18
+ attr_reader status_code: Integer?
19
+ attr_reader code: String?
20
+ attr_reader body: untyped
21
+
22
+ def initialize: (String message, ?kind: Symbol, ?status_code: Integer?, ?code: String?, ?body: untyped) -> void
23
+
24
+ def bad_request?: () -> bool
25
+ def authentication?: () -> bool
26
+ def permission_denied?: () -> bool
27
+ def not_found?: () -> bool
28
+ def conflict?: () -> bool
29
+ def rate_limit?: () -> bool
30
+ def server?: () -> bool
31
+ def unknown?: () -> bool
32
+
33
+ def self.kind_from_status: (Integer) -> Symbol
34
+ def self.from_response: (Integer status, String? code, String message, untyped body) -> ApiError
35
+ end
36
+
37
+ module Internal
38
+ class Transport
39
+ RETRYABLE_STATUSES: Array[Integer]
40
+
41
+ attr_reader base_url: String
42
+ attr_reader user_agent: String
43
+ attr_reader timeout: Integer | Float
44
+ attr_reader max_retries: Integer
45
+ attr_accessor api_key: String?
46
+
47
+ def initialize: (
48
+ base_url: String?,
49
+ ?api_key: String?,
50
+ ?timeout: Integer | Float,
51
+ ?max_retries: Integer,
52
+ ?user_agent: String?,
53
+ ?adapter: Symbol?
54
+ ) -> void
55
+
56
+ def request: (
57
+ Symbol method, String path,
58
+ ?query: Hash[untyped, untyped]?, ?body: untyped, ?require_auth: bool
59
+ ) -> untyped
60
+
61
+ def camelize_keys: (untyped) -> untyped
62
+ end
63
+ end
64
+
65
+ module Resources
66
+ class Base
67
+ def initialize: (Internal::Transport transport) -> void
68
+ def compact_query: (Hash[untyped, untyped]) -> Hash[untyped, untyped]
69
+ end
70
+
71
+ class Account < Base
72
+ def get: () -> untyped
73
+ def update: (untyped body) -> untyped
74
+ def add: (untyped body) -> untyped
75
+ def signup: (untyped body) -> untyped
76
+ def cdr: (?start: untyped?, ?end_at: untyped?) -> untyped
77
+ def credits: () -> untyped
78
+ def recurring_charges: () -> untyped
79
+ def payments: () -> untyped
80
+ def registration: () -> untyped
81
+ def recover: (untyped body) -> untyped
82
+ end
83
+
84
+ class Acl < Base
85
+ def list: () -> untyped
86
+ def add: (untyped body) -> untyped
87
+ def remove: (untyped body) -> untyped
88
+ end
89
+
90
+ class Authentication < Base
91
+ AUTH_TYPE_DIGEST: Integer
92
+ AUTH_TYPE_IP: Integer
93
+ AUTH_TYPE_DIGEST_OR_IP: Integer
94
+ AUTH_TYPE_DIGEST_AND_IP: Integer
95
+
96
+ def get: () -> untyped
97
+ def update: (untyped body) -> untyped
98
+ end
99
+
100
+ class E911 < Base
101
+ def list: () -> untyped
102
+ def create: (untyped body) -> untyped
103
+ def validate: (untyped body) -> untyped
104
+ def get: (String dn) -> untyped
105
+ def provision: (String dn, untyped body) -> untyped
106
+ def remove: (String dn) -> untyped
107
+ end
108
+
109
+ class Gateways < Base
110
+ def list: () -> untyped
111
+ def add: (untyped body) -> untyped
112
+ def get: (Integer id) -> untyped
113
+ def update: (Integer id, untyped body) -> untyped
114
+ def remove: (Integer id) -> untyped
115
+ def numbers: (Integer id) -> untyped
116
+ end
117
+
118
+ class INumbering < Base
119
+ def search_inventory: (
120
+ ?npa: Integer?, ?nxx: Integer?, ?state: String?, ?ratecenter: String?,
121
+ ?contains: String?, ?endswith: String?, ?limit: Integer?
122
+ ) -> untyped
123
+ def coverage: (?state: String?, ?ratecenter: String?) -> untyped
124
+ def order: (untyped body) -> untyped
125
+ def ports: () -> untyped
126
+ def port: (Integer id) -> untyped
127
+ def submit_port: (untyped body) -> untyped
128
+ def port_availability: (String number) -> untyped
129
+ end
130
+
131
+ class Lookups < Base
132
+ def cnam: (String number) -> untyped
133
+ def lrn: (String number, String ani) -> untyped
134
+ end
135
+
136
+ class Messaging < Base
137
+ def history: (?number: String?, ?start: Integer?, ?end_at: Integer?, ?type: String?) -> untyped
138
+ def send_message: (untyped body) -> untyped
139
+ def create_brand: (untyped body) -> untyped
140
+ def campaign_status: () -> untyped
141
+ def create_campaign: (untyped body) -> untyped
142
+ def numbers_state: (?numbers: Array[String]?) -> untyped
143
+ end
144
+
145
+ class Numbers < Base
146
+ def list: () -> untyped
147
+ def add: (untyped body) -> untyped
148
+ def get: (String number) -> untyped
149
+ def remove: (String number) -> untyped
150
+ def move: (String number, untyped body) -> untyped
151
+ def release: (String number) -> untyped
152
+ def set_route: (String number, untyped body) -> untyped
153
+ def set_translation: (String number, untyped body) -> untyped
154
+ def set_cnam: (String number, untyped body) -> untyped
155
+ def set_lidb: (String number, untyped body) -> untyped
156
+ def get_fax: (String number) -> untyped
157
+ def set_fax: (String number, untyped body) -> untyped
158
+ def remove_fax: (String number) -> untyped
159
+ def set_forward: (String number, untyped body) -> untyped
160
+ def remove_forward: (String number) -> untyped
161
+ def get_sms: (String number) -> untyped
162
+ def set_sms: (String number, untyped body) -> untyped
163
+ def remove_sms: (String number) -> untyped
164
+ def get_messaging: (String number) -> untyped
165
+ def patch_messaging: (String number, untyped body) -> untyped
166
+ def assign_campaign: (String number, untyped body) -> untyped
167
+ def unassign_campaign: (String number) -> untyped
168
+ def bulk_unassign_campaign: (Array[String] numbers) -> untyped
169
+ def set_port_out_pin: (String number, untyped body) -> untyped
170
+ end
171
+
172
+ class Support < Base
173
+ def list: () -> untyped
174
+ def create: (untyped body) -> untyped
175
+ def get: (Integer id) -> untyped
176
+ def update: (Integer id, untyped body) -> untyped
177
+ def delete: (Integer id) -> untyped
178
+ def messages: (Integer id) -> untyped
179
+ def reply: (Integer id, untyped body) -> untyped
180
+ end
181
+ end
182
+
183
+ class Client
184
+ attr_reader transport: Internal::Transport
185
+
186
+ def initialize: (
187
+ ?api_key: String?, ?base_url: String?, ?timeout: Integer | Float,
188
+ ?max_retries: Integer, ?user_agent: String?, ?adapter: Symbol?
189
+ ) -> void
190
+
191
+ def login: (username: untyped, password: String) -> String
192
+ def api_key: () -> String?
193
+ def base_url: () -> String
194
+
195
+ def account: () -> Resources::Account
196
+ def acl: () -> Resources::Acl
197
+ def authentication: () -> Resources::Authentication
198
+ def e911: () -> Resources::E911
199
+ def gateways: () -> Resources::Gateways
200
+ def i_numbering: () -> Resources::INumbering
201
+ def lookups: () -> Resources::Lookups
202
+ def messaging: () -> Resources::Messaging
203
+ def numbers: () -> Resources::Numbers
204
+ def support: () -> Resources::Support
205
+ end
206
+ end