amritk-galaxy-staging 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 (148) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +13 -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 +186 -0
  8. data/lib/amritk-galaxy-staging/client.rb +238 -0
  9. data/lib/amritk-galaxy-staging/errors.rb +227 -0
  10. data/lib/amritk-galaxy-staging/file_part.rb +58 -0
  11. data/lib/amritk-galaxy-staging/internal/transport/base_client.rb +588 -0
  12. data/lib/amritk-galaxy-staging/internal/transport/pooled_net_requester.rb +224 -0
  13. data/lib/amritk-galaxy-staging/internal/type/array_of.rb +164 -0
  14. data/lib/amritk-galaxy-staging/internal/type/base_model.rb +534 -0
  15. data/lib/amritk-galaxy-staging/internal/type/base_page.rb +55 -0
  16. data/lib/amritk-galaxy-staging/internal/type/boolean.rb +77 -0
  17. data/lib/amritk-galaxy-staging/internal/type/converter.rb +333 -0
  18. data/lib/amritk-galaxy-staging/internal/type/enum.rb +132 -0
  19. data/lib/amritk-galaxy-staging/internal/type/file_input.rb +111 -0
  20. data/lib/amritk-galaxy-staging/internal/type/hash_of.rb +186 -0
  21. data/lib/amritk-galaxy-staging/internal/type/request_parameters.rb +42 -0
  22. data/lib/amritk-galaxy-staging/internal/type/union.rb +238 -0
  23. data/lib/amritk-galaxy-staging/internal/type/unknown.rb +81 -0
  24. data/lib/amritk-galaxy-staging/internal/util.rb +965 -0
  25. data/lib/amritk-galaxy-staging/internal.rb +18 -0
  26. data/lib/amritk-galaxy-staging/models/authentication_create_token_params.rb +26 -0
  27. data/lib/amritk-galaxy-staging/models/authentication_create_user_params.rb +32 -0
  28. data/lib/amritk-galaxy-staging/models/authentication_list_me_params.rb +14 -0
  29. data/lib/amritk-galaxy-staging/models/celestial_body.rb +21 -0
  30. data/lib/amritk-galaxy-staging/models/celestial_body_create_params.rb +20 -0
  31. data/lib/amritk-galaxy-staging/models/new_planet_webhook_event.rb +9 -0
  32. data/lib/amritk-galaxy-staging/models/paginated_resource.rb +46 -0
  33. data/lib/amritk-galaxy-staging/models/planet.rb +221 -0
  34. data/lib/amritk-galaxy-staging/models/planet_create_params.rb +14 -0
  35. data/lib/amritk-galaxy-staging/models/planet_delete_params.rb +20 -0
  36. data/lib/amritk-galaxy-staging/models/planet_list_params.rb +30 -0
  37. data/lib/amritk-galaxy-staging/models/planet_list_response.rb +16 -0
  38. data/lib/amritk-galaxy-staging/models/planet_retrieve_params.rb +20 -0
  39. data/lib/amritk-galaxy-staging/models/planet_update_params.rb +20 -0
  40. data/lib/amritk-galaxy-staging/models/planet_upload_image_params.rb +29 -0
  41. data/lib/amritk-galaxy-staging/models/planet_upload_image_response.rb +48 -0
  42. data/lib/amritk-galaxy-staging/models/satellite.rb +96 -0
  43. data/lib/amritk-galaxy-staging/models/token.rb +18 -0
  44. data/lib/amritk-galaxy-staging/models/unwrap_webhook_event.rb +14 -0
  45. data/lib/amritk-galaxy-staging/models/user.rb +26 -0
  46. data/lib/amritk-galaxy-staging/models/webhook_unwrap_params.rb +14 -0
  47. data/lib/amritk-galaxy-staging/models.rb +87 -0
  48. data/lib/amritk-galaxy-staging/request_options.rb +79 -0
  49. data/lib/amritk-galaxy-staging/resources/authentication.rb +80 -0
  50. data/lib/amritk-galaxy-staging/resources/celestial_bodies.rb +36 -0
  51. data/lib/amritk-galaxy-staging/resources/planets.rb +215 -0
  52. data/lib/amritk-galaxy-staging/resources/webhooks.rb +37 -0
  53. data/lib/amritk-galaxy-staging/version.rb +5 -0
  54. data/lib/amritk-galaxy-staging.rb +79 -0
  55. data/rbi/amritk-galaxy-staging/client.rbi +130 -0
  56. data/rbi/amritk-galaxy-staging/errors.rbi +205 -0
  57. data/rbi/amritk-galaxy-staging/file_part.rbi +37 -0
  58. data/rbi/amritk-galaxy-staging/internal/transport/base_client.rbi +312 -0
  59. data/rbi/amritk-galaxy-staging/internal/transport/pooled_net_requester.rbi +84 -0
  60. data/rbi/amritk-galaxy-staging/internal/type/array_of.rbi +108 -0
  61. data/rbi/amritk-galaxy-staging/internal/type/base_model.rbi +319 -0
  62. data/rbi/amritk-galaxy-staging/internal/type/base_page.rbi +43 -0
  63. data/rbi/amritk-galaxy-staging/internal/type/boolean.rbi +59 -0
  64. data/rbi/amritk-galaxy-staging/internal/type/converter.rbi +225 -0
  65. data/rbi/amritk-galaxy-staging/internal/type/enum.rbi +82 -0
  66. data/rbi/amritk-galaxy-staging/internal/type/file_input.rbi +60 -0
  67. data/rbi/amritk-galaxy-staging/internal/type/hash_of.rbi +108 -0
  68. data/rbi/amritk-galaxy-staging/internal/type/request_parameters.rbi +33 -0
  69. data/rbi/amritk-galaxy-staging/internal/type/union.rbi +134 -0
  70. data/rbi/amritk-galaxy-staging/internal/type/unknown.rbi +59 -0
  71. data/rbi/amritk-galaxy-staging/internal/util.rbi +515 -0
  72. data/rbi/amritk-galaxy-staging/internal.rbi +18 -0
  73. data/rbi/amritk-galaxy-staging/models/authentication_create_token_params.rbi +46 -0
  74. data/rbi/amritk-galaxy-staging/models/authentication_create_user_params.rbi +54 -0
  75. data/rbi/amritk-galaxy-staging/models/authentication_list_me_params.rbi +34 -0
  76. data/rbi/amritk-galaxy-staging/models/celestial_body.rbi +21 -0
  77. data/rbi/amritk-galaxy-staging/models/celestial_body_create_params.rbi +53 -0
  78. data/rbi/amritk-galaxy-staging/models/new_planet_webhook_event.rbi +23 -0
  79. data/rbi/amritk-galaxy-staging/models/paginated_resource.rbi +93 -0
  80. data/rbi/amritk-galaxy-staging/models/planet.rbi +373 -0
  81. data/rbi/amritk-galaxy-staging/models/planet_create_params.rbi +34 -0
  82. data/rbi/amritk-galaxy-staging/models/planet_delete_params.rbi +41 -0
  83. data/rbi/amritk-galaxy-staging/models/planet_list_params.rbi +60 -0
  84. data/rbi/amritk-galaxy-staging/models/planet_list_response.rbi +33 -0
  85. data/rbi/amritk-galaxy-staging/models/planet_retrieve_params.rbi +41 -0
  86. data/rbi/amritk-galaxy-staging/models/planet_update_params.rbi +41 -0
  87. data/rbi/amritk-galaxy-staging/models/planet_upload_image_params.rbi +55 -0
  88. data/rbi/amritk-galaxy-staging/models/planet_upload_image_response.rbi +85 -0
  89. data/rbi/amritk-galaxy-staging/models/satellite.rbi +160 -0
  90. data/rbi/amritk-galaxy-staging/models/token.rbi +30 -0
  91. data/rbi/amritk-galaxy-staging/models/unwrap_webhook_event.rbi +20 -0
  92. data/rbi/amritk-galaxy-staging/models/user.rbi +36 -0
  93. data/rbi/amritk-galaxy-staging/models/webhook_unwrap_params.rbi +34 -0
  94. data/rbi/amritk-galaxy-staging/models.rbi +45 -0
  95. data/rbi/amritk-galaxy-staging/request_options.rbi +64 -0
  96. data/rbi/amritk-galaxy-staging/resources/authentication.rbi +49 -0
  97. data/rbi/amritk-galaxy-staging/resources/celestial_bodies.rbi +29 -0
  98. data/rbi/amritk-galaxy-staging/resources/planets.rbi +180 -0
  99. data/rbi/amritk-galaxy-staging/resources/webhooks.rbi +31 -0
  100. data/rbi/amritk-galaxy-staging/version.rbi +5 -0
  101. data/sig/amritk-galaxy-staging/client.rbs +62 -0
  102. data/sig/amritk-galaxy-staging/errors.rbs +117 -0
  103. data/sig/amritk-galaxy-staging/file_part.rbs +21 -0
  104. data/sig/amritk-galaxy-staging/internal/transport/base_client.rbs +133 -0
  105. data/sig/amritk-galaxy-staging/internal/transport/pooled_net_requester.rbs +48 -0
  106. data/sig/amritk-galaxy-staging/internal/type/array_of.rbs +48 -0
  107. data/sig/amritk-galaxy-staging/internal/type/base_model.rbs +102 -0
  108. data/sig/amritk-galaxy-staging/internal/type/base_page.rbs +24 -0
  109. data/sig/amritk-galaxy-staging/internal/type/boolean.rbs +26 -0
  110. data/sig/amritk-galaxy-staging/internal/type/converter.rbs +79 -0
  111. data/sig/amritk-galaxy-staging/internal/type/enum.rbs +32 -0
  112. data/sig/amritk-galaxy-staging/internal/type/file_input.rbs +25 -0
  113. data/sig/amritk-galaxy-staging/internal/type/hash_of.rbs +48 -0
  114. data/sig/amritk-galaxy-staging/internal/type/request_parameters.rbs +17 -0
  115. data/sig/amritk-galaxy-staging/internal/type/union.rbs +52 -0
  116. data/sig/amritk-galaxy-staging/internal/type/unknown.rbs +26 -0
  117. data/sig/amritk-galaxy-staging/internal/util.rbs +199 -0
  118. data/sig/amritk-galaxy-staging/internal.rbs +9 -0
  119. data/sig/amritk-galaxy-staging/models/authentication_create_token_params.rbs +28 -0
  120. data/sig/amritk-galaxy-staging/models/authentication_create_user_params.rbs +34 -0
  121. data/sig/amritk-galaxy-staging/models/authentication_list_me_params.rbs +17 -0
  122. data/sig/amritk-galaxy-staging/models/celestial_body.rbs +12 -0
  123. data/sig/amritk-galaxy-staging/models/celestial_body_create_params.rbs +24 -0
  124. data/sig/amritk-galaxy-staging/models/new_planet_webhook_event.rbs +11 -0
  125. data/sig/amritk-galaxy-staging/models/paginated_resource.rbs +53 -0
  126. data/sig/amritk-galaxy-staging/models/planet.rbs +210 -0
  127. data/sig/amritk-galaxy-staging/models/planet_create_params.rbs +17 -0
  128. data/sig/amritk-galaxy-staging/models/planet_delete_params.rbs +24 -0
  129. data/sig/amritk-galaxy-staging/models/planet_list_params.rbs +32 -0
  130. data/sig/amritk-galaxy-staging/models/planet_list_response.rbs +17 -0
  131. data/sig/amritk-galaxy-staging/models/planet_retrieve_params.rbs +24 -0
  132. data/sig/amritk-galaxy-staging/models/planet_update_params.rbs +26 -0
  133. data/sig/amritk-galaxy-staging/models/planet_upload_image_params.rbs +32 -0
  134. data/sig/amritk-galaxy-staging/models/planet_upload_image_response.rbs +50 -0
  135. data/sig/amritk-galaxy-staging/models/satellite.rbs +95 -0
  136. data/sig/amritk-galaxy-staging/models/token.rbs +15 -0
  137. data/sig/amritk-galaxy-staging/models/unwrap_webhook_event.rbs +11 -0
  138. data/sig/amritk-galaxy-staging/models/user.rbs +19 -0
  139. data/sig/amritk-galaxy-staging/models/webhook_unwrap_params.rbs +17 -0
  140. data/sig/amritk-galaxy-staging/models.rbs +39 -0
  141. data/sig/amritk-galaxy-staging/request_options.rbs +34 -0
  142. data/sig/amritk-galaxy-staging/resources/authentication.rbs +24 -0
  143. data/sig/amritk-galaxy-staging/resources/celestial_bodies.rbs +12 -0
  144. data/sig/amritk-galaxy-staging/resources/planets.rbs +68 -0
  145. data/sig/amritk-galaxy-staging/resources/webhooks.rbs +13 -0
  146. data/sig/amritk-galaxy-staging/version.rbs +3 -0
  147. data/sig/manifest.yaml +6 -0
  148. metadata +248 -0
