@@ -73,19 +73,19 @@ class Student
73
73
include FrozenRecordAttributeMethods
74
74
75
75
module FrozenRecordAttributeMethods
76
- sig { returns(String ) }
76
+ sig { returns(T::untyped ) }
77
77
def first_name; end
78
78
79
79
sig { returns(T::Boolean) }
80
80
def first_name?; end
81
81
82
- sig { returns(Integer ) }
82
+ sig { returns(T::untyped ) }
83
83
def id; end
84
84
85
85
sig { returns(T::Boolean) }
86
86
def id?; end
87
87
88
- sig { returns(String ) }
88
+ sig { returns(T::untyped ) }
89
89
def last_name; end
90
90
91
91
sig { returns(T::Boolean) }
@@ -101,11 +101,63 @@ def last_name?; end
101
101
add_ruby_file ( "student.rb" , <<~RUBY )
102
102
# typed: strong
103
103
104
+ class ArrayOfType < ActiveModel::Type::Value
105
+ attr_reader :element_type
106
+
107
+ def initialize(element_type:)
108
+ super()
109
+ @element_type = element_type
110
+ end
111
+
112
+ def type
113
+ :array
114
+ end
115
+ end
116
+
117
+ class HashOfType < ActiveModel::Type::Value
118
+ attr_reader :key_type
119
+ attr_reader :value_type
120
+
121
+ def initialize(key_type:, value_type:)
122
+ super()
123
+ @key_type = key_type
124
+ @value_type = value_type
125
+ end
126
+
127
+ def type
128
+ :hash
129
+ end
130
+ end
131
+
132
+ class SymbolType < ActiveModel::Type::Value
133
+ def type
134
+ :symbol
135
+ end
136
+ end
137
+
138
+ ActiveModel::Type.register(:array_of_type, ArrayOfType)
139
+ ActiveModel::Type.register(:hash_of_type, HashOfType)
140
+ ActiveModel::Type.register(:symbol, SymbolType)
141
+
104
142
class Student < FrozenRecord::Base
105
- extend(T::Sig)
143
+ extend T::Sig
144
+ include ActiveModel::Attributes
145
+
146
+ # specifically missing the id field, should be untyped
147
+ attribute :first_name, :string
148
+ attribute :last_name, :string
149
+ attribute :age, :integer
150
+ attribute :location, :string
151
+ attribute :is_cool_person, :boolean
152
+ attribute :birth_date, :date
153
+ attribute :updated_at, :time
154
+ # custom attribute types
155
+ attribute :favourite_foods, :array_of_type, element_type: :string
156
+ attribute :skills, :hash_of_type, key_type: :symbol, value_type: :string
157
+ # attribute with a default, shouldn't be nilable
158
+ attribute :shirt_size, :symbol
106
159
107
160
self.base_path = __dir__
108
-
109
161
self.default_attributes = { shirt_size: :large }
110
162
111
163
sig { params(grain: Symbol).returns(String) }
@@ -161,67 +213,67 @@ class Student
161
213
include FrozenRecordAttributeMethods
162
214
163
215
module FrozenRecordAttributeMethods
164
- sig { returns(Integer) }
216
+ sig { returns(T.nilable(:: Integer) ) }
165
217
def age; end
166
218
167
219
sig { returns(T::Boolean) }
168
220
def age?; end
169
221
170
- sig { returns(Date) }
222
+ sig { returns(T.nilable(:: Date) ) }
171
223
def birth_date; end
172
224
173
225
sig { returns(T::Boolean) }
174
226
def birth_date?; end
175
227
176
- sig { returns(Array) }
228
+ sig { returns(T.nilable(:: Array) ) }
177
229
def favourite_foods; end
178
230
179
231
sig { returns(T::Boolean) }
180
232
def favourite_foods?; end
181
233
182
- sig { returns(String) }
234
+ sig { returns(T.nilable(:: String) ) }
183
235
def first_name; end
184
236
185
237
sig { returns(T::Boolean) }
186
238
def first_name?; end
187
239
188
- sig { returns(Integer ) }
240
+ sig { returns(T.untyped ) }
189
241
def id; end
190
242
191
243
sig { returns(T::Boolean) }
192
244
def id?; end
193
245
194
- sig { returns(T::Boolean) }
246
+ sig { returns(T.nilable(T ::Boolean) ) }
195
247
def is_cool_person; end
196
248
197
249
sig { returns(T::Boolean) }
198
250
def is_cool_person?; end
199
251
200
- sig { returns(String) }
252
+ sig { returns(T.nilable(:: String) ) }
201
253
def last_name; end
202
254
203
255
sig { returns(T::Boolean) }
204
256
def last_name?; end
205
257
206
- sig { returns(String) }
258
+ sig { returns(T.nilable(:: String) ) }
207
259
def location; end
208
260
209
261
sig { returns(T::Boolean) }
210
262
def location?; end
211
263
212
- sig { returns(Symbol) }
264
+ sig { returns(:: Symbol) }
213
265
def shirt_size; end
214
266
215
267
sig { returns(T::Boolean) }
216
268
def shirt_size?; end
217
269
218
- sig { returns(Hash) }
270
+ sig { returns(T.nilable(:: Hash) ) }
219
271
def skills; end
220
272
221
273
sig { returns(T::Boolean) }
222
274
def skills?; end
223
275
224
- sig { returns(Time ) }
276
+ sig { returns(T.nilable(::DateTime) ) }
225
277
def updated_at; end
226
278
227
279
sig { returns(T::Boolean) }
@@ -257,13 +309,13 @@ class Student
257
309
extend GeneratedRelationMethods
258
310
259
311
module FrozenRecordAttributeMethods
260
- sig { returns(String ) }
312
+ sig { returns(T::untyped ) }
261
313
def course; end
262
314
263
315
sig { returns(T::Boolean) }
264
316
def course?; end
265
317
266
- sig { returns(Integer ) }
318
+ sig { returns(T::untyped ) }
267
319
def id; end
268
320
269
321
sig { returns(T::Boolean) }
0 commit comments