handinger 0.0.2

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 (131) hide show
  1. checksums.yaml +7 -0
  2. data/.ignore +2 -0
  3. data/CHANGELOG.md +10 -0
  4. data/README.md +236 -0
  5. data/SECURITY.md +23 -0
  6. data/lib/handinger/client.rb +74 -0
  7. data/lib/handinger/errors.rb +228 -0
  8. data/lib/handinger/file_part.rb +58 -0
  9. data/lib/handinger/internal/stream.rb +29 -0
  10. data/lib/handinger/internal/transport/base_client.rb +575 -0
  11. data/lib/handinger/internal/transport/pooled_net_requester.rb +210 -0
  12. data/lib/handinger/internal/type/array_of.rb +168 -0
  13. data/lib/handinger/internal/type/base_model.rb +531 -0
  14. data/lib/handinger/internal/type/base_page.rb +55 -0
  15. data/lib/handinger/internal/type/base_stream.rb +83 -0
  16. data/lib/handinger/internal/type/boolean.rb +77 -0
  17. data/lib/handinger/internal/type/converter.rb +327 -0
  18. data/lib/handinger/internal/type/enum.rb +131 -0
  19. data/lib/handinger/internal/type/file_input.rb +111 -0
  20. data/lib/handinger/internal/type/hash_of.rb +188 -0
  21. data/lib/handinger/internal/type/request_parameters.rb +42 -0
  22. data/lib/handinger/internal/type/union.rb +262 -0
  23. data/lib/handinger/internal/type/unknown.rb +81 -0
  24. data/lib/handinger/internal/util.rb +966 -0
  25. data/lib/handinger/internal.rb +20 -0
  26. data/lib/handinger/models/create_worker.rb +40 -0
  27. data/lib/handinger/models/worker.rb +360 -0
  28. data/lib/handinger/models/worker_continue_params.rb +20 -0
  29. data/lib/handinger/models/worker_create_params.rb +14 -0
  30. data/lib/handinger/models/worker_retrieve_email_params.rb +20 -0
  31. data/lib/handinger/models/worker_retrieve_email_response.rb +7 -0
  32. data/lib/handinger/models/worker_retrieve_file_params.rb +26 -0
  33. data/lib/handinger/models/worker_retrieve_params.rb +29 -0
  34. data/lib/handinger/models/worker_stream_updates_params.rb +20 -0
  35. data/lib/handinger/models/worker_stream_updates_response.rb +7 -0
  36. data/lib/handinger/models/workers/schedule_cancel_params.rb +28 -0
  37. data/lib/handinger/models/workers/schedule_cancel_response.rb +18 -0
  38. data/lib/handinger/models/workers/schedule_create_params.rb +133 -0
  39. data/lib/handinger/models/workers/schedule_list_params.rb +22 -0
  40. data/lib/handinger/models/workers/schedule_list_response.rb +24 -0
  41. data/lib/handinger/models/workers/worker_schedule.rb +233 -0
  42. data/lib/handinger/models.rb +59 -0
  43. data/lib/handinger/request_options.rb +77 -0
  44. data/lib/handinger/resources/workers/schedules.rb +92 -0
  45. data/lib/handinger/resources/workers.rb +167 -0
  46. data/lib/handinger/version.rb +5 -0
  47. data/lib/handinger.rb +75 -0
  48. data/manifest.yaml +17 -0
  49. data/rbi/handinger/client.rbi +49 -0
  50. data/rbi/handinger/errors.rbi +205 -0
  51. data/rbi/handinger/file_part.rbi +37 -0
  52. data/rbi/handinger/internal/stream.rbi +20 -0
  53. data/rbi/handinger/internal/transport/base_client.rbi +314 -0
  54. data/rbi/handinger/internal/transport/pooled_net_requester.rbi +83 -0
  55. data/rbi/handinger/internal/type/array_of.rbi +104 -0
  56. data/rbi/handinger/internal/type/base_model.rbi +308 -0
  57. data/rbi/handinger/internal/type/base_page.rbi +42 -0
  58. data/rbi/handinger/internal/type/base_stream.rbi +75 -0
  59. data/rbi/handinger/internal/type/boolean.rbi +58 -0
  60. data/rbi/handinger/internal/type/converter.rbi +216 -0
  61. data/rbi/handinger/internal/type/enum.rbi +82 -0
  62. data/rbi/handinger/internal/type/file_input.rbi +59 -0
  63. data/rbi/handinger/internal/type/hash_of.rbi +104 -0
  64. data/rbi/handinger/internal/type/request_parameters.rbi +29 -0
  65. data/rbi/handinger/internal/type/union.rbi +128 -0
  66. data/rbi/handinger/internal/type/unknown.rbi +58 -0
  67. data/rbi/handinger/internal/util.rbi +515 -0
  68. data/rbi/handinger/internal.rbi +18 -0
  69. data/rbi/handinger/models/create_worker.rbi +72 -0
  70. data/rbi/handinger/models/worker.rbi +546 -0
  71. data/rbi/handinger/models/worker_continue_params.rbi +35 -0
  72. data/rbi/handinger/models/worker_create_params.rbi +27 -0
  73. data/rbi/handinger/models/worker_retrieve_email_params.rbi +38 -0
  74. data/rbi/handinger/models/worker_retrieve_email_response.rbi +7 -0
  75. data/rbi/handinger/models/worker_retrieve_file_params.rbi +46 -0
  76. data/rbi/handinger/models/worker_retrieve_params.rbi +52 -0
  77. data/rbi/handinger/models/worker_stream_updates_params.rbi +38 -0
  78. data/rbi/handinger/models/worker_stream_updates_response.rbi +7 -0
  79. data/rbi/handinger/models/workers/schedule_cancel_params.rbi +48 -0
  80. data/rbi/handinger/models/workers/schedule_cancel_response.rbi +28 -0
  81. data/rbi/handinger/models/workers/schedule_create_params.rbi +270 -0
  82. data/rbi/handinger/models/workers/schedule_list_params.rbi +40 -0
  83. data/rbi/handinger/models/workers/schedule_list_response.rbi +51 -0
  84. data/rbi/handinger/models/workers/worker_schedule.rbi +461 -0
  85. data/rbi/handinger/models.rbi +21 -0
  86. data/rbi/handinger/request_options.rbi +59 -0
  87. data/rbi/handinger/resources/workers/schedules.rbi +72 -0
  88. data/rbi/handinger/resources/workers.rbi +112 -0
  89. data/rbi/handinger/version.rbi +5 -0
  90. data/sig/handinger/client.rbs +26 -0
  91. data/sig/handinger/errors.rbs +117 -0
  92. data/sig/handinger/file_part.rbs +21 -0
  93. data/sig/handinger/internal/stream.rbs +9 -0
  94. data/sig/handinger/internal/transport/base_client.rbs +133 -0
  95. data/sig/handinger/internal/transport/pooled_net_requester.rbs +48 -0
  96. data/sig/handinger/internal/type/array_of.rbs +48 -0
  97. data/sig/handinger/internal/type/base_model.rbs +102 -0
  98. data/sig/handinger/internal/type/base_page.rbs +24 -0
  99. data/sig/handinger/internal/type/base_stream.rbs +38 -0
  100. data/sig/handinger/internal/type/boolean.rbs +26 -0
  101. data/sig/handinger/internal/type/converter.rbs +79 -0
  102. data/sig/handinger/internal/type/enum.rbs +32 -0
  103. data/sig/handinger/internal/type/file_input.rbs +25 -0
  104. data/sig/handinger/internal/type/hash_of.rbs +48 -0
  105. data/sig/handinger/internal/type/request_parameters.rbs +19 -0
  106. data/sig/handinger/internal/type/union.rbs +52 -0
  107. data/sig/handinger/internal/type/unknown.rbs +26 -0
  108. data/sig/handinger/internal/util.rbs +199 -0
  109. data/sig/handinger/internal.rbs +9 -0
  110. data/sig/handinger/models/create_worker.rbs +49 -0
  111. data/sig/handinger/models/worker.rbs +364 -0
  112. data/sig/handinger/models/worker_continue_params.rbs +25 -0
  113. data/sig/handinger/models/worker_create_params.rbs +15 -0
  114. data/sig/handinger/models/worker_retrieve_email_params.rbs +23 -0
  115. data/sig/handinger/models/worker_retrieve_email_response.rbs +5 -0
  116. data/sig/handinger/models/worker_retrieve_file_params.rbs +28 -0
  117. data/sig/handinger/models/worker_retrieve_params.rbs +30 -0
  118. data/sig/handinger/models/worker_stream_updates_params.rbs +23 -0
  119. data/sig/handinger/models/worker_stream_updates_response.rbs +5 -0
  120. data/sig/handinger/models/workers/schedule_cancel_params.rbs +30 -0
  121. data/sig/handinger/models/workers/schedule_cancel_response.rbs +15 -0
  122. data/sig/handinger/models/workers/schedule_create_params.rbs +123 -0
  123. data/sig/handinger/models/workers/schedule_list_params.rbs +25 -0
  124. data/sig/handinger/models/workers/schedule_list_response.rbs +27 -0
  125. data/sig/handinger/models/workers/worker_schedule.rbs +234 -0
  126. data/sig/handinger/models.rbs +19 -0
  127. data/sig/handinger/request_options.rbs +34 -0
  128. data/sig/handinger/resources/workers/schedules.rbs +28 -0
  129. data/sig/handinger/resources/workers.rbs +46 -0
  130. data/sig/handinger/version.rbs +3 -0
  131. metadata +202 -0
