rbs_activerecord 1.1.1 → 1.1.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e0ea3c8187e852192d22a16567b163eb0247b233d60503bee24527acbdc3a2cd
4
- data.tar.gz: 73925718cdda63a38c982df326c6e34245f72a1bf7960415921ffb2105de6b66
3
+ metadata.gz: 360079f3b724dfbd462397ed0b1143c80a80269176d4cf61485ac5fc71cfd1c4
4
+ data.tar.gz: 7d847840f3086d25d4aca0e0dac0801d2ae5e40cbb84b7625c17d668236da823
5
5
  SHA512:
6
- metadata.gz: d420a8c6d38af18a3928713eccd59403703cee04c7692a8c042eb381866af371b830501cecdca8a40e21797f620ae24d83428d3c86bd3b32954319b8c85fc9c3
7
- data.tar.gz: 361fc238a0c34c0721f0ee12f54e1aa8a5a0d95aca361cbdb06e9e21220c1c15c36058b80c0c2a6c5e16aa76c2402d31eae6ce6a5a223a7f3747af2241b8e9ea
6
+ metadata.gz: 7d715eb69739edbc2102cdbaedc4e34b7164fc4a3445641c4ca72050e9b8c47db7ede124156f4c777728e6bca52be61e0e41f896770c0f2a2e9b3fb099cd131a
7
+ data.tar.gz: 518abeac5686ce46e0a8faac94249b4723111a2008e642645c0cef0869b451317c29d69aa61cb5542f673b52ca3baf340a49341ee50cb0b1dce703a3f27f49e3
@@ -8,6 +8,11 @@
8
8
  "activerecord",
9
9
  "codebases",
10
10
  "Cyclomatic",
11
- "kaminari"
11
+ "kaminari",
12
+ "mkpath",
13
+ "modname",
14
+ "requireds",
15
+ "rmtree",
16
+ "tasklib"
12
17
  ]
13
18
  }
data/Steepfile CHANGED
@@ -1,9 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # D = Steep::Diagnostic
3
+ D = Steep::Diagnostic
4
4
 
5
5
  target :lib do
6
6
  signature "sig"
7
7
 
8
8
  check "lib"
9
+
10
+ configure_code_diagnostics(D::Ruby.strict)
11
+ implicitly_returns_nil!
9
12
  end
@@ -22,8 +22,8 @@ module RbsActiverecord
22
22
  values = args[1].keys
23
23
  options = args[2] || {}
24
24
  else
25
- values = []
26
- options = {}
25
+ values = [] #: Array[String | Symbol]
26
+ options = {} #: Hash[Symbol, untyped]
27
27
  end
28
28
 
29
29
  [name, values, options]
@@ -4,6 +4,8 @@ module RbsActiverecord
4
4
  class Generator
5
5
  module Enum
6
6
  class InstanceMethods < Base
7
+ include Utils
8
+
7
9
  attr_reader :model #: RbsActiverecord::Model
8
10
  attr_reader :declarations #: Array[Prism::CallNode]
9
11
 
@@ -37,13 +39,31 @@ module RbsActiverecord
37
39
  return "" unless name
38
40
  return "" unless options.fetch(:instance_methods, true)
39
41
 
40
- values.map do |value|
42
+ type = column_type(name)
43
+ name_methods = <<~RBS
44
+ def #{name}: () -> String
45
+ def #{name}=: (String) -> String
46
+ | (#{type}) -> #{type}
47
+ RBS
48
+ value_methods = values.map do |value|
41
49
  method_name = enum_method_name(name, value, options)
42
50
  <<~RBS
43
51
  def #{method_name}!: () -> void
44
52
  def #{method_name}?: () -> bool
45
53
  RBS
46
54
  end.join("\n")
55
+
56
+ name_methods + value_methods
57
+ end
58
+
59
+ # @rbs name: String
60
+ def column_type(name) #: String
61
+ col = model.columns.find { |c| c.name == name.to_s }
62
+ if col
63
+ sql_type_to_class(col.type)
64
+ else
65
+ "::Integer"
66
+ end
47
67
  end
48
68
  end
49
69
  end
@@ -7,10 +7,10 @@ module RbsActiverecord
7
7
  attr_reader :declarations #: Array[Prism::CallNode]
8
8
 
9
9
  # @rbs model: RbsActiverecord::Model
10
- # @rbs delarations: Hash[String, Array[Prism::CallNode]]
10
+ # @rbs declarations: Hash[String, Array[Prism::CallNode]]
11
11
  def initialize(model, declarations) #: void
12
12
  @model = model
13
- @declarations = declarations.fetch(model.klass.name, [])
13
+ @declarations = declarations.fetch(model.klass.name.to_s, [])
14
14
  end
15
15
 
16
16
  def generate #: String
@@ -28,7 +28,7 @@ module RbsActiverecord
28
28
  end
29
29
 
30
30
  # @rbs node: Prism::CallNode
31
- def scope(node) #: String # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
31
+ def scope(node) #: String
32
32
  args = node.arguments&.arguments
33
33
  return "" unless args
34
34
 
@@ -40,7 +40,7 @@ module RbsActiverecord
40
40
  params = lambda_params(body)
41
41
  "def #{name.value}: (#{params}) -> Relation"
42
42
  when Prism::CallNode
43
- if (body.name == :lambda || body.name == :proc) && body.block
43
+ if %i[lambda proc].include?(body.name) && body.block
44
44
  block = body.block #: Prism::BlockNode
45
45
  params = lambda_params(block)
46
46
  "def #{name.value}: (#{params}) -> Relation"
@@ -25,7 +25,7 @@ module RbsActiverecord
25
25
  index = decls.index { |node| node.name == :include }
26
26
  break unless index
27
27
 
28
- included_module = decls.delete_at(index)
28
+ included_module = decls.delete_at(index) || raise
29
29
  included_blocks = included_blocks_for(included_module)
30
30
  included_blocks.reverse_each do |included|
31
31
  decls.insert(index, *block_body_of(included))
@@ -40,7 +40,7 @@ module RbsActiverecord
40
40
  # @rbs override
41
41
  def visit_call_node(node)
42
42
  decls[current_namespace] ||= []
43
- decls[current_namespace] << node
43
+ decls.fetch(current_namespace) << node
44
44
  end
45
45
 
46
46
  # @rbs override
@@ -49,7 +49,6 @@ module RbsActiverecord
49
49
  next unless klass.connection.table_exists?(klass.table_name)
50
50
 
51
51
  rbs = Generator.new(klass).generate
52
- next unless rbs
53
52
 
54
53
  path = signature_root_dir / "app/models/#{klass.name.underscore}.rbs"
55
54
  path.dirname.mkpath
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RbsActiverecord
4
- VERSION = "1.1.1"
4
+ VERSION = "1.1.3"
5
5
  end
@@ -6,7 +6,7 @@ gems:
6
6
  source:
7
7
  type: git
8
8
  name: ruby/gem_rbs_collection
9
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
9
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
10
10
  remote: https://github.com/ruby/gem_rbs_collection.git
11
11
  repo_dir: gems
12
12
  - name: actionview
@@ -14,7 +14,7 @@ gems:
14
14
  source:
15
15
  type: git
16
16
  name: ruby/gem_rbs_collection
17
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
17
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
18
18
  remote: https://github.com/ruby/gem_rbs_collection.git
19
19
  repo_dir: gems
20
20
  - name: activejob
@@ -22,15 +22,15 @@ gems:
22
22
  source:
23
23
  type: git
24
24
  name: ruby/gem_rbs_collection
25
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
25
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
26
26
  remote: https://github.com/ruby/gem_rbs_collection.git
27
27
  repo_dir: gems
28
28
  - name: activemodel
29
- version: '7.0'
29
+ version: '7.1'
30
30
  source:
31
31
  type: git
32
32
  name: ruby/gem_rbs_collection
33
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
33
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
34
34
  remote: https://github.com/ruby/gem_rbs_collection.git
35
35
  repo_dir: gems
36
36
  - name: activerecord
@@ -38,7 +38,7 @@ gems:
38
38
  source:
39
39
  type: git
40
40
  name: ruby/gem_rbs_collection
41
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
41
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
42
42
  remote: https://github.com/ruby/gem_rbs_collection.git
43
43
  repo_dir: gems
44
44
  - name: activestorage
@@ -46,7 +46,7 @@ gems:
46
46
  source:
47
47
  type: git
48
48
  name: ruby/gem_rbs_collection
49
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
49
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
50
50
  remote: https://github.com/ruby/gem_rbs_collection.git
51
51
  repo_dir: gems
52
52
  - name: activesupport
@@ -54,7 +54,7 @@ gems:
54
54
  source:
55
55
  type: git
56
56
  name: ruby/gem_rbs_collection
57
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
57
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
58
58
  remote: https://github.com/ruby/gem_rbs_collection.git
59
59
  repo_dir: gems
60
60
  - name: ast
@@ -62,19 +62,23 @@ gems:
62
62
  source:
63
63
  type: git
64
64
  name: ruby/gem_rbs_collection
65
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
65
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
66
66
  remote: https://github.com/ruby/gem_rbs_collection.git
67
67
  repo_dir: gems
68
68
  - name: base64
69
- version: '0'
69
+ version: '0.1'
70
70
  source:
71
- type: stdlib
71
+ type: git
72
+ name: ruby/gem_rbs_collection
73
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
74
+ remote: https://github.com/ruby/gem_rbs_collection.git
75
+ repo_dir: gems
72
76
  - name: bcrypt
73
77
  version: '3.1'
74
78
  source:
75
79
  type: git
76
80
  name: ruby/gem_rbs_collection
77
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
81
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
78
82
  remote: https://github.com/ruby/gem_rbs_collection.git
79
83
  repo_dir: gems
80
84
  - name: benchmark
@@ -82,9 +86,13 @@ gems:
82
86
  source:
83
87
  type: stdlib
84
88
  - name: bigdecimal
85
- version: '0'
89
+ version: '3.1'
86
90
  source:
87
- type: stdlib
91
+ type: git
92
+ name: ruby/gem_rbs_collection
93
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
94
+ remote: https://github.com/ruby/gem_rbs_collection.git
95
+ repo_dir: gems
88
96
  - name: cgi
89
97
  version: '0'
90
98
  source:
@@ -94,7 +102,7 @@ gems:
94
102
  source:
95
103
  type: git
96
104
  name: ruby/gem_rbs_collection
97
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
105
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
98
106
  remote: https://github.com/ruby/gem_rbs_collection.git
99
107
  repo_dir: gems
100
108
  - name: connection_pool
@@ -102,7 +110,7 @@ gems:
102
110
  source:
103
111
  type: git
104
112
  name: ruby/gem_rbs_collection
105
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
113
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
106
114
  remote: https://github.com/ruby/gem_rbs_collection.git
107
115
  repo_dir: gems
108
116
  - name: date
@@ -113,6 +121,10 @@ gems:
113
121
  version: '0'
114
122
  source:
115
123
  type: stdlib
124
+ - name: digest
125
+ version: '0'
126
+ source:
127
+ type: stdlib
116
128
  - name: erb
117
129
  version: '0'
118
130
  source:
@@ -130,7 +142,7 @@ gems:
130
142
  source:
131
143
  type: git
132
144
  name: ruby/gem_rbs_collection
133
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
145
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
134
146
  remote: https://github.com/ruby/gem_rbs_collection.git
135
147
  repo_dir: gems
136
148
  - name: i18n
@@ -138,7 +150,7 @@ gems:
138
150
  source:
139
151
  type: git
140
152
  name: ruby/gem_rbs_collection
141
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
153
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
142
154
  remote: https://github.com/ruby/gem_rbs_collection.git
143
155
  repo_dir: gems
144
156
  - name: io-console
@@ -158,7 +170,7 @@ gems:
158
170
  source:
159
171
  type: git
160
172
  name: ruby/gem_rbs_collection
161
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
173
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
162
174
  remote: https://github.com/ruby/gem_rbs_collection.git
163
175
  repo_dir: gems
164
176
  - name: minitest
@@ -178,7 +190,7 @@ gems:
178
190
  source:
179
191
  type: git
180
192
  name: ruby/gem_rbs_collection
181
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
193
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
182
194
  remote: https://github.com/ruby/gem_rbs_collection.git
183
195
  repo_dir: gems
184
196
  - name: openssl
@@ -194,7 +206,7 @@ gems:
194
206
  source:
195
207
  type: git
196
208
  name: ruby/gem_rbs_collection
197
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
209
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
198
210
  remote: https://github.com/ruby/gem_rbs_collection.git
199
211
  repo_dir: gems
200
212
  - name: parser
@@ -202,7 +214,7 @@ gems:
202
214
  source:
203
215
  type: git
204
216
  name: ruby/gem_rbs_collection
205
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
217
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
206
218
  remote: https://github.com/ruby/gem_rbs_collection.git
207
219
  repo_dir: gems
208
220
  - name: pathname
@@ -210,7 +222,7 @@ gems:
210
222
  source:
211
223
  type: stdlib
212
224
  - name: prism
213
- version: 1.0.0
225
+ version: 1.2.0
214
226
  source:
215
227
  type: rubygems
216
228
  - name: rack
@@ -218,7 +230,7 @@ gems:
218
230
  source:
219
231
  type: git
220
232
  name: ruby/gem_rbs_collection
221
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
233
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
222
234
  remote: https://github.com/ruby/gem_rbs_collection.git
223
235
  repo_dir: gems
224
236
  - name: rails-dom-testing
@@ -226,7 +238,7 @@ gems:
226
238
  source:
227
239
  type: git
228
240
  name: ruby/gem_rbs_collection
229
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
241
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
230
242
  remote: https://github.com/ruby/gem_rbs_collection.git
231
243
  repo_dir: gems
232
244
  - name: rails-html-sanitizer
@@ -234,7 +246,7 @@ gems:
234
246
  source:
235
247
  type: git
236
248
  name: ruby/gem_rbs_collection
237
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
249
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
238
250
  remote: https://github.com/ruby/gem_rbs_collection.git
239
251
  repo_dir: gems
240
252
  - name: railties
@@ -242,7 +254,7 @@ gems:
242
254
  source:
243
255
  type: git
244
256
  name: ruby/gem_rbs_collection
245
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
257
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
246
258
  remote: https://github.com/ruby/gem_rbs_collection.git
247
259
  repo_dir: gems
248
260
  - name: rainbow
@@ -250,7 +262,7 @@ gems:
250
262
  source:
251
263
  type: git
252
264
  name: ruby/gem_rbs_collection
253
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
265
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
254
266
  remote: https://github.com/ruby/gem_rbs_collection.git
255
267
  repo_dir: gems
256
268
  - name: rake
@@ -258,11 +270,11 @@ gems:
258
270
  source:
259
271
  type: git
260
272
  name: ruby/gem_rbs_collection
261
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
273
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
262
274
  remote: https://github.com/ruby/gem_rbs_collection.git
263
275
  repo_dir: gems
264
276
  - name: rbs
265
- version: 3.6.1
277
+ version: 3.8.1
266
278
  source:
267
279
  type: rubygems
268
280
  - name: rdoc
@@ -274,7 +286,7 @@ gems:
274
286
  source:
275
287
  type: git
276
288
  name: ruby/gem_rbs_collection
277
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
289
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
278
290
  remote: https://github.com/ruby/gem_rbs_collection.git
279
291
  repo_dir: gems
280
292
  - name: rubocop
@@ -282,7 +294,7 @@ gems:
282
294
  source:
283
295
  type: git
284
296
  name: ruby/gem_rbs_collection
285
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
297
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
286
298
  remote: https://github.com/ruby/gem_rbs_collection.git
287
299
  repo_dir: gems
288
300
  - name: rubocop-ast
@@ -290,7 +302,7 @@ gems:
290
302
  source:
291
303
  type: git
292
304
  name: ruby/gem_rbs_collection
293
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
305
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
294
306
  remote: https://github.com/ruby/gem_rbs_collection.git
295
307
  repo_dir: gems
296
308
  - name: securerandom
@@ -310,9 +322,13 @@ gems:
310
322
  source:
311
323
  type: git
312
324
  name: ruby/gem_rbs_collection
313
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
325
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
314
326
  remote: https://github.com/ruby/gem_rbs_collection.git
315
327
  repo_dir: gems
328
+ - name: stringio
329
+ version: '0'
330
+ source:
331
+ type: stdlib
316
332
  - name: tempfile
317
333
  version: '0'
318
334
  source:
@@ -322,7 +338,7 @@ gems:
322
338
  source:
323
339
  type: git
324
340
  name: ruby/gem_rbs_collection
325
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
341
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
326
342
  remote: https://github.com/ruby/gem_rbs_collection.git
327
343
  repo_dir: gems
328
344
  - name: time
@@ -342,7 +358,7 @@ gems:
342
358
  source:
343
359
  type: git
344
360
  name: ruby/gem_rbs_collection
345
- revision: 5fcf7d45b7c430a651c5996280d9991c781fcf14
361
+ revision: 95d9b83e2727af43d6dea2ffb9e9d2d350425fe9
346
362
  remote: https://github.com/ruby/gem_rbs_collection.git
347
363
  repo_dir: gems
348
364
  - name: uri
@@ -4,6 +4,8 @@ module RbsActiverecord
4
4
  class Generator
5
5
  module Enum
6
6
  class InstanceMethods < Base
7
+ include Utils
8
+
7
9
  attr_reader model: RbsActiverecord::Model
8
10
 
9
11
  attr_reader declarations: Array[Prism::CallNode]
@@ -20,6 +22,9 @@ module RbsActiverecord
20
22
 
21
23
  # @rbs node: Prism::CallNode
22
24
  def enum: (Prism::CallNode node) -> String
25
+
26
+ # @rbs name: String
27
+ def column_type: (String name) -> String
23
28
  end
24
29
  end
25
30
  end
@@ -8,8 +8,8 @@ module RbsActiverecord
8
8
  attr_reader declarations: Array[Prism::CallNode]
9
9
 
10
10
  # @rbs model: RbsActiverecord::Model
11
- # @rbs delarations: Hash[String, Array[Prism::CallNode]]
12
- def initialize: (RbsActiverecord::Model model, untyped declarations) -> void
11
+ # @rbs declarations: Hash[String, Array[Prism::CallNode]]
12
+ def initialize: (RbsActiverecord::Model model, Hash[String, Array[Prism::CallNode]] declarations) -> void
13
13
 
14
14
  def generate: () -> String
15
15
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbs_activerecord
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Takeshi KOMIYA
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-11-24 00:00:00.000000000 Z
11
+ date: 2025-03-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -126,7 +126,7 @@ metadata:
126
126
  homepage_uri: https://github.com/tk0miya/rbs_activerecord
127
127
  source_code_uri: https://github.com/tk0miya/rbs_activerecord
128
128
  changelog_uri: https://github.com/tk0miya/rbs_activerecord
129
- post_install_message:
129
+ post_install_message:
130
130
  rdoc_options: []
131
131
  require_paths:
132
132
  - lib
@@ -142,7 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
142
  version: '0'
143
143
  requirements: []
144
144
  rubygems_version: 3.5.22
145
- signing_key:
145
+ signing_key:
146
146
  specification_version: 4
147
147
  summary: A RBS files generator for activerecord gem
148
148
  test_files: []