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,184 @@
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
+ # Hash of items of a given type.
13
+ class HashOf
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)
42
+ type = item_type
43
+ case other
44
+ in Hash
45
+ other.all? do |key, val|
46
+ case [key, val]
47
+ in [Symbol | String, ^type]
48
+ true
49
+ else
50
+ false
51
+ end
52
+ end
53
+ else
54
+ false
55
+ end
56
+ end
57
+
58
+ # @api public
59
+ #
60
+ # @param other [Object]
61
+ #
62
+ # @return [Boolean]
63
+ def ==(other)
64
+ other.is_a?(ScalarGalaxy::Internal::Type::HashOf) && other.nilable? == nilable? &&
65
+ other.item_type == item_type
66
+ end
67
+
68
+ # @api public
69
+ #
70
+ # @return [Integer]
71
+ def hash = [self.class, item_type].hash
72
+
73
+ # @api private
74
+ #
75
+ # @param value [Hash{Object=>Object}, Object]
76
+ #
77
+ # @param state [Hash{Symbol=>Object}] .
78
+ #
79
+ # @option state [Boolean] :translate_names
80
+ #
81
+ # @option state [Boolean] :strictness
82
+ #
83
+ # @option state [Hash{Symbol=>Object}] :exactness
84
+ #
85
+ # @option state [Class<StandardError>] :error
86
+ #
87
+ # @option state [Integer] :branched
88
+ #
89
+ # @return [Hash{Symbol=>Object}, Object]
90
+ def coerce(value, state:)
91
+ exactness = state.fetch(:exactness)
92
+
93
+ unless value.is_a?(Hash)
94
+ exactness[:no] += 1
95
+ state[:error] = TypeError.new("#{value.class} can't be coerced into #{Hash}")
96
+ return value
97
+ end
98
+
99
+ target = item_type
100
+ exactness[:yes] += 1
101
+ value.to_h do |key, val|
102
+ k = key.is_a?(String) ? key.to_sym : key
103
+ v =
104
+ case [nilable?, val]
105
+ in [true, nil]
106
+ exactness[:yes] += 1
107
+ nil
108
+ else
109
+ ScalarGalaxy::Internal::Type::Converter.coerce(target, val, state: state)
110
+ end
111
+
112
+ exactness[:no] += 1 unless k.is_a?(Symbol)
113
+ [k, v]
114
+ end
115
+ end
116
+
117
+ # @api private
118
+ #
119
+ # @param value [Hash{Object=>Object}, Object]
120
+ #
121
+ # @param state [Hash{Symbol=>Object}] .
122
+ #
123
+ # @option state [Boolean] :can_retry
124
+ #
125
+ # @return [Hash{Symbol=>Object}, Object]
126
+ def dump(value, state:)
127
+ target = item_type
128
+ if value.is_a?(Hash)
129
+ value.transform_values { ScalarGalaxy::Internal::Type::Converter.dump(target, _1, state: state) }
130
+ else
131
+ super
132
+ end
133
+ end
134
+
135
+ # @api private
136
+ #
137
+ # @return [Object]
138
+ def to_sorbet_type
139
+ T::Hash[ScalarGalaxy::Internal::Util::SorbetRuntimeSupport.to_sorbet_type(item_type)]
140
+ end
141
+
142
+ # @api private
143
+ #
144
+ # @return [generic<Elem>]
145
+ protected def item_type = @item_type_fn.call
146
+
147
+ # @api private
148
+ #
149
+ # @return [Boolean]
150
+ protected def nilable? = @nilable
151
+
152
+ # @api private
153
+ #
154
+ # @param type_info [Hash{Symbol=>Object}, Proc, ScalarGalaxy::Internal::Type::Converter, Class]
155
+ #
156
+ # @param spec [Hash{Symbol=>Object}] .
157
+ #
158
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
159
+ #
160
+ # @option spec [Proc] :enum
161
+ #
162
+ # @option spec [Proc] :union
163
+ #
164
+ # @option spec [Boolean] :"nil?"
165
+ def initialize(type_info, spec = {})
166
+ @item_type_fn = ScalarGalaxy::Internal::Type::Converter.type_info(type_info || spec)
167
+ @meta = ScalarGalaxy::Internal::Type::Converter.meta_info(type_info, spec)
168
+ @nilable = spec.fetch(:nil?, false)
169
+ end
170
+
171
+ # @api private
172
+ #
173
+ # @param depth [Integer]
174
+ #
175
+ # @return [String]
176
+ def inspect(depth: 0)
177
+ items = ScalarGalaxy::Internal::Type::Converter.inspect(item_type, depth: depth.succ)
178
+
179
+ "#{self.class}[#{[items, nilable? ? "nil" : nil].compact.join(" | ")}]"
180
+ end
181
+ end
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ScalarGalaxy
4
+ module Internal
5
+ module Type
6
+ # @api private
7
+ module RequestParameters
8
+ # @!attribute request_options
9
+ # Options to specify HTTP behaviour for this request.
10
+ #
11
+ # @return [ScalarGalaxy::RequestOptions, Hash{Symbol=>Object}]
12
+
13
+ # @param mod [Module]
14
+ def self.included(mod)
15
+ raise ArgumentError.new(mod) unless mod <= ScalarGalaxy::Internal::Type::BaseModel
16
+
17
+ mod.optional(:request_options, ScalarGalaxy::RequestOptions)
18
+ end
19
+
20
+ # @api private
21
+ module Converter
22
+ # @api private
23
+ #
24
+ # @param params [Object]
25
+ #
26
+ # @return [Array(Object, Hash{Symbol=>Object})]
27
+ def dump_request(params)
28
+ state = {can_retry: true}
29
+ case (dumped = dump(params, state: state))
30
+ in Hash
31
+ options = ScalarGalaxy::Internal::Util.coerce_hash!(dumped[:request_options]).to_h
32
+ request_options = state.fetch(:can_retry) ? options : {**options, max_retries: 0}
33
+ [dumped.except(:request_options), request_options]
34
+ else
35
+ [dumped, nil]
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,234 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ScalarGalaxy
4
+ module Internal
5
+ module Type
6
+ # @api private
7
+ #
8
+ module Union
9
+ include ScalarGalaxy::Internal::Type::Converter
10
+ include ScalarGalaxy::Internal::Util::SorbetRuntimeSupport
11
+
12
+ # @api private
13
+ #
14
+ # All of the specified variant info for this union.
15
+ #
16
+ # @return [Array<Array(Symbol, Proc, Hash{Symbol=>Object})>]
17
+ private def known_variants = (@known_variants ||= [])
18
+
19
+ # @api private
20
+ #
21
+ # @return [Array<Array(Symbol, Object, Hash{Symbol=>Object})>]
22
+ protected def derefed_variants
23
+ known_variants.map { |key, variant_fn, meta| [key, variant_fn.call, meta] }
24
+ end
25
+
26
+ # All of the specified variants for this union.
27
+ #
28
+ # @return [Array<Object>]
29
+ def variants = derefed_variants.map { _2 }
30
+
31
+ # @api private
32
+ #
33
+ # @param property [Symbol]
34
+ private def discriminator(property)
35
+ case property
36
+ in Symbol
37
+ @discriminator = property
38
+ end
39
+ end
40
+
41
+ # @api private
42
+ #
43
+ # @param key [Symbol, Hash{Symbol=>Object}, Proc, ScalarGalaxy::Internal::Type::Converter, Class]
44
+ #
45
+ # @param spec [Hash{Symbol=>Object}, Proc, ScalarGalaxy::Internal::Type::Converter, Class] .
46
+ #
47
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
48
+ #
49
+ # @option spec [Proc] :enum
50
+ #
51
+ # @option spec [Proc] :union
52
+ #
53
+ # @option spec [Boolean] :"nil?"
54
+ private def variant(key, spec = nil)
55
+ meta = ScalarGalaxy::Internal::Type::Converter.meta_info(nil, spec)
56
+ variant_info =
57
+ case key
58
+ in Symbol
59
+ [key, ScalarGalaxy::Internal::Type::Converter.type_info(spec), meta]
60
+ in Proc | ScalarGalaxy::Internal::Type::Converter | Class | Hash
61
+ [nil, ScalarGalaxy::Internal::Type::Converter.type_info(key), meta]
62
+ end
63
+
64
+ known_variants << variant_info
65
+ end
66
+
67
+ # @api private
68
+ #
69
+ # @param value [Object]
70
+ #
71
+ # @return [ScalarGalaxy::Internal::Type::Converter, Class, nil]
72
+ private def resolve_variant(value)
73
+ case [@discriminator, value]
74
+ in [_, ScalarGalaxy::Internal::Type::BaseModel]
75
+ value.class
76
+ in [Symbol, Hash]
77
+ key =
78
+ value.fetch(@discriminator) { value.fetch(@discriminator.to_s, ScalarGalaxy::Internal::OMIT) }
79
+
80
+ return nil if key == ScalarGalaxy::Internal::OMIT
81
+
82
+ key = key.to_sym if key.is_a?(String)
83
+ _, found = known_variants.find { |k,| k == key }
84
+ found&.call
85
+ else
86
+ nil
87
+ end
88
+ end
89
+
90
+ # rubocop:disable Style/HashEachMethods
91
+ # rubocop:disable Style/CaseEquality
92
+
93
+ # @api public
94
+ #
95
+ # @param other [Object]
96
+ #
97
+ # @return [Boolean]
98
+ def ===(other)
99
+ known_variants.any? { |_, variant_fn| variant_fn.call === other }
100
+ end
101
+
102
+ # @api public
103
+ #
104
+ # @param other [Object]
105
+ #
106
+ # @return [Boolean]
107
+ def ==(other)
108
+ ScalarGalaxy::Internal::Type::Union === other && other.derefed_variants == derefed_variants
109
+ end
110
+
111
+ # @api public
112
+ #
113
+ # @return [Integer]
114
+ def hash = variants.hash
115
+
116
+ # @api private
117
+ #
118
+ # Tries to efficiently coerce the given value to one of the known variants.
119
+ #
120
+ # If the value cannot match any of the known variants, the coercion is considered
121
+ # non-viable and returns the original value.
122
+ #
123
+ # @param value [Object]
124
+ #
125
+ # @param state [Hash{Symbol=>Object}] .
126
+ #
127
+ # @option state [Boolean] :translate_names
128
+ #
129
+ # @option state [Boolean] :strictness
130
+ #
131
+ # @option state [Hash{Symbol=>Object}] :exactness
132
+ #
133
+ # @option state [Class<StandardError>] :error
134
+ #
135
+ # @option state [Integer] :branched
136
+ #
137
+ # @return [Object]
138
+ def coerce(value, state:)
139
+ if (target = resolve_variant(value))
140
+ return ScalarGalaxy::Internal::Type::Converter.coerce(target, value, state: state)
141
+ end
142
+
143
+ strictness = state.fetch(:strictness)
144
+ exactness = state.fetch(:exactness)
145
+
146
+ alternatives = []
147
+ known_variants.each do |_, variant_fn|
148
+ target = variant_fn.call
149
+ exact = state[:exactness] = {yes: 0, no: 0, maybe: 0}
150
+ state[:branched] += 1
151
+
152
+ coerced = ScalarGalaxy::Internal::Type::Converter.coerce(target, value, state: state)
153
+ yes, no, maybe = exact.values
154
+ if (no + maybe).zero? || (!strictness && yes.positive?)
155
+ exact.each { exactness[_1] += _2 }
156
+ state[:exactness] = exactness
157
+ return coerced
158
+ elsif maybe.positive?
159
+ alternatives << [[-yes, -maybe, no], exact, coerced]
160
+ end
161
+ end
162
+
163
+ case alternatives.sort_by!(&:first)
164
+ in []
165
+ exactness[:no] += 1
166
+ state[:error] = ArgumentError.new("no matching variant for #{value.inspect}")
167
+ value
168
+ in [[_, exact, coerced], *]
169
+ exact.each { exactness[_1] += _2 }
170
+ coerced
171
+ end.tap { state[:exactness] = exactness }
172
+ ensure
173
+ state[:strictness] = strictness
174
+ end
175
+
176
+ # @api private
177
+ #
178
+ # @param value [Object]
179
+ #
180
+ # @param state [Hash{Symbol=>Object}] .
181
+ #
182
+ # @option state [Boolean] :can_retry
183
+ #
184
+ # @return [Object]
185
+ def dump(value, state:)
186
+ if (target = resolve_variant(value))
187
+ return ScalarGalaxy::Internal::Type::Converter.dump(target, value, state: state)
188
+ end
189
+
190
+ known_variants.each do
191
+ target = _2.call
192
+ if target === value
193
+ return ScalarGalaxy::Internal::Type::Converter.dump(target, value, state: state)
194
+ end
195
+ end
196
+
197
+ super
198
+ end
199
+
200
+ # @api private
201
+ #
202
+ # @return [Object]
203
+ def to_sorbet_type
204
+ types = variants.map { ScalarGalaxy::Internal::Util::SorbetRuntimeSupport.to_sorbet_type(_1) }.uniq
205
+ case types
206
+ in []
207
+ T.noreturn
208
+ in [type]
209
+ type
210
+ else
211
+ T.any(*types)
212
+ end
213
+ end
214
+
215
+ # rubocop:enable Style/CaseEquality
216
+ # rubocop:enable Style/HashEachMethods
217
+
218
+ # @api private
219
+ #
220
+ # @param depth [Integer]
221
+ #
222
+ # @return [String]
223
+ def inspect(depth: 0)
224
+ return is_a?(Module) ? super() : self.class.name if depth.positive?
225
+
226
+ members = variants.map { ScalarGalaxy::Internal::Type::Converter.inspect(_1, depth: depth.succ) }
227
+ prefix = is_a?(Module) ? name : self.class.name
228
+
229
+ "#{prefix}[#{members.join(" | ")}]"
230
+ end
231
+ end
232
+ end
233
+ end
234
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ScalarGalaxy
4
+ module Internal
5
+ module Type
6
+ # @api private
7
+ #
8
+ # @abstract
9
+ #
10
+ # When we don't know what to expect for the value.
11
+ class Unknown
12
+ extend ScalarGalaxy::Internal::Type::Converter
13
+ extend ScalarGalaxy::Internal::Util::SorbetRuntimeSupport
14
+
15
+ # rubocop:disable Lint/UnusedMethodArgument
16
+
17
+ private_class_method :new
18
+
19
+ # @api public
20
+ #
21
+ # @param other [Object]
22
+ #
23
+ # @return [Boolean]
24
+ def self.===(other) = true
25
+
26
+ # @api public
27
+ #
28
+ # @param other [Object]
29
+ #
30
+ # @return [Boolean]
31
+ def self.==(other) = other.is_a?(Class) && other <= ScalarGalaxy::Internal::Type::Unknown
32
+
33
+ class << self
34
+ # @api private
35
+ #
36
+ # No coercion needed for Unknown type.
37
+ #
38
+ # @param value [Object]
39
+ #
40
+ # @param state [Hash{Symbol=>Object}] .
41
+ #
42
+ # @option state [Boolean] :translate_names
43
+ #
44
+ # @option state [Boolean] :strictness
45
+ #
46
+ # @option state [Hash{Symbol=>Object}] :exactness
47
+ #
48
+ # @option state [Class<StandardError>] :error
49
+ #
50
+ # @option state [Integer] :branched
51
+ #
52
+ # @return [Object]
53
+ def coerce(value, state:)
54
+ state.fetch(:exactness)[:yes] += 1
55
+ value
56
+ end
57
+
58
+ # @!method dump(value, state:)
59
+ # @api private
60
+ #
61
+ # @param value [Object]
62
+ #
63
+ # @param state [Hash{Symbol=>Object}] .
64
+ #
65
+ # @option state [Boolean] :can_retry
66
+ #
67
+ # @return [Object]
68
+
69
+ # @api private
70
+ #
71
+ # @return [Object]
72
+ def to_sorbet_type
73
+ T.anything
74
+ end
75
+ end
76
+
77
+ # rubocop:enable Lint/UnusedMethodArgument
78
+ end
79
+ end
80
+ end
81
+ end