galaxy-ruby 0.2.0

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 (145) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +8 -0
  3. data/LICENSE +201 -0
  4. data/README.md +169 -0
  5. data/SECURITY.md +19 -0
  6. data/SKILL.md +83 -0
  7. data/api.md +188 -0
  8. data/lib/galaxy-ruby/client.rb +254 -0
  9. data/lib/galaxy-ruby/errors.rb +227 -0
  10. data/lib/galaxy-ruby/file_part.rb +58 -0
  11. data/lib/galaxy-ruby/internal/transport/base_client.rb +576 -0
  12. data/lib/galaxy-ruby/internal/transport/pooled_net_requester.rb +224 -0
  13. data/lib/galaxy-ruby/internal/type/array_of.rb +164 -0
  14. data/lib/galaxy-ruby/internal/type/base_model.rb +529 -0
  15. data/lib/galaxy-ruby/internal/type/base_page.rb +55 -0
  16. data/lib/galaxy-ruby/internal/type/boolean.rb +77 -0
  17. data/lib/galaxy-ruby/internal/type/converter.rb +333 -0
  18. data/lib/galaxy-ruby/internal/type/enum.rb +130 -0
  19. data/lib/galaxy-ruby/internal/type/file_input.rb +111 -0
  20. data/lib/galaxy-ruby/internal/type/hash_of.rb +184 -0
  21. data/lib/galaxy-ruby/internal/type/request_parameters.rb +42 -0
  22. data/lib/galaxy-ruby/internal/type/union.rb +234 -0
  23. data/lib/galaxy-ruby/internal/type/unknown.rb +81 -0
  24. data/lib/galaxy-ruby/internal/util.rb +960 -0
  25. data/lib/galaxy-ruby/internal.rb +15 -0
  26. data/lib/galaxy-ruby/models/authentication_create_token_params.rb +14 -0
  27. data/lib/galaxy-ruby/models/authentication_create_token_response.rb +16 -0
  28. data/lib/galaxy-ruby/models/authentication_create_user_params.rb +32 -0
  29. data/lib/galaxy-ruby/models/authentication_list_me_params.rb +14 -0
  30. data/lib/galaxy-ruby/models/celestial_body.rb +81 -0
  31. data/lib/galaxy-ruby/models/celestial_body_create_params.rb +20 -0
  32. data/lib/galaxy-ruby/models/credentials.rb +25 -0
  33. data/lib/galaxy-ruby/models/new_planet_webhook_event.rb +216 -0
  34. data/lib/galaxy-ruby/models/planet.rb +218 -0
  35. data/lib/galaxy-ruby/models/planet_create_params.rb +14 -0
  36. data/lib/galaxy-ruby/models/planet_delete_params.rb +20 -0
  37. data/lib/galaxy-ruby/models/planet_delte_image_params.rb +29 -0
  38. data/lib/galaxy-ruby/models/planet_delte_image_response.rb +48 -0
  39. data/lib/galaxy-ruby/models/planet_list_all_data_params.rb +30 -0
  40. data/lib/galaxy-ruby/models/planet_list_all_data_response.rb +51 -0
  41. data/lib/galaxy-ruby/models/planet_retrieve_params.rb +20 -0
  42. data/lib/galaxy-ruby/models/planet_update_params.rb +20 -0
  43. data/lib/galaxy-ruby/models/unwrap_webhook_event.rb +14 -0
  44. data/lib/galaxy-ruby/models/user.rb +26 -0
  45. data/lib/galaxy-ruby/models/webhook_unwrap_params.rb +14 -0
  46. data/lib/galaxy-ruby/models.rb +78 -0
  47. data/lib/galaxy-ruby/request_options.rb +77 -0
  48. data/lib/galaxy-ruby/resources/authentication.rb +80 -0
  49. data/lib/galaxy-ruby/resources/celestial_bodies.rb +37 -0
  50. data/lib/galaxy-ruby/resources/planets.rb +215 -0
  51. data/lib/galaxy-ruby/resources/webhooks.rb +34 -0
  52. data/lib/galaxy-ruby/version.rb +5 -0
  53. data/lib/galaxy-ruby.rb +78 -0
  54. data/rbi/galaxy-ruby/client.rbi +128 -0
  55. data/rbi/galaxy-ruby/errors.rbi +205 -0
  56. data/rbi/galaxy-ruby/file_part.rbi +37 -0
  57. data/rbi/galaxy-ruby/internal/transport/base_client.rbi +305 -0
  58. data/rbi/galaxy-ruby/internal/transport/pooled_net_requester.rbi +84 -0
  59. data/rbi/galaxy-ruby/internal/type/array_of.rbi +104 -0
  60. data/rbi/galaxy-ruby/internal/type/base_model.rbi +314 -0
  61. data/rbi/galaxy-ruby/internal/type/base_page.rbi +43 -0
  62. data/rbi/galaxy-ruby/internal/type/boolean.rbi +58 -0
  63. data/rbi/galaxy-ruby/internal/type/converter.rbi +222 -0
  64. data/rbi/galaxy-ruby/internal/type/enum.rbi +82 -0
  65. data/rbi/galaxy-ruby/internal/type/file_input.rbi +59 -0
  66. data/rbi/galaxy-ruby/internal/type/hash_of.rbi +104 -0
  67. data/rbi/galaxy-ruby/internal/type/request_parameters.rbi +31 -0
  68. data/rbi/galaxy-ruby/internal/type/union.rbi +128 -0
  69. data/rbi/galaxy-ruby/internal/type/unknown.rbi +58 -0
  70. data/rbi/galaxy-ruby/internal/util.rbi +515 -0
  71. data/rbi/galaxy-ruby/internal.rbi +18 -0
  72. data/rbi/galaxy-ruby/models/authentication_create_token_params.rbi +32 -0
  73. data/rbi/galaxy-ruby/models/authentication_create_token_response.rbi +29 -0
  74. data/rbi/galaxy-ruby/models/authentication_create_user_params.rbi +54 -0
  75. data/rbi/galaxy-ruby/models/authentication_list_me_params.rbi +32 -0
  76. data/rbi/galaxy-ruby/models/celestial_body.rbi +140 -0
  77. data/rbi/galaxy-ruby/models/celestial_body_create_params.rbi +53 -0
  78. data/rbi/galaxy-ruby/models/credentials.rbi +27 -0
  79. data/rbi/galaxy-ruby/models/new_planet_webhook_event.rbi +396 -0
  80. data/rbi/galaxy-ruby/models/planet.rbi +350 -0
  81. data/rbi/galaxy-ruby/models/planet_create_params.rbi +32 -0
  82. data/rbi/galaxy-ruby/models/planet_delete_params.rbi +38 -0
  83. data/rbi/galaxy-ruby/models/planet_delte_image_params.rbi +55 -0
  84. data/rbi/galaxy-ruby/models/planet_delte_image_response.rbi +85 -0
  85. data/rbi/galaxy-ruby/models/planet_list_all_data_params.rbi +60 -0
  86. data/rbi/galaxy-ruby/models/planet_list_all_data_response.rbi +110 -0
  87. data/rbi/galaxy-ruby/models/planet_retrieve_params.rbi +38 -0
  88. data/rbi/galaxy-ruby/models/planet_update_params.rbi +38 -0
  89. data/rbi/galaxy-ruby/models/unwrap_webhook_event.rbi +17 -0
  90. data/rbi/galaxy-ruby/models/user.rbi +33 -0
  91. data/rbi/galaxy-ruby/models/webhook_unwrap_params.rbi +32 -0
  92. data/rbi/galaxy-ruby/models.rbi +39 -0
  93. data/rbi/galaxy-ruby/request_options.rbi +59 -0
  94. data/rbi/galaxy-ruby/resources/authentication.rbi +47 -0
  95. data/rbi/galaxy-ruby/resources/celestial_bodies.rbi +28 -0
  96. data/rbi/galaxy-ruby/resources/planets.rbi +176 -0
  97. data/rbi/galaxy-ruby/resources/webhooks.rbi +29 -0
  98. data/rbi/galaxy-ruby/version.rbi +5 -0
  99. data/sig/galaxy-ruby/client.rbs +62 -0
  100. data/sig/galaxy-ruby/errors.rbs +117 -0
  101. data/sig/galaxy-ruby/file_part.rbs +21 -0
  102. data/sig/galaxy-ruby/internal/transport/base_client.rbs +133 -0
  103. data/sig/galaxy-ruby/internal/transport/pooled_net_requester.rbs +48 -0
  104. data/sig/galaxy-ruby/internal/type/array_of.rbs +48 -0
  105. data/sig/galaxy-ruby/internal/type/base_model.rbs +102 -0
  106. data/sig/galaxy-ruby/internal/type/base_page.rbs +24 -0
  107. data/sig/galaxy-ruby/internal/type/boolean.rbs +26 -0
  108. data/sig/galaxy-ruby/internal/type/converter.rbs +79 -0
  109. data/sig/galaxy-ruby/internal/type/enum.rbs +32 -0
  110. data/sig/galaxy-ruby/internal/type/file_input.rbs +25 -0
  111. data/sig/galaxy-ruby/internal/type/hash_of.rbs +48 -0
  112. data/sig/galaxy-ruby/internal/type/request_parameters.rbs +17 -0
  113. data/sig/galaxy-ruby/internal/type/union.rbs +52 -0
  114. data/sig/galaxy-ruby/internal/type/unknown.rbs +26 -0
  115. data/sig/galaxy-ruby/internal/util.rbs +199 -0
  116. data/sig/galaxy-ruby/internal.rbs +9 -0
  117. data/sig/galaxy-ruby/models/authentication_create_token_params.rbs +15 -0
  118. data/sig/galaxy-ruby/models/authentication_create_token_response.rbs +15 -0
  119. data/sig/galaxy-ruby/models/authentication_create_user_params.rbs +34 -0
  120. data/sig/galaxy-ruby/models/authentication_list_me_params.rbs +15 -0
  121. data/sig/galaxy-ruby/models/celestial_body.rbs +76 -0
  122. data/sig/galaxy-ruby/models/celestial_body_create_params.rbs +24 -0
  123. data/sig/galaxy-ruby/models/credentials.rbs +15 -0
  124. data/sig/galaxy-ruby/models/new_planet_webhook_event.rbs +211 -0
  125. data/sig/galaxy-ruby/models/planet.rbs +211 -0
  126. data/sig/galaxy-ruby/models/planet_create_params.rbs +15 -0
  127. data/sig/galaxy-ruby/models/planet_delete_params.rbs +23 -0
  128. data/sig/galaxy-ruby/models/planet_delte_image_params.rbs +32 -0
  129. data/sig/galaxy-ruby/models/planet_delte_image_response.rbs +50 -0
  130. data/sig/galaxy-ruby/models/planet_list_all_data_params.rbs +32 -0
  131. data/sig/galaxy-ruby/models/planet_list_all_data_response.rbs +64 -0
  132. data/sig/galaxy-ruby/models/planet_retrieve_params.rbs +23 -0
  133. data/sig/galaxy-ruby/models/planet_update_params.rbs +25 -0
  134. data/sig/galaxy-ruby/models/unwrap_webhook_event.rbs +11 -0
  135. data/sig/galaxy-ruby/models/user.rbs +19 -0
  136. data/sig/galaxy-ruby/models/webhook_unwrap_params.rbs +15 -0
  137. data/sig/galaxy-ruby/models.rbs +35 -0
  138. data/sig/galaxy-ruby/request_options.rbs +34 -0
  139. data/sig/galaxy-ruby/resources/authentication.rbs +24 -0
  140. data/sig/galaxy-ruby/resources/celestial_bodies.rbs +12 -0
  141. data/sig/galaxy-ruby/resources/planets.rbs +68 -0
  142. data/sig/galaxy-ruby/resources/webhooks.rbs +13 -0
  143. data/sig/galaxy-ruby/version.rbs +3 -0
  144. data/sig/manifest.yaml +6 -0
  145. metadata +245 -0