@@ -0,0 +1,167 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Handinger
4
+ module Resources
5
+ class Workers
6
+ # Manage future and recurring worker tasks.
7
+ # @return [Handinger::Resources::Workers::Schedules]
8
+ attr_reader :schedules
9
+
10
+ # Create a new agent worker and start it with the supplied instruction.
11
+ #
12
+ # @overload create(input:, budget: nil, stream: nil, request_options: {})
13
+ #
14
+ # @param input [String]
15
+ # @param budget [Symbol, Handinger::Models::CreateWorker::Budget]
16
+ # @param stream [Boolean]
17
+ # @param request_options [Handinger::RequestOptions, Hash{Symbol=>Object}, nil]
18
+ #
19
+ # @return [Handinger::Models::Worker]
20
+ #
21
+ # @see Handinger::Models::WorkerCreateParams
22
+ def create(params)
23
+ parsed, options = Handinger::WorkerCreateParams.dump_request(params)
24
+ @client.request(
25
+ method: :post,
26
+ path: "api/workers",
27
+ body: parsed,
28
+ model: Handinger::Worker,
29
+ options: options
30
+ )
31
+ end
32
+
33
+ # Retrieve the current worker state. Pass stream=true or request text/event-stream
34
+ # to subscribe to updates.
35
+ #
36
+ # @overload retrieve(worker_id, stream: nil, request_options: {})
37
+ #
38
+ # @param worker_id [String] Worker id returned by the create worker endpoint.
39
+ #
40
+ # @param stream [Boolean] Return a server-sent event stream instead of JSON.
41
+ #
42
+ # @param request_options [Handinger::RequestOptions, Hash{Symbol=>Object}, nil]
43
+ #
44
+ # @return [Handinger::Models::Worker]
45
+ #
46
+ # @see Handinger::Models::WorkerRetrieveParams
47
+ def retrieve(worker_id, params = {})
48
+ parsed, options = Handinger::WorkerRetrieveParams.dump_request(params)
49
+ query = Handinger::Internal::Util.encode_query_params(parsed)
50
+ @client.request(
51
+ method: :get,
52
+ path: ["api/workers/%1$s", worker_id],
53
+ query: query,
54
+ model: Handinger::Worker,
55
+ options: options
56
+ )
57
+ end
58
+
59
+ # Send another instruction to an existing worker.
60
+ #
61
+ # @overload continue(worker_id, input:, budget: nil, stream: nil, request_options: {})
62
+ #
63
+ # @param worker_id [String] Worker id returned by the create worker endpoint.
64
+ #
65
+ # @param input [String]
66
+ #
67
+ # @param budget [Symbol, Handinger::Models::CreateWorker::Budget]
68
+ #
69
+ # @param stream [Boolean]
70
+ #
71
+ # @param request_options [Handinger::RequestOptions, Hash{Symbol=>Object}, nil]
72
+ #
73
+ # @return [Handinger::Models::Worker]
74
+ #
75
+ # @see Handinger::Models::WorkerContinueParams
76
+ def continue(worker_id, params)
77
+ parsed, options = Handinger::WorkerContinueParams.dump_request(params)
78
+ @client.request(
79
+ method: :post,
80
+ path: ["api/workers/%1$s", worker_id],
81
+ body: parsed,
82
+ model: Handinger::Worker,
83
+ options: options
84
+ )
85
+ end
86
+
87
+ # Retrieve the inbound email address for a worker.
88
+ #
89
+ # @overload retrieve_email(worker_id, request_options: {})
90
+ #
91
+ # @param worker_id [String] Worker id returned by the create worker endpoint.
92
+ #
93
+ # @param request_options [Handinger::RequestOptions, Hash{Symbol=>Object}, nil]
94
+ #
95
+ # @return [String]
96
+ #
97
+ # @see Handinger::Models::WorkerRetrieveEmailParams
98
+ def retrieve_email(worker_id, params = {})
99
+ @client.request(
100
+ method: :get,
101
+ path: ["api/workers/%1$s/email", worker_id],
102
+ model: String,
103
+ options: params[:request_options]
104
+ )
105
+ end
106
+
107
+ # Retrieve a file published from a worker workspace. The runtime route accepts
108
+ # nested paths after /files/.
109
+ #
110
+ # @overload retrieve_file(file_path, worker_id:, request_options: {})
111
+ #
112
+ # @param file_path [String] Workspace file path after /files. URL-encode slashes for nested paths.
113
+ #
114
+ # @param worker_id [String] Worker id returned by the create worker endpoint.
115
+ #
116
+ # @param request_options [Handinger::RequestOptions, Hash{Symbol=>Object}, nil]
117
+ #
118
+ # @return [StringIO]
119
+ #
120
+ # @see Handinger::Models::WorkerRetrieveFileParams
121
+ def retrieve_file(file_path, params)
122
+ parsed, options = Handinger::WorkerRetrieveFileParams.dump_request(params)
123
+ worker_id =
124
+ parsed.delete(:worker_id) do
125
+ raise ArgumentError.new("missing required path argument #{_1}")
126
+ end
127
+ @client.request(
128
+ method: :get,
129
+ path: ["api/workers/%1$s/files/%2$s", worker_id, file_path],
130
+ headers: {"accept" => "application/octet-stream"},
131
+ model: StringIO,
132
+ options: options
133
+ )
134
+ end
135
+
136
+ # Subscribe to a worker using server-sent events.
137
+ #
138
+ # @overload stream_updates_streaming(worker_id, request_options: {})
139
+ #
140
+ # @param worker_id [String] Worker id returned by the create worker endpoint.
141
+ #
142
+ # @param request_options [Handinger::RequestOptions, Hash{Symbol=>Object}, nil]
143
+ #
144
+ # @return [Handinger::Internal::Stream<String>]
145
+ #
146
+ # @see Handinger::Models::WorkerStreamUpdatesParams
147
+ def stream_updates_streaming(worker_id, params = {})
148
+ @client.request(
149
+ method: :get,
150
+ path: ["api/workers/%1$s/stream", worker_id],
151
+ headers: {"accept" => "text/event-stream"},
152
+ stream: Handinger::Internal::Stream,
153
+ model: String,
154
+ options: params[:request_options]
155
+ )
156
+ end
157
+
158
+ # @api private
159
+ #
160
+ # @param client [Handinger::Client]
161
+ def initialize(client:)
162
+ @client = client
163
+ @schedules = Handinger::Resources::Workers::Schedules.new(client: client)
164
+ end
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Handinger
4
+ VERSION = "0.0.2"
5
+ end
data/lib/handinger.rb ADDED
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Standard libraries.
4
+ # rubocop:disable Lint/RedundantRequireStatement
5
+ require "English"
6
+ require "base64"
7
+ require "cgi"
8
+ require "date"
9
+ require "erb"
10
+ require "etc"
11
+ require "json"
12
+ require "net/http"
13
+ require "openssl"
14
+ require "pathname"
15
+ require "rbconfig"
16
+ require "securerandom"
17
+ require "set"
18
+ require "stringio"
19
+ require "time"
20
+ require "uri"
21
+ # rubocop:enable Lint/RedundantRequireStatement
22
+
23
+ # We already ship the preferred sorbet manifests in the package itself.
24
+ # `tapioca` currently does not offer us a way to opt out of unnecessary compilation.
25
+ if Object.const_defined?(:Tapioca) &&
26
+ caller.chain([$PROGRAM_NAME]).chain(ARGV).any?(/tapioca/) &&
27
+ ARGV.none?(/dsl/)
28
+ return
29
+ end
30
+
31
+ # Gems.
32
+ require "connection_pool"
33
+
34
+ # Package files.
35
+ require_relative "handinger/version"
36
+ require_relative "handinger/internal/util"
37
+ require_relative "handinger/internal/type/converter"
38
+ require_relative "handinger/internal/type/unknown"
39
+ require_relative "handinger/internal/type/boolean"
40
+ require_relative "handinger/internal/type/file_input"
41
+ require_relative "handinger/internal/type/enum"
42
+ require_relative "handinger/internal/type/union"
43
+ require_relative "handinger/internal/type/array_of"
44
+ require_relative "handinger/internal/type/hash_of"
45
+ require_relative "handinger/internal/type/base_model"
46
+ require_relative "handinger/internal/type/base_page"
47
+ require_relative "handinger/internal/type/base_stream"
48
+ require_relative "handinger/internal/type/request_parameters"
49
+ require_relative "handinger/internal"
50
+ require_relative "handinger/request_options"
51
+ require_relative "handinger/file_part"
52
+ require_relative "handinger/errors"
53
+ require_relative "handinger/internal/transport/base_client"
54
+ require_relative "handinger/internal/transport/pooled_net_requester"
55
+ require_relative "handinger/client"
56
+ require_relative "handinger/internal/stream"
57
+ require_relative "handinger/models/create_worker"
58
+ require_relative "handinger/models/worker"
59
+ require_relative "handinger/models/worker_continue_params"
60
+ require_relative "handinger/models/worker_create_params"
61
+ require_relative "handinger/models/worker_retrieve_email_params"
62
+ require_relative "handinger/models/worker_retrieve_email_response"
63
+ require_relative "handinger/models/worker_retrieve_file_params"
64
+ require_relative "handinger/models/worker_retrieve_params"
65
+ require_relative "handinger/models/workers/schedule_cancel_params"
66
+ require_relative "handinger/models/workers/schedule_cancel_response"
67
+ require_relative "handinger/models/workers/schedule_create_params"
68
+ require_relative "handinger/models/workers/schedule_list_params"
69
+ require_relative "handinger/models/workers/schedule_list_response"
70
+ require_relative "handinger/models/workers/worker_schedule"
71
+ require_relative "handinger/models/worker_stream_updates_params"
72
+ require_relative "handinger/models/worker_stream_updates_response"
73
+ require_relative "handinger/models"
74
+ require_relative "handinger/resources/workers"
75
+ require_relative "handinger/resources/workers/schedules"
data/manifest.yaml ADDED
@@ -0,0 +1,17 @@
1
+ dependencies:
2
+ - English
3
+ - base64
4
+ - cgi
5
+ - date
6
+ - erb
7
+ - etc
8
+ - json
9
+ - net/http
10
+ - openssl
11
+ - pathname
12
+ - rbconfig
13
+ - securerandom
14
+ - set
15
+ - stringio
16
+ - time
17
+ - uri
@@ -0,0 +1,49 @@
1
+ # typed: strong
2
+
3
+ module Handinger
4
+ class Client < Handinger::Internal::Transport::BaseClient
5
+ DEFAULT_MAX_RETRIES = 2
6
+
7
+ DEFAULT_TIMEOUT_IN_SECONDS = T.let(60.0, Float)
8
+
9
+ DEFAULT_INITIAL_RETRY_DELAY = T.let(0.5, Float)
10
+
11
+ DEFAULT_MAX_RETRY_DELAY = T.let(8.0, Float)
12
+
13
+ sig { returns(String) }
14
+ attr_reader :api_key
15
+
16
+ sig { returns(Handinger::Resources::Workers) }
17
+ attr_reader :workers
18
+
19
+ # @api private
20
+ sig { override.returns(T::Hash[String, String]) }
21
+ private def auth_headers
22
+ end
23
+
24
+ # Creates and returns a new client for interacting with the API.
25
+ sig do
26
+ params(
27
+ api_key: T.nilable(String),
28
+ base_url: T.nilable(String),
29
+ max_retries: Integer,
30
+ timeout: Float,
31
+ initial_retry_delay: Float,
32
+ max_retry_delay: Float
33
+ ).returns(T.attached_class)
34
+ end
35
+ def self.new(
36
+ # Defaults to `ENV["HANDINGER_API_KEY"]`
37
+ api_key: ENV["HANDINGER_API_KEY"],
38
+ # Override the default base URL for the API, e.g.,
39
+ # `"https://api.example.com/v2/"`. Defaults to `ENV["HANDINGER_BASE_URL"]`
40
+ base_url: ENV["HANDINGER_BASE_URL"],
41
+ # Max number of retries to attempt after a failed retryable request.
42
+ max_retries: Handinger::Client::DEFAULT_MAX_RETRIES,
43
+ timeout: Handinger::Client::DEFAULT_TIMEOUT_IN_SECONDS,
44
+ initial_retry_delay: Handinger::Client::DEFAULT_INITIAL_RETRY_DELAY,
45
+ max_retry_delay: Handinger::Client::DEFAULT_MAX_RETRY_DELAY
46
+ )
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,205 @@
1
+ # typed: strong
2
+
3
+ module Handinger
4
+ module Errors
5
+ class Error < StandardError
6
+ sig { returns(T.nilable(StandardError)) }
7
+ attr_accessor :cause
8
+ end
9
+
10
+ class ConversionError < Handinger::Errors::Error
11
+ sig { returns(T.nilable(StandardError)) }
12
+ def cause
13
+ end
14
+
15
+ # @api private
16
+ sig do
17
+ params(
18
+ on: T::Class[StandardError],
19
+ method: Symbol,
20
+ target: T.anything,
21
+ value: T.anything,
22
+ cause: T.nilable(StandardError)
23
+ ).returns(T.attached_class)
24
+ end
25
+ def self.new(on:, method:, target:, value:, cause: nil)
26
+ end
27
+ end
28
+
29
+ class APIError < Handinger::Errors::Error
30
+ sig { returns(URI::Generic) }
31
+ attr_accessor :url
32
+
33
+ sig { returns(T.nilable(Integer)) }
34
+ attr_accessor :status
35
+
36
+ sig { returns(T.nilable(T::Hash[String, String])) }
37
+ attr_accessor :headers
38
+
39
+ sig { returns(T.nilable(T.anything)) }
40
+ attr_accessor :body
41
+
42
+ # @api private
43
+ sig do
44
+ params(
45
+ url: URI::Generic,
46
+ status: T.nilable(Integer),
47
+ headers: T.nilable(T::Hash[String, String]),
48
+ body: T.nilable(Object),
49
+ request: NilClass,
50
+ response: NilClass,
51
+ message: T.nilable(String)
52
+ ).returns(T.attached_class)
53
+ end
54
+ def self.new(
55
+ url:,
56
+ status: nil,
57
+ headers: nil,
58
+ body: nil,
59
+ request: nil,
60
+ response: nil,
61
+ message: nil
62
+ )
63
+ end
64
+ end
65
+
66
+ class APIConnectionError < Handinger::Errors::APIError
67
+ sig { returns(NilClass) }
68
+ attr_accessor :status
69
+
70
+ sig { returns(NilClass) }
71
+ attr_accessor :body
72
+
73
+ # @api private
74
+ sig do
75
+ params(
76
+ url: URI::Generic,
77
+ status: NilClass,
78
+ headers: T.nilable(T::Hash[String, String]),
79
+ body: NilClass,
80
+ request: NilClass,
81
+ response: NilClass,
82
+ message: T.nilable(String)
83
+ ).returns(T.attached_class)
84
+ end
85
+ def self.new(
86
+ url:,
87
+ status: nil,
88
+ headers: nil,
89
+ body: nil,
90
+ request: nil,
91
+ response: nil,
92
+ message: "Connection error."
93
+ )
94
+ end
95
+ end
96
+
97
+ class APITimeoutError < Handinger::Errors::APIConnectionError
98
+ # @api private
99
+ sig do
100
+ params(
101
+ url: URI::Generic,
102
+ status: NilClass,
103
+ headers: T.nilable(T::Hash[String, String]),
104
+ body: NilClass,
105
+ request: NilClass,
106
+ response: NilClass,
107
+ message: T.nilable(String)
108
+ ).returns(T.attached_class)
109
+ end
110
+ def self.new(
111
+ url:,
112
+ status: nil,
113
+ headers: nil,
114
+ body: nil,
115
+ request: nil,
116
+ response: nil,
117
+ message: "Request timed out."
118
+ )
119
+ end
120
+ end
121
+
122
+ class APIStatusError < Handinger::Errors::APIError
123
+ # @api private
124
+ sig do
125
+ params(
126
+ url: URI::Generic,
127
+ status: Integer,
128
+ headers: T.nilable(T::Hash[String, String]),
129
+ body: T.nilable(Object),
130
+ request: NilClass,
131
+ response: NilClass,
132
+ message: T.nilable(String)
133
+ ).returns(T.attached_class)
134
+ end
135
+ def self.for(
136
+ url:,
137
+ status:,
138
+ headers:,
139
+ body:,
140
+ request:,
141
+ response:,
142
+ message: nil
143
+ )
144
+ end
145
+
146
+ sig { returns(Integer) }
147
+ attr_accessor :status
148
+
149
+ # @api private
150
+ sig do
151
+ params(
152
+ url: URI::Generic,
153
+ status: Integer,
154
+ headers: T.nilable(T::Hash[String, String]),
155
+ body: T.nilable(Object),
156
+ request: NilClass,
157
+ response: NilClass,
158
+ message: T.nilable(String)
159
+ ).returns(T.attached_class)
160
+ end
161
+ def self.new(
162
+ url:,
163
+ status:,
164
+ headers:,
165
+ body:,
166
+ request:,
167
+ response:,
168
+ message: nil
169
+ )
170
+ end
171
+ end
172
+
173
+ class BadRequestError < Handinger::Errors::APIStatusError
174
+ HTTP_STATUS = 400
175
+ end
176
+
177
+ class AuthenticationError < Handinger::Errors::APIStatusError
178
+ HTTP_STATUS = 401
179
+ end
180
+
181
+ class PermissionDeniedError < Handinger::Errors::APIStatusError
182
+ HTTP_STATUS = 403
183
+ end
184
+
185
+ class NotFoundError < Handinger::Errors::APIStatusError
186
+ HTTP_STATUS = 404
187
+ end
188
+
189
+ class ConflictError < Handinger::Errors::APIStatusError
190
+ HTTP_STATUS = 409
191
+ end
192
+
193
+ class UnprocessableEntityError < Handinger::Errors::APIStatusError
194
+ HTTP_STATUS = 422
195
+ end
196
+
197
+ class RateLimitError < Handinger::Errors::APIStatusError
198
+ HTTP_STATUS = 429
199
+ end
200
+
201
+ class InternalServerError < Handinger::Errors::APIStatusError
202
+ HTTP_STATUS = T.let((500..), T::Range[Integer])
203
+ end
204
+ end
205
+ end
@@ -0,0 +1,37 @@
1
+ # typed: strong
2
+
3
+ module Handinger
4
+ class FilePart
5
+ sig { returns(T.any(Pathname, StringIO, IO, String)) }
6
+ attr_reader :content
7
+
8
+ sig { returns(T.nilable(String)) }
9
+ attr_reader :content_type
10
+
11
+ sig { returns(T.nilable(String)) }
12
+ attr_reader :filename
13
+
14
+ # @api private
15
+ sig { returns(String) }
16
+ private def read
17
+ end
18
+
19
+ sig { params(a: T.anything).returns(String) }
20
+ def to_json(*a)
21
+ end
22
+
23
+ sig { params(a: T.anything).returns(String) }
24
+ def to_yaml(*a)
25
+ end
26
+
27
+ sig do
28
+ params(
29
+ content: T.any(Pathname, StringIO, IO, String),
30
+ filename: T.nilable(T.any(Pathname, String)),
31
+ content_type: T.nilable(String)
32
+ ).returns(T.attached_class)
33
+ end
34
+ def self.new(content, filename: nil, content_type: nil)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,20 @@
1
+ # typed: strong
2
+
3
+ module Handinger
4
+ module Internal
5
+ class Stream
6
+ Message =
7
+ type_member(:in) do
8
+ { fixed: Handinger::Internal::Util::ServerSentEvent }
9
+ end
10
+ Elem = type_member(:out)
11
+
12
+ include Handinger::Internal::Type::BaseStream
13
+
14
+ # @api private
15
+ sig { override.returns(T::Enumerable[Elem]) }
16
+ private def iterator
17
+ end
18
+ end
19
+ end
20
+ end