@@ -0,0 +1,186 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DemoApiScalarGalaxy
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 DemoApiScalarGalaxy::Internal::Type::Converter
15
+ include DemoApiScalarGalaxy::Internal::Util::SorbetRuntimeSupport
16
+
17
+ private_class_method :new
18
+
19
+ # @overload [](type_info, spec = {})
20
+ #
21
+ # @param type_info [Hash{Symbol=>Object}, Proc, DemoApiScalarGalaxy::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?(DemoApiScalarGalaxy::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
+ DemoApiScalarGalaxy::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 do
130
+ DemoApiScalarGalaxy::Internal::Type::Converter.dump(target, _1, state: state)
131
+ end
132
+ else
133
+ super
134
+ end
135
+ end
136
+
137
+ # @api private
138
+ #
139
+ # @return [Object]
140
+ def to_sorbet_type
141
+ T::Hash[DemoApiScalarGalaxy::Internal::Util::SorbetRuntimeSupport.to_sorbet_type(item_type)]
142
+ end
143
+
144
+ # @api private
145
+ #
146
+ # @return [generic<Elem>]
147
+ protected def item_type = @item_type_fn.call
148
+
149
+ # @api private
150
+ #
151
+ # @return [Boolean]
152
+ protected def nilable? = @nilable
153
+
154
+ # @api private
155
+ #
156
+ # @param type_info [Hash{Symbol=>Object}, Proc, DemoApiScalarGalaxy::Internal::Type::Converter, Class]
157
+ #
158
+ # @param spec [Hash{Symbol=>Object}] .
159
+ #
160
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
161
+ #
162
+ # @option spec [Proc] :enum
163
+ #
164
+ # @option spec [Proc] :union
165
+ #
166
+ # @option spec [Boolean] :"nil?"
167
+ def initialize(type_info, spec = {})
168
+ @item_type_fn = DemoApiScalarGalaxy::Internal::Type::Converter.type_info(type_info || spec)
169
+ @meta = DemoApiScalarGalaxy::Internal::Type::Converter.meta_info(type_info, spec)
170
+ @nilable = spec.fetch(:nil?, false)
171
+ end
172
+
173
+ # @api private
174
+ #
175
+ # @param depth [Integer]
176
+ #
177
+ # @return [String]
178
+ def inspect(depth: 0)
179
+ items = DemoApiScalarGalaxy::Internal::Type::Converter.inspect(item_type, depth: depth.succ)
180
+
181
+ "#{self.class}[#{[items, nilable? ? "nil" : nil].compact.join(" | ")}]"
182
+ end
183
+ end
184
+ end
185
+ end
186
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DemoApiScalarGalaxy
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 [DemoApiScalarGalaxy::RequestOptions, Hash{Symbol=>Object}]
12
+
13
+ # @param mod [Module]
14
+ def self.included(mod)
15
+ raise ArgumentError.new(mod) unless mod <= DemoApiScalarGalaxy::Internal::Type::BaseModel
16
+
17
+ mod.optional(:request_options, DemoApiScalarGalaxy::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 = DemoApiScalarGalaxy::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,238 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DemoApiScalarGalaxy
4
+ module Internal
5
+ module Type
6
+ # @api private
7
+ #
8
+ module Union
9
+ include DemoApiScalarGalaxy::Internal::Type::Converter
10
+ include DemoApiScalarGalaxy::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, DemoApiScalarGalaxy::Internal::Type::Converter, Class]
44
+ #
45
+ # @param spec [Hash{Symbol=>Object}, Proc, DemoApiScalarGalaxy::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 = DemoApiScalarGalaxy::Internal::Type::Converter.meta_info(nil, spec)
56
+ variant_info =
57
+ case key
58
+ in Symbol
59
+ [key, DemoApiScalarGalaxy::Internal::Type::Converter.type_info(spec), meta]
60
+ in Proc | DemoApiScalarGalaxy::Internal::Type::Converter | Class | Hash
61
+ [nil, DemoApiScalarGalaxy::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 [DemoApiScalarGalaxy::Internal::Type::Converter, Class, nil]
72
+ private def resolve_variant(value)
73
+ case [@discriminator, value]
74
+ in [_, DemoApiScalarGalaxy::Internal::Type::BaseModel]
75
+ value.class
76
+ in [Symbol, Hash]
77
+ key =
78
+ value.fetch(@discriminator) do
79
+ value.fetch(@discriminator.to_s, DemoApiScalarGalaxy::Internal::OMIT)
80
+ end
81
+
82
+ return nil if key == DemoApiScalarGalaxy::Internal::OMIT
83
+
84
+ key = key.to_sym if key.is_a?(String)
85
+ _, found = known_variants.find { |k,| k == key }
86
+ found&.call
87
+ else
88
+ nil
89
+ end
90
+ end
91
+
92
+ # rubocop:disable Style/HashEachMethods
93
+ # rubocop:disable Style/CaseEquality
94
+
95
+ # @api public
96
+ #
97
+ # @param other [Object]
98
+ #
99
+ # @return [Boolean]
100
+ def ===(other)
101
+ known_variants.any? { |_, variant_fn| variant_fn.call === other }
102
+ end
103
+
104
+ # @api public
105
+ #
106
+ # @param other [Object]
107
+ #
108
+ # @return [Boolean]
109
+ def ==(other)
110
+ DemoApiScalarGalaxy::Internal::Type::Union === other && other.derefed_variants == derefed_variants
111
+ end
112
+
113
+ # @api public
114
+ #
115
+ # @return [Integer]
116
+ def hash = variants.hash
117
+
118
+ # @api private
119
+ #
120
+ # Tries to efficiently coerce the given value to one of the known variants.
121
+ #
122
+ # If the value cannot match any of the known variants, the coercion is considered
123
+ # non-viable and returns the original value.
124
+ #
125
+ # @param value [Object]
126
+ #
127
+ # @param state [Hash{Symbol=>Object}] .
128
+ #
129
+ # @option state [Boolean] :translate_names
130
+ #
131
+ # @option state [Boolean] :strictness
132
+ #
133
+ # @option state [Hash{Symbol=>Object}] :exactness
134
+ #
135
+ # @option state [Class<StandardError>] :error
136
+ #
137
+ # @option state [Integer] :branched
138
+ #
139
+ # @return [Object]
140
+ def coerce(value, state:)
141
+ if (target = resolve_variant(value))
142
+ return DemoApiScalarGalaxy::Internal::Type::Converter.coerce(target, value, state: state)
143
+ end
144
+
145
+ strictness = state.fetch(:strictness)
146
+ exactness = state.fetch(:exactness)
147
+
148
+ alternatives = []
149
+ known_variants.each do |_, variant_fn|
150
+ target = variant_fn.call
151
+ exact = state[:exactness] = {yes: 0, no: 0, maybe: 0}
152
+ state[:branched] += 1
153
+
154
+ coerced = DemoApiScalarGalaxy::Internal::Type::Converter.coerce(target, value, state: state)
155
+ yes, no, maybe = exact.values
156
+ if (no + maybe).zero? || (!strictness && yes.positive?)
157
+ exact.each { exactness[_1] += _2 }
158
+ state[:exactness] = exactness
159
+ return coerced
160
+ elsif maybe.positive?
161
+ alternatives << [[-yes, -maybe, no], exact, coerced]
162
+ end
163
+ end
164
+
165
+ case alternatives.sort_by!(&:first)
166
+ in []
167
+ exactness[:no] += 1
168
+ state[:error] = ArgumentError.new("no matching variant for #{value.inspect}")
169
+ value
170
+ in [[_, exact, coerced], *]
171
+ exact.each { exactness[_1] += _2 }
172
+ coerced
173
+ end.tap { state[:exactness] = exactness }
174
+ ensure
175
+ state[:strictness] = strictness
176
+ end
177
+
178
+ # @api private
179
+ #
180
+ # @param value [Object]
181
+ #
182
+ # @param state [Hash{Symbol=>Object}] .
183
+ #
184
+ # @option state [Boolean] :can_retry
185
+ #
186
+ # @return [Object]
187
+ def dump(value, state:)
188
+ if (target = resolve_variant(value))
189
+ return DemoApiScalarGalaxy::Internal::Type::Converter.dump(target, value, state: state)
190
+ end
191
+
192
+ known_variants.each do
193
+ target = _2.call
194
+ if target === value
195
+ return DemoApiScalarGalaxy::Internal::Type::Converter.dump(target, value, state: state)
196
+ end
197
+ end
198
+
199
+ super
200
+ end
201
+
202
+ # @api private
203
+ #
204
+ # @return [Object]
205
+ def to_sorbet_type
206
+ types =
207
+ variants.map { DemoApiScalarGalaxy::Internal::Util::SorbetRuntimeSupport.to_sorbet_type(_1) }.uniq
208
+ case types
209
+ in []
210
+ T.noreturn
211
+ in [type]
212
+ type
213
+ else
214
+ T.any(*types)
215
+ end
216
+ end
217
+
218
+ # rubocop:enable Style/CaseEquality
219
+ # rubocop:enable Style/HashEachMethods
220
+
221
+ # @api private
222
+ #
223
+ # @param depth [Integer]
224
+ #
225
+ # @return [String]
226
+ def inspect(depth: 0)
227
+ return is_a?(Module) ? super() : self.class.name if depth.positive?
228
+
229
+ members =
230
+ variants.map { DemoApiScalarGalaxy::Internal::Type::Converter.inspect(_1, depth: depth.succ) }
231
+ prefix = is_a?(Module) ? name : self.class.name
232
+
233
+ "#{prefix}[#{members.join(" | ")}]"
234
+ end
235
+ end
236
+ end
237
+ end
238
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DemoApiScalarGalaxy
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 DemoApiScalarGalaxy::Internal::Type::Converter
13
+ extend DemoApiScalarGalaxy::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 <= DemoApiScalarGalaxy::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