@@ -0,0 +1,224 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ScalarGalaxy
4
+ module Internal
5
+ module Transport
6
+ # @api private
7
+ class PooledNetRequester
8
+ extend ScalarGalaxy::Internal::Util::SorbetRuntimeSupport
9
+
10
+ # from the golang stdlib
11
+ # https://github.com/golang/go/blob/c8eced8580028328fde7c03cbfcb720ce15b2358/src/net/http/transport.go#L49
12
+ KEEP_ALIVE_TIMEOUT = 30
13
+
14
+ DEFAULT_MAX_CONNECTIONS = [Etc.nprocessors, 99].max
15
+
16
+ class << self
17
+ # @api private
18
+ #
19
+ # @param cert_store [OpenSSL::X509::Store]
20
+ # @param url [URI::Generic]
21
+ #
22
+ # @return [Net::HTTP]
23
+ def connect(cert_store:, url:)
24
+ port =
25
+ case [url.port, url.scheme]
26
+ in [Integer, _]
27
+ url.port
28
+ in [nil, "http" | "ws"]
29
+ Net::HTTP.http_default_port
30
+ in [nil, "https" | "wss"]
31
+ Net::HTTP.https_default_port
32
+ end
33
+
34
+ Net::HTTP
35
+ .new(url.host, port)
36
+ .tap do
37
+ _1.use_ssl = %w[https wss].include?(url.scheme)
38
+ _1.max_retries = 0
39
+
40
+ (_1.cert_store = cert_store) if _1.use_ssl?
41
+ end
42
+ end
43
+
44
+ # @api private
45
+ #
46
+ # @param conn [Net::HTTP]
47
+ # @param deadline [Float]
48
+ def calibrate_socket_timeout(conn, deadline)
49
+ timeout = deadline - ScalarGalaxy::Internal::Util.monotonic_secs
50
+ conn.open_timeout = conn.read_timeout = conn.write_timeout = conn.continue_timeout = timeout
51
+ end
52
+
53
+ # @api private
54
+ #
55
+ # @param request [Hash{Symbol=>Object}] .
56
+ #
57
+ # @option request [Symbol] :method
58
+ #
59
+ # @option request [URI::Generic] :url
60
+ #
61
+ # @option request [Hash{String=>String}] :headers
62
+ #
63
+ # @param blk [Proc]
64
+ #
65
+ # @yieldparam [String]
66
+ # @return [Array(Net::HTTPGenericRequest, Proc)]
67
+ def build_request(request, &blk)
68
+ method, url, headers, body = request.fetch_values(:method, :url, :headers, :body)
69
+ req =
70
+ Net::HTTPGenericRequest.new(
71
+ method.to_s.upcase,
72
+ !body.nil?,
73
+ method != :head,
74
+ URI(url.to_s) # ensure we construct a URI class of the right scheme
75
+ )
76
+
77
+ headers.each { req[_1] = _2 }
78
+
79
+ case body
80
+ in nil
81
+ req["content-length"] ||= 0 unless req["transfer-encoding"]
82
+ in String
83
+ req["content-length"] ||= body.bytesize.to_s unless req["transfer-encoding"]
84
+ req.body_stream = ScalarGalaxy::Internal::Util::ReadIOAdapter.new(body, &blk)
85
+ in StringIO
86
+ req["content-length"] ||= body.size.to_s unless req["transfer-encoding"]
87
+ req.body_stream = ScalarGalaxy::Internal::Util::ReadIOAdapter.new(body, &blk)
88
+ in Pathname | IO | Enumerator
89
+ req["transfer-encoding"] ||= "chunked" unless req["content-length"]
90
+ req.body_stream = ScalarGalaxy::Internal::Util::ReadIOAdapter.new(body, &blk)
91
+ end
92
+
93
+ [req, req.body_stream&.method(:close)]
94
+ end
95
+ end
96
+
97
+ # @api private
98
+ #
99
+ # @param url [URI::Generic]
100
+ # @param deadline [Float]
101
+ # @param blk [Proc]
102
+ #
103
+ # @raise [Timeout::Error]
104
+ # @yieldparam [Net::HTTP]
105
+ private def with_pool(url, deadline:, &blk)
106
+ origin = ScalarGalaxy::Internal::Util.uri_origin(url)
107
+ timeout = deadline - ScalarGalaxy::Internal::Util.monotonic_secs
108
+ pool =
109
+ @mutex.synchronize do
110
+ @pools[origin] ||= ConnectionPool.new(size: @size) do
111
+ self.class.connect(cert_store: @cert_store, url: url)
112
+ end
113
+ end
114
+
115
+ pool.with(timeout: timeout, &blk)
116
+ end
117
+
118
+ # @api private
119
+ #
120
+ # @param request [Hash{Symbol=>Object}] .
121
+ #
122
+ # @option request [Symbol] :method
123
+ #
124
+ # @option request [URI::Generic] :url
125
+ #
126
+ # @option request [Hash{String=>String}] :headers
127
+ #
128
+ # @option request [Object] :body
129
+ #
130
+ # @option request [Float] :deadline
131
+ #
132
+ # @return [Array(Integer, Net::HTTPResponse, Enumerable<String>)]
133
+ def execute(request)
134
+ url, deadline = request.fetch_values(:url, :deadline)
135
+
136
+ req = nil
137
+ finished = false
138
+
139
+ # rubocop:disable Metrics/BlockLength
140
+ enum =
141
+ Enumerator.new do |y|
142
+ next if finished
143
+
144
+ with_pool(url, deadline: deadline) do |conn|
145
+ eof = false
146
+ closing = nil
147
+ ::Thread.handle_interrupt(Object => :never) do
148
+ ::Thread.handle_interrupt(Object => :immediate) do
149
+ req, closing =
150
+ self
151
+ .class
152
+ .build_request(request) { self.class.calibrate_socket_timeout(conn, deadline) }
153
+
154
+ self.class.calibrate_socket_timeout(conn, deadline)
155
+ unless conn.started?
156
+ conn.keep_alive_timeout = self.class::KEEP_ALIVE_TIMEOUT
157
+ conn.start
158
+ end
159
+
160
+ self.class.calibrate_socket_timeout(conn, deadline)
161
+ ::Kernel.catch(:jump) do
162
+ conn.request(req) do |rsp|
163
+ y << [req, rsp]
164
+ ::Kernel.throw(:jump) if finished
165
+
166
+ rsp.read_body do |bytes|
167
+ y << bytes.force_encoding(Encoding::BINARY)
168
+ ::Kernel.throw(:jump) if finished
169
+
170
+ self.class.calibrate_socket_timeout(conn, deadline)
171
+ end
172
+ eof = true
173
+ end
174
+ end
175
+ end
176
+ ensure
177
+ begin
178
+ conn.finish if !eof && conn&.started?
179
+ ensure
180
+ closing&.call
181
+ end
182
+ end
183
+ end
184
+ rescue Timeout::Error
185
+ raise ScalarGalaxy::Errors::APITimeoutError.new(url: url, request: req)
186
+ rescue StandardError
187
+ raise ScalarGalaxy::Errors::APIConnectionError.new(url: url, request: req)
188
+ end
189
+ # rubocop:enable Metrics/BlockLength
190
+
191
+ _, response = enum.next
192
+ body =
193
+ ScalarGalaxy::Internal::Util.fused_enum(enum, external: true) do
194
+ finished = true
195
+ loop { enum.next }
196
+ end
197
+ [Integer(response.code), response, body]
198
+ end
199
+
200
+ # @api private
201
+ #
202
+ # @param size [Integer]
203
+ def initialize(size: self.class::DEFAULT_MAX_CONNECTIONS)
204
+ @mutex = Mutex.new
205
+ @size = size
206
+ @cert_store = OpenSSL::X509::Store.new.tap(&:set_default_paths)
207
+ @pools = {}
208
+ end
209
+
210
+ define_sorbet_constant!(:Request) do
211
+ T.type_alias do
212
+ {
213
+ method: Symbol,
214
+ url: URI::Generic,
215
+ headers: T::Hash[String, String],
216
+ body: T.anything,
217
+ deadline: Float
218
+ }
219
+ end
220
+ end
221
+ end
222
+ end
223
+ end
224
+ end
@@ -0,0 +1,164 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ScalarGalaxy
4
+ module Internal
5
+ module Type
6
+ # @api private
7
+ #
8
+ # @abstract
9
+ #
10
+ # @generic Elem
11
+ #
12
+ # Array of items of a given type.
13
+ class ArrayOf
14
+ include ScalarGalaxy::Internal::Type::Converter
15
+ include ScalarGalaxy::Internal::Util::SorbetRuntimeSupport
16
+
17
+ private_class_method :new
18
+
19
+ # @overload [](type_info, spec = {})
20
+ #
21
+ # @param type_info [Hash{Symbol=>Object}, Proc, ScalarGalaxy::Internal::Type::Converter, Class]
22
+ #
23
+ # @param spec [Hash{Symbol=>Object}] .
24
+ #
25
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
26
+ #
27
+ # @option spec [Proc] :enum
28
+ #
29
+ # @option spec [Proc] :union
30
+ #
31
+ # @option spec [Boolean] :"nil?"
32
+ #
33
+ # @return [self]
34
+ def self.[](...) = new(...)
35
+
36
+ # @api public
37
+ #
38
+ # @param other [Object]
39
+ #
40
+ # @return [Boolean]
41
+ def ===(other) = other.is_a?(Array) && other.all?(item_type)
42
+
43
+ # @api public
44
+ #
45
+ # @param other [Object]
46
+ #
47
+ # @return [Boolean]
48
+ def ==(other)
49
+ other.is_a?(ScalarGalaxy::Internal::Type::ArrayOf) && other.nilable? == nilable? &&
50
+ other.item_type == item_type
51
+ end
52
+
53
+ # @api public
54
+ #
55
+ # @return [Integer]
56
+ def hash = [self.class, item_type].hash
57
+
58
+ # @api private
59
+ #
60
+ # @param value [Array<Object>, Object]
61
+ #
62
+ # @param state [Hash{Symbol=>Object}] .
63
+ #
64
+ # @option state [Boolean] :translate_names
65
+ #
66
+ # @option state [Boolean] :strictness
67
+ #
68
+ # @option state [Hash{Symbol=>Object}] :exactness
69
+ #
70
+ # @option state [Class<StandardError>] :error
71
+ #
72
+ # @option state [Integer] :branched
73
+ #
74
+ # @return [Array<Object>, Object]
75
+ def coerce(value, state:)
76
+ exactness = state.fetch(:exactness)
77
+
78
+ unless value.is_a?(Array)
79
+ exactness[:no] += 1
80
+ state[:error] = TypeError.new("#{value.class} can't be coerced into #{Array}")
81
+ return value
82
+ end
83
+
84
+ target = item_type
85
+ exactness[:yes] += 1
86
+ value.map do |item|
87
+ case [nilable?, item]
88
+ in [true, nil]
89
+ exactness[:yes] += 1
90
+ nil
91
+ else
92
+ ScalarGalaxy::Internal::Type::Converter.coerce(target, item, state: state)
93
+ end
94
+ end
95
+ end
96
+
97
+ # @api private
98
+ #
99
+ # @param value [Array<Object>, Object]
100
+ #
101
+ # @param state [Hash{Symbol=>Object}] .
102
+ #
103
+ # @option state [Boolean] :can_retry
104
+ #
105
+ # @return [Array<Object>, Object]
106
+ def dump(value, state:)
107
+ target = item_type
108
+ if value.is_a?(Array)
109
+ value.map { ScalarGalaxy::Internal::Type::Converter.dump(target, _1, state: state) }
110
+ else
111
+ super
112
+ end
113
+ end
114
+
115
+ # @api private
116
+ #
117
+ # @return [Object]
118
+ def to_sorbet_type
119
+ T::Array[ScalarGalaxy::Internal::Util::SorbetRuntimeSupport.to_sorbet_type(item_type)]
120
+ end
121
+
122
+ # @api private
123
+ #
124
+ # @return [generic<Elem>]
125
+ protected def item_type = @item_type_fn.call
126
+
127
+ # @api private
128
+ #
129
+ # @return [Boolean]
130
+ protected def nilable? = @nilable
131
+
132
+ # @api private
133
+ #
134
+ # @param type_info [Hash{Symbol=>Object}, Proc, ScalarGalaxy::Internal::Type::Converter, Class]
135
+ #
136
+ # @param spec [Hash{Symbol=>Object}] .
137
+ #
138
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
139
+ #
140
+ # @option spec [Proc] :enum
141
+ #
142
+ # @option spec [Proc] :union
143
+ #
144
+ # @option spec [Boolean] :"nil?"
145
+ def initialize(type_info, spec = {})
146
+ @item_type_fn = ScalarGalaxy::Internal::Type::Converter.type_info(type_info || spec)
147
+ @meta = ScalarGalaxy::Internal::Type::Converter.meta_info(type_info, spec)
148
+ @nilable = spec.fetch(:nil?, false)
149
+ end
150
+
151
+ # @api private
152
+ #
153
+ # @param depth [Integer]
154
+ #
155
+ # @return [String]
156
+ def inspect(depth: 0)
157
+ items = ScalarGalaxy::Internal::Type::Converter.inspect(item_type, depth: depth.succ)
158
+
159
+ "#{self.class}[#{[items, nilable? ? "nil" : nil].compact.join(" | ")}]"
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end