sorbet-schema 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +7 -0
  2. data/.ruby-version +1 -0
  3. data/.standard.yml +6 -0
  4. data/.tool-versions +1 -0
  5. data/CHANGELOG.md +24 -0
  6. data/CODE_OF_CONDUCT.md +84 -0
  7. data/Gemfile +25 -0
  8. data/Gemfile.lock +147 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +43 -0
  11. data/Rakefile +22 -0
  12. data/lib/sorbet-schema/hash_transformer.rb +22 -0
  13. data/lib/sorbet-schema/struct_ext.rb +37 -0
  14. data/lib/sorbet-schema/version.rb +5 -0
  15. data/lib/sorbet-schema.rb +27 -0
  16. data/lib/typed/coercion/coercer.rb +18 -0
  17. data/lib/typed/coercion/coercion_error.rb +7 -0
  18. data/lib/typed/coercion/coercion_not_supported_error.rb +7 -0
  19. data/lib/typed/coercion/float_coercer.rb +21 -0
  20. data/lib/typed/coercion/integer_coercer.rb +21 -0
  21. data/lib/typed/coercion/string_coercer.rb +19 -0
  22. data/lib/typed/coercion/struct_coercer.rb +26 -0
  23. data/lib/typed/coercion.rb +26 -0
  24. data/lib/typed/deserialize_error.rb +6 -0
  25. data/lib/typed/field.rb +28 -0
  26. data/lib/typed/hash_serializer.rb +21 -0
  27. data/lib/typed/json_serializer.rb +28 -0
  28. data/lib/typed/parse_error.rb +12 -0
  29. data/lib/typed/schema.rb +10 -0
  30. data/lib/typed/serializer.rb +61 -0
  31. data/lib/typed/validations/field_type_validator.rb +24 -0
  32. data/lib/typed/validations/field_validator.rb +15 -0
  33. data/lib/typed/validations/multiple_validation_error.rb +16 -0
  34. data/lib/typed/validations/required_field_error.rb +14 -0
  35. data/lib/typed/validations/type_mismatch_error.rb +14 -0
  36. data/lib/typed/validations/validated_value.rb +12 -0
  37. data/lib/typed/validations/validation_error.rb +8 -0
  38. data/lib/typed/validations/validation_results.rb +29 -0
  39. data/lib/typed/validations.rb +8 -0
  40. data/sorbet/config +5 -0
  41. data/sorbet/rbi/annotations/rainbow.rbi +269 -0
  42. data/sorbet/rbi/gems/.gitattributes +1 -0
  43. data/sorbet/rbi/gems/ansi@1.5.0.rbi +687 -0
  44. data/sorbet/rbi/gems/ast@2.4.2.rbi +584 -0
  45. data/sorbet/rbi/gems/builder@3.2.4.rbi +504 -0
  46. data/sorbet/rbi/gems/erubi@1.12.0.rbi +145 -0
  47. data/sorbet/rbi/gems/io-console@0.7.2.rbi +8 -0
  48. data/sorbet/rbi/gems/json@2.7.1.rbi +1553 -0
  49. data/sorbet/rbi/gems/language_server-protocol@3.17.0.3.rbi +14237 -0
  50. data/sorbet/rbi/gems/lint_roller@1.1.0.rbi +239 -0
  51. data/sorbet/rbi/gems/minitest-focus@1.4.0.rbi +91 -0
  52. data/sorbet/rbi/gems/minitest-reporters@1.6.1.rbi +1010 -0
  53. data/sorbet/rbi/gems/minitest@5.22.2.rbi +2233 -0
  54. data/sorbet/rbi/gems/netrc@0.11.0.rbi +158 -0
  55. data/sorbet/rbi/gems/parallel@1.24.0.rbi +280 -0
  56. data/sorbet/rbi/gems/parser@3.3.0.5.rbi +5472 -0
  57. data/sorbet/rbi/gems/prettier_print@1.2.1.rbi +951 -0
  58. data/sorbet/rbi/gems/prism@0.24.0.rbi +31040 -0
  59. data/sorbet/rbi/gems/psych@5.1.2.rbi +1731 -0
  60. data/sorbet/rbi/gems/racc@1.7.3.rbi +157 -0
  61. data/sorbet/rbi/gems/rainbow@3.1.1.rbi +402 -0
  62. data/sorbet/rbi/gems/rake@13.1.0.rbi +3027 -0
  63. data/sorbet/rbi/gems/rbi@0.1.9.rbi +3006 -0
  64. data/sorbet/rbi/gems/regexp_parser@2.9.0.rbi +3771 -0
  65. data/sorbet/rbi/gems/reline@0.4.3.rbi +8 -0
  66. data/sorbet/rbi/gems/rexml@3.2.6.rbi +4781 -0
  67. data/sorbet/rbi/gems/rubocop-ast@1.31.1.rbi +7014 -0
  68. data/sorbet/rbi/gems/rubocop-performance@1.20.2.rbi +8 -0
  69. data/sorbet/rbi/gems/rubocop-sorbet@0.7.7.rbi +8 -0
  70. data/sorbet/rbi/gems/rubocop@1.61.0.rbi +57499 -0
  71. data/sorbet/rbi/gems/ruby-progressbar@1.13.0.rbi +1317 -0
  72. data/sorbet/rbi/gems/sorbet-result@1.1.0.rbi +519 -0
  73. data/sorbet/rbi/gems/sorbet-struct-comparable@1.3.0.rbi +34 -0
  74. data/sorbet/rbi/gems/spoom@1.2.4.rbi +3777 -0
  75. data/sorbet/rbi/gems/standard-custom@1.0.2.rbi +8 -0
  76. data/sorbet/rbi/gems/standard-performance@1.3.1.rbi +80 -0
  77. data/sorbet/rbi/gems/standard-sorbet@0.0.2.rbi +52 -0
  78. data/sorbet/rbi/gems/standard@1.34.0.rbi +850 -0
  79. data/sorbet/rbi/gems/stringio@3.1.0.rbi +8 -0
  80. data/sorbet/rbi/gems/syntax_tree@6.2.0.rbi +23133 -0
  81. data/sorbet/rbi/gems/tapioca@0.12.0.rbi +3499 -0
  82. data/sorbet/rbi/gems/thor@1.3.1.rbi +4351 -0
  83. data/sorbet/rbi/gems/unicode-display_width@2.5.0.rbi +65 -0
  84. data/sorbet/rbi/gems/yard-sorbet@0.8.1.rbi +428 -0
  85. data/sorbet/rbi/gems/yard@0.9.36.rbi +18220 -0
  86. data/sorbet/rbi/gems/zeitwerk@2.6.13.rbi +1003 -0
  87. data/sorbet/tapioca/config.yml +4 -0
  88. data/sorbet/tapioca/require.rb +12 -0
  89. metadata +191 -0
@@ -0,0 +1,28 @@
1
+ # typed: strict
2
+
3
+ module Typed
4
+ class Field < T::Struct
5
+ extend T::Sig
6
+
7
+ include ActsAsComparable
8
+
9
+ const :name, Symbol
10
+ const :type, T::Class[T.anything]
11
+ const :required, T::Boolean, default: true
12
+
13
+ sig { returns(T::Boolean) }
14
+ def required?
15
+ required
16
+ end
17
+
18
+ sig { returns(T::Boolean) }
19
+ def optional?
20
+ !required
21
+ end
22
+
23
+ sig { params(value: Value).returns(Validations::ValidationResult) }
24
+ def validate(value)
25
+ Validations::FieldTypeValidator.new.validate(field: self, value: value)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,21 @@
1
+ # typed: strict
2
+
3
+ module Typed
4
+ class HashSerializer < Serializer
5
+ InputHash = T.type_alias { T::Hash[T.any(Symbol, String), T.untyped] }
6
+ OutputHash = T.type_alias { Params }
7
+
8
+ Input = type_member { {fixed: InputHash} }
9
+ Output = type_member { {fixed: OutputHash} }
10
+
11
+ sig { override.params(source: Input).returns(Result[T::Struct, DeserializeError]) }
12
+ def deserialize(source)
13
+ deserialize_from_creation_params(HashTransformer.new.deep_symbolize_keys(source))
14
+ end
15
+
16
+ sig { override.params(struct: T::Struct).returns(Output) }
17
+ def serialize(struct)
18
+ HashTransformer.new.deep_symbolize_keys(struct.serialize)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,28 @@
1
+ # typed: strict
2
+
3
+ require "json"
4
+
5
+ module Typed
6
+ class JSONSerializer < Serializer
7
+ Input = type_member { {fixed: String} }
8
+ Output = type_member { {fixed: String} }
9
+
10
+ sig { override.params(source: Input).returns(Result[T::Struct, DeserializeError]) }
11
+ def deserialize(source)
12
+ parsed_json = JSON.parse(source)
13
+
14
+ creation_params = schema.fields.each_with_object(T.let({}, Params)) do |field, hsh|
15
+ hsh[field.name] = parsed_json[field.name.to_s]
16
+ end
17
+
18
+ deserialize_from_creation_params(creation_params)
19
+ rescue JSON::ParserError
20
+ Failure.new(ParseError.new(format: :json))
21
+ end
22
+
23
+ sig { override.params(struct: T::Struct).returns(Output) }
24
+ def serialize(struct)
25
+ JSON.generate(struct.serialize)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,12 @@
1
+ # typed: strict
2
+
3
+ module Typed
4
+ class ParseError < DeserializeError
5
+ extend T::Sig
6
+
7
+ sig { params(format: Symbol).void }
8
+ def initialize(format:)
9
+ super("#{format} could not be parsed. Check for typos.")
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ # typed: strict
2
+
3
+ module Typed
4
+ class Schema < T::Struct
5
+ include ActsAsComparable
6
+
7
+ const :fields, T::Array[Field], default: []
8
+ const :target, T.class_of(T::Struct)
9
+ end
10
+ end
@@ -0,0 +1,61 @@
1
+ # typed: strict
2
+
3
+ module Typed
4
+ class Serializer
5
+ extend T::Sig
6
+ extend T::Helpers
7
+ extend T::Generic
8
+ abstract!
9
+
10
+ Input = type_member
11
+ Output = type_member
12
+ Params = T.type_alias { T::Hash[Symbol, T.untyped] }
13
+ DeserializeResult = T.type_alias { Typed::Result[T::Struct, DeserializeError] }
14
+
15
+ sig { returns(Schema) }
16
+ attr_reader :schema
17
+
18
+ sig { params(schema: Schema).void }
19
+ def initialize(schema:)
20
+ @schema = schema
21
+ end
22
+
23
+ sig { abstract.params(source: Output).returns(DeserializeResult) }
24
+ def deserialize(source)
25
+ end
26
+
27
+ sig { abstract.params(struct: T::Struct).returns(Output) }
28
+ def serialize(struct)
29
+ end
30
+
31
+ private
32
+
33
+ sig { params(creation_params: Params).returns(DeserializeResult) }
34
+ def deserialize_from_creation_params(creation_params)
35
+ results = schema.fields.map do |field|
36
+ value = creation_params[field.name]
37
+
38
+ if value.nil?
39
+ field.validate(value)
40
+ elsif value.class != field.type
41
+ coercion_result = Coercion.coerce(field: field, value: value)
42
+
43
+ if coercion_result.success?
44
+ field.validate(coercion_result.payload)
45
+ else
46
+ Failure.new(Validations::ValidationError.new(coercion_result.error.message))
47
+ end
48
+ else
49
+ field.validate(value)
50
+ end
51
+ end
52
+
53
+ Validations::ValidationResults
54
+ .new(results: results)
55
+ .combine
56
+ .and_then do |validated_params|
57
+ Success.new(schema.target.new(**validated_params))
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,24 @@
1
+ # typed: strict
2
+
3
+ module Typed
4
+ module Validations
5
+ class FieldTypeValidator
6
+ extend T::Sig
7
+
8
+ include FieldValidator
9
+
10
+ sig { override.params(field: Field, value: Value).returns(ValidationResult) }
11
+ def validate(field:, value:)
12
+ if field.type == value.class
13
+ Success.new(ValidatedValue.new(name: field.name, value: value))
14
+ elsif field.required? && value.nil?
15
+ Failure.new(RequiredFieldError.new(field_name: field.name))
16
+ elsif field.optional? && value.nil?
17
+ Success.new(ValidatedValue.new(name: field.name, value: value))
18
+ else
19
+ Failure.new(TypeMismatchError.new(field_name: field.name, field_type: field.type, given_type: value.class))
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,15 @@
1
+ # typed: strict
2
+
3
+ module Typed
4
+ module Validations
5
+ module FieldValidator
6
+ extend T::Sig
7
+ extend T::Helpers
8
+ interface!
9
+
10
+ sig { abstract.params(field: Field, value: Value).returns(ValidationResult) }
11
+ def validate(field:, value:)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ # typed: strict
2
+
3
+ module Typed
4
+ module Validations
5
+ class MultipleValidationError < ValidationError
6
+ extend T::Sig
7
+
8
+ sig { params(errors: T::Array[ValidationError]).void }
9
+ def initialize(errors:)
10
+ combined_message = errors.map(&:message).join(" | ")
11
+
12
+ super("Multiple validation errors found: #{combined_message}")
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,14 @@
1
+ # typed: strict
2
+
3
+ module Typed
4
+ module Validations
5
+ class RequiredFieldError < ValidationError
6
+ extend T::Sig
7
+
8
+ sig { params(field_name: Symbol).void }
9
+ def initialize(field_name:)
10
+ super("#{field_name} is required.")
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # typed: strict
2
+
3
+ module Typed
4
+ module Validations
5
+ class TypeMismatchError < ValidationError
6
+ extend T::Sig
7
+
8
+ sig { params(field_name: Symbol, field_type: T::Class[T.anything], given_type: T::Class[T.anything]).void }
9
+ def initialize(field_name:, field_type:, given_type:)
10
+ super("Invalid type given to #{field_name}. Expected #{field_type}, got #{given_type}.")
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ # typed: strict
2
+
3
+ module Typed
4
+ module Validations
5
+ class ValidatedValue < T::Struct
6
+ include ActsAsComparable
7
+
8
+ const :name, Symbol
9
+ const :value, Value
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,8 @@
1
+ # typed: strict
2
+
3
+ module Typed
4
+ module Validations
5
+ class ValidationError < DeserializeError
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,29 @@
1
+ # typed: strict
2
+
3
+ module Typed
4
+ module Validations
5
+ class ValidationResults < T::Struct
6
+ extend T::Sig
7
+
8
+ const :results, T::Array[ValidationResult]
9
+
10
+ sig { returns(Result[ValidatedParams, ValidationError]) }
11
+ def combine
12
+ failing_results = results.select(&:failure?)
13
+
14
+ case failing_results.length
15
+ when 0
16
+ Success.new(
17
+ results.each_with_object({}) do |result, validated_params|
18
+ validated_params[result.payload.name] = result.payload.value
19
+ end
20
+ )
21
+ when 1
22
+ Failure.new(T.must(failing_results.first).error)
23
+ else
24
+ Failure.new(MultipleValidationError.new(errors: failing_results.map(&:error)))
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,8 @@
1
+ # typed: strict
2
+
3
+ module Typed
4
+ module Validations
5
+ ValidationResult = T.type_alias { Result[ValidatedValue, ValidationError] }
6
+ ValidatedParams = T.type_alias { T::Hash[Symbol, Value] }
7
+ end
8
+ end
data/sorbet/config ADDED
@@ -0,0 +1,5 @@
1
+ --dir
2
+ .
3
+ --ignore=tmp/
4
+ --ignore=vendor/
5
+ --ignore=test/test_data/
@@ -0,0 +1,269 @@
1
+ # typed: strict
2
+
3
+ # DO NOT EDIT MANUALLY
4
+ # This file was pulled from a central RBI files repository.
5
+ # Please run `bin/tapioca annotations` to update it.
6
+
7
+ module Rainbow
8
+ # @shim: https://github.com/sickill/rainbow/blob/master/lib/rainbow.rb#L10-L12
9
+ sig { returns(T::Boolean) }
10
+ attr_accessor :enabled
11
+
12
+ class Color
13
+ sig { returns(Symbol) }
14
+ attr_reader :ground
15
+
16
+ sig { params(ground: Symbol, values: T.any([Integer], [Integer, Integer, Integer])).returns(Color) }
17
+ def self.build(ground, values); end
18
+
19
+ sig { params(hex: String).returns([Integer, Integer, Integer]) }
20
+ def self.parse_hex_color(hex); end
21
+
22
+ class Indexed < Rainbow::Color
23
+ sig { returns(Integer) }
24
+ attr_reader :num
25
+
26
+ sig { params(ground: Symbol, num: Integer).void }
27
+ def initialize(ground, num); end
28
+
29
+ sig { returns(T::Array[Integer]) }
30
+ def codes; end
31
+ end
32
+
33
+ class Named < Rainbow::Color::Indexed
34
+ NAMES = T.let(nil, T::Hash[Symbol, Integer])
35
+
36
+ sig { params(ground: Symbol, name: Symbol).void }
37
+ def initialize(ground, name); end
38
+
39
+ sig { returns(T::Array[Symbol]) }
40
+ def self.color_names; end
41
+
42
+ sig { returns(String) }
43
+ def self.valid_names; end
44
+ end
45
+
46
+ class RGB < Rainbow::Color::Indexed
47
+ sig { returns(Integer) }
48
+ attr_reader :r, :g, :b
49
+
50
+ sig { params(ground: Symbol, values: Integer).void }
51
+ def initialize(ground, *values); end
52
+
53
+ sig { returns(T::Array[Integer]) }
54
+ def codes; end
55
+
56
+ sig { params(value: Numeric).returns(Integer) }
57
+ def self.to_ansi_domain(value); end
58
+ end
59
+
60
+ class X11Named < Rainbow::Color::RGB
61
+ include Rainbow::X11ColorNames
62
+
63
+ sig { returns(T::Array[Symbol]) }
64
+ def self.color_names; end
65
+
66
+ sig { returns(String) }
67
+ def self.valid_names; end
68
+
69
+ sig { params(ground: Symbol, name: Symbol).void }
70
+ def initialize(ground, name); end
71
+ end
72
+ end
73
+
74
+ sig { returns(Wrapper) }
75
+ def self.global; end
76
+
77
+ sig { returns(T::Boolean) }
78
+ def self.enabled; end
79
+
80
+ sig { params(value: T::Boolean).returns(T::Boolean) }
81
+ def self.enabled=(value); end
82
+
83
+ sig { params(string: String).returns(String) }
84
+ def self.uncolor(string); end
85
+
86
+ class NullPresenter < String
87
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
88
+ def color(*values); end
89
+
90
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
91
+ def foreground(*values); end
92
+
93
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
94
+ def fg(*values); end
95
+
96
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
97
+ def background(*values); end
98
+
99
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
100
+ def bg(*values); end
101
+
102
+ sig { returns(NullPresenter) }
103
+ def reset; end
104
+
105
+ sig { returns(NullPresenter) }
106
+ def bright; end
107
+
108
+ sig { returns(NullPresenter) }
109
+ def faint; end
110
+
111
+ sig { returns(NullPresenter) }
112
+ def italic; end
113
+
114
+ sig { returns(NullPresenter) }
115
+ def underline; end
116
+
117
+ sig { returns(NullPresenter) }
118
+ def blink; end
119
+
120
+ sig { returns(NullPresenter) }
121
+ def inverse; end
122
+
123
+ sig { returns(NullPresenter) }
124
+ def hide; end
125
+
126
+ sig { returns(NullPresenter) }
127
+ def cross_out; end
128
+
129
+ sig { returns(NullPresenter) }
130
+ def black; end
131
+
132
+ sig { returns(NullPresenter) }
133
+ def red; end
134
+
135
+ sig { returns(NullPresenter) }
136
+ def green; end
137
+
138
+ sig { returns(NullPresenter) }
139
+ def yellow; end
140
+
141
+ sig { returns(NullPresenter) }
142
+ def blue; end
143
+
144
+ sig { returns(NullPresenter) }
145
+ def magenta; end
146
+
147
+ sig { returns(NullPresenter) }
148
+ def cyan; end
149
+
150
+ sig { returns(NullPresenter) }
151
+ def white; end
152
+
153
+ sig { returns(NullPresenter) }
154
+ def bold; end
155
+
156
+ sig { returns(NullPresenter) }
157
+ def dark; end
158
+
159
+ sig { returns(NullPresenter) }
160
+ def strike; end
161
+ end
162
+
163
+ class Presenter < String
164
+ TERM_EFFECTS = T.let(nil, T::Hash[Symbol, Integer])
165
+
166
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
167
+ def color(*values); end
168
+
169
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
170
+ def foreground(*values); end
171
+
172
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
173
+ def fg(*values); end
174
+
175
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
176
+ def background(*values); end
177
+
178
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
179
+ def bg(*values); end
180
+
181
+ sig { returns(Presenter) }
182
+ def reset; end
183
+
184
+ sig { returns(Presenter) }
185
+ def bright; end
186
+
187
+ sig { returns(Presenter) }
188
+ def faint; end
189
+
190
+ sig { returns(Presenter) }
191
+ def italic; end
192
+
193
+ sig { returns(Presenter) }
194
+ def underline; end
195
+
196
+ sig { returns(Presenter) }
197
+ def blink; end
198
+
199
+ sig { returns(Presenter) }
200
+ def inverse; end
201
+
202
+ sig { returns(Presenter) }
203
+ def hide; end
204
+
205
+ sig { returns(Presenter) }
206
+ def cross_out; end
207
+
208
+ sig { returns(Presenter) }
209
+ def black; end
210
+
211
+ sig { returns(Presenter) }
212
+ def red; end
213
+
214
+ sig { returns(Presenter) }
215
+ def green; end
216
+
217
+ sig { returns(Presenter) }
218
+ def yellow; end
219
+
220
+ sig { returns(Presenter) }
221
+ def blue; end
222
+
223
+ sig { returns(Presenter) }
224
+ def magenta; end
225
+
226
+ sig { returns(Presenter) }
227
+ def cyan; end
228
+
229
+ sig { returns(Presenter) }
230
+ def white; end
231
+
232
+ sig { returns(Presenter) }
233
+ def bold; end
234
+
235
+ sig { returns(Presenter) }
236
+ def dark; end
237
+
238
+ sig { returns(Presenter) }
239
+ def strike; end
240
+ end
241
+
242
+ class StringUtils
243
+ sig { params(string: String, codes: T::Array[Integer]).returns(String) }
244
+ def self.wrap_with_sgr(string, codes); end
245
+
246
+ sig { params(string: String).returns(String) }
247
+ def self.uncolor(string); end
248
+ end
249
+
250
+ VERSION = T.let(nil, String)
251
+
252
+ class Wrapper
253
+ sig { returns(T::Boolean) }
254
+ attr_accessor :enabled
255
+
256
+ sig { params(enabled: T::Boolean).void }
257
+ def initialize(enabled = true); end
258
+
259
+ sig { params(string: String).returns(T.any(Rainbow::Presenter, Rainbow::NullPresenter)) }
260
+ def wrap(string); end
261
+ end
262
+
263
+ module X11ColorNames
264
+ NAMES = T.let(nil, T::Hash[Symbol, [Integer, Integer, Integer]])
265
+ end
266
+ end
267
+
268
+ sig { params(string: String).returns(Rainbow::Presenter) }
269
+ def Rainbow(string); end
@@ -0,0 +1 @@
1
+ **/*.rbi linguist-generated=true