steep 0.48.0 → 0.49.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 72c3b61eccfe6a3f2cf2da22293bd7b50a001c25e82197b3efea52753857ff78
4
- data.tar.gz: '08786e3140b0bbf10f79c5395a7026062abef6a690a9fefdf6ca464fbf13e92d'
3
+ metadata.gz: '0273968ec727f3b7c5c1007f9e27966c50ad7bc3128217a4ef30be4f97321037'
4
+ data.tar.gz: 195eb670673894e36af5e00ef911654f2a543c71e8de1d46c15e23035bef19c8
5
5
  SHA512:
6
- metadata.gz: d3abc0d6f64deffebf187428be69cec72dc5c887e0ecb2fbc407c20e2dde66bae8ce3bdf5f7f8a43ccaa90c562fa9c178bb9cc93a3d3d5b7fa99d5e7344fbfdd
7
- data.tar.gz: df16f83cf33224f0442124546d3406313dff27bd472fc60978864c40cdffcbb9aa8013bb049c940021ccb6e76c7a1338d9d30fc0fb07f71e306e7dae21885ad7
6
+ metadata.gz: '0908edc4a3221256f450c9fd945d7127bd9ece3fa0359b7da88be8cebea30f7c766e023b84527e89e8f0c7956752310a3b0e98343b8c4808bfde518a89284456'
7
+ data.tar.gz: 4004adb0d0e8f2e0cd2629cd7e0c2bd6513a3a48bbd96d1d77621bbe0979b73686ab9c8ad718e3243081fdf492ff9728b5bf6df8e7357e1b1cf810393dad264c
data/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 0.49.0 (2022-03-08)
6
+
7
+ * Better typing for `#flat_map` ([\#504](https://github.com/soutaro/steep/pull/504))
8
+ * Support lambdas (`->`) with block ([\#503](https://github.com/soutaro/steep/pull/503))
9
+ * Let proc type be `::Proc` class instance ([\#502](https://github.com/soutaro/steep/pull/502))
10
+ * Disable contextual typing on `bool` type ([\#501](https://github.com/soutaro/steep/pull/501))
11
+ * Type check `return` without value ([\#500](https://github.com/soutaro/steep/pull/500))
12
+
5
13
  ## 0.48.0 (2022-03-07)
6
14
 
7
15
  Steep supports all of the new features of RBS 2. 🎉
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- steep (0.48.0)
4
+ steep (0.49.0)
5
5
  activesupport (>= 5.1)
6
6
  language_server-protocol (>= 3.15, < 4.0)
7
7
  listen (~> 3.0)
@@ -28,6 +28,8 @@ module Steep
28
28
 
29
29
  include Helper::NoFreeVariables
30
30
 
31
+ include Helper::NoChild
32
+
31
33
  def level
32
34
  [1]
33
35
  end
@@ -28,6 +28,8 @@ module Steep
28
28
 
29
29
  include Helper::NoFreeVariables
30
30
 
31
+ include Helper::NoChild
32
+
31
33
  def level
32
34
  [0]
33
35
  end
@@ -28,6 +28,8 @@ module Steep
28
28
 
29
29
  include Helper::NoFreeVariables
30
30
 
31
+ include Helper::NoChild
32
+
31
33
  def level
32
34
  [2]
33
35
  end
@@ -30,6 +30,8 @@ module Steep
30
30
  @fvs = Set.new([self])
31
31
  end
32
32
 
33
+ include Helper::NoChild
34
+
33
35
  def level
34
36
  [0]
35
37
  end
@@ -393,7 +393,7 @@ module Steep
393
393
  when AST::Types::Name::Alias
394
394
  unwrap_optional(expand_alias(type))
395
395
  when AST::Types::Boolean
396
- [AST::Builtin.true_type, AST::Builtin.false_type]
396
+ [type, type]
397
397
  else
398
398
  [type, nil]
399
399
  end
@@ -21,6 +21,14 @@ module Steep
21
21
  @fvs ||= Set.new
22
22
  end
23
23
  end
24
+
25
+ module NoChild
26
+ def each_child(&block)
27
+ unless block
28
+ enum_for :each_child
29
+ end
30
+ end
31
+ end
24
32
  end
25
33
  end
26
34
  end
@@ -26,6 +26,8 @@ module Steep
26
26
  @fvs = Set.new([self])
27
27
  end
28
28
 
29
+ include Helper::NoChild
30
+
29
31
  def to_s
30
32
  "instance"
31
33
  end
@@ -72,6 +72,10 @@ module Steep
72
72
 
73
73
  include Helper::ChildrenLevel
74
74
 
75
+ def each_child(&block)
76
+ types.each(&block)
77
+ end
78
+
75
79
  def level
76
80
  [0] + level_of_children(types)
77
81
  end
@@ -31,6 +31,8 @@ module Steep
31
31
 
32
32
  include Helper::NoFreeVariables
33
33
 
34
+ include Helper::NoChild
35
+
34
36
  def level
35
37
  [0]
36
38
  end
@@ -13,6 +13,8 @@ module Steep
13
13
  @fvs ||= Set[]
14
14
  end
15
15
 
16
+ include Helper::NoChild
17
+
16
18
  def hash
17
19
  self.class.hash
18
20
  end
@@ -72,6 +72,10 @@ module Steep
72
72
  end
73
73
  end
74
74
 
75
+ def each_child(&block)
76
+ args.each(&block)
77
+ end
78
+
75
79
  include Helper::ChildrenLevel
76
80
 
77
81
  def level
@@ -98,6 +102,8 @@ module Steep
98
102
  def with_location(new_location)
99
103
  self.class.new(name: name, location: new_location)
100
104
  end
105
+
106
+ include Helper::NoChild
101
107
  end
102
108
 
103
109
  class Instance < Applying
@@ -28,6 +28,8 @@ module Steep
28
28
 
29
29
  include Helper::NoFreeVariables
30
30
 
31
+ include Helper::NoChild
32
+
31
33
  def level
32
34
  [0]
33
35
  end
@@ -90,6 +90,15 @@ module Steep
90
90
  def block_required?
91
91
  block && !block.optional?
92
92
  end
93
+
94
+ def each_child(&block)
95
+ if block_given?
96
+ type.each_child(&block)
97
+ self.block&.type&.each_child(&block)
98
+ else
99
+ enum_for :each_child
100
+ end
101
+ end
93
102
  end
94
103
  end
95
104
  end
@@ -42,6 +42,10 @@ module Steep
42
42
 
43
43
  include Helper::ChildrenLevel
44
44
 
45
+ def each_child(&block)
46
+ elements.each_value(&block)
47
+ end
48
+
45
49
  def level
46
50
  [0] + level_of_children(elements.values)
47
51
  end
@@ -22,6 +22,8 @@ module Steep
22
22
  "self"
23
23
  end
24
24
 
25
+ include Helper::NoChild
26
+
25
27
  def subst(s)
26
28
  s.self_type or raise "Unexpected substitution: #{inspect}"
27
29
  end
@@ -28,6 +28,8 @@ module Steep
28
28
 
29
29
  include Helper::NoFreeVariables
30
30
 
31
+ include Helper::NoChild
32
+
31
33
  def level
32
34
  [2]
33
35
  end
@@ -40,6 +40,10 @@ module Steep
40
40
 
41
41
  include Helper::ChildrenLevel
42
42
 
43
+ def each_child(&block)
44
+ types.each(&block)
45
+ end
46
+
43
47
  def level
44
48
  [0] + level_of_children(types)
45
49
  end
@@ -70,6 +70,10 @@ module Steep
70
70
  end
71
71
  end
72
72
 
73
+ def each_child(&block)
74
+ types.each(&block)
75
+ end
76
+
73
77
  include Helper::ChildrenLevel
74
78
 
75
79
  def level
@@ -52,6 +52,8 @@ module Steep
52
52
  @fvs ||= Set.new([name])
53
53
  end
54
54
 
55
+ include Helper::NoChild
56
+
55
57
  def level
56
58
  [0]
57
59
  end
@@ -28,6 +28,8 @@ module Steep
28
28
 
29
29
  include Helper::NoFreeVariables
30
30
 
31
+ include Helper::NoChild
32
+
31
33
  def level
32
34
  [0]
33
35
  end
@@ -952,6 +952,10 @@ module Steep
952
952
  )
953
953
  end
954
954
 
955
+ def each_child(&block)
956
+ each_type(&block)
957
+ end
958
+
955
959
  def each_type(&block)
956
960
  if block_given?
957
961
  params.each_type(&block)
@@ -347,7 +347,7 @@ module Steep
347
347
 
348
348
  when relation.super_type.is_a?(AST::Types::Union)
349
349
  Any(relation) do |result|
350
- relation.super_type.types.each do |super_type|
350
+ relation.super_type.types.sort_by {|ty| (path = hole_path(ty)) ? -path.size : 1 }.each do |super_type|
351
351
  rel = Relation.new(sub_type: relation.sub_type, super_type: super_type)
352
352
  result.add(rel) do
353
353
  check_type(rel)
@@ -357,7 +357,7 @@ module Steep
357
357
 
358
358
  when relation.sub_type.is_a?(AST::Types::Intersection)
359
359
  Any(relation) do |result|
360
- relation.sub_type.types.each do |sub_type|
360
+ relation.sub_type.types.sort_by {|ty| (path = hole_path(ty)) ? -path.size : 1 }.each do |sub_type|
361
361
  rel = Relation.new(sub_type: sub_type, super_type: relation.super_type)
362
362
  result.add(rel) do
363
363
  check_type(rel)
@@ -483,6 +483,9 @@ module Steep
483
483
  check_interface(relation.map {|type| factory.interface(type, private: false) })
484
484
  end
485
485
 
486
+ when relation.sub_type.is_a?(AST::Types::Proc) && AST::Builtin::Proc.instance_type?(relation.super_type)
487
+ Success(relation)
488
+
486
489
  when relation.super_type.is_a?(AST::Types::Literal)
487
490
  case
488
491
  when relation.super_type.value == true && AST::Builtin::TrueClass.instance_type?(relation.sub_type)
@@ -971,6 +974,24 @@ module Steep
971
974
  def expand_alias(type, &block)
972
975
  factory.expand_alias(type, &block)
973
976
  end
977
+
978
+ # Returns the shortest type paths for one of the _unknown_ type variables.
979
+ # Returns nil if there is no path.
980
+ def hole_path(type, path = [])
981
+ case type
982
+ when AST::Types::Var
983
+ if constraints.unknown?(type.name)
984
+ [type]
985
+ else
986
+ nil
987
+ end
988
+ else
989
+ paths = type.each_child.map do |ty|
990
+ hole_path(ty, path)&.unshift(ty)
991
+ end
992
+ paths.compact.min_by(&:size)
993
+ end
994
+ end
974
995
  end
975
996
  end
976
997
  end
@@ -1005,7 +1005,7 @@ module Steep
1005
1005
  yield_self do
1006
1006
  send_node, params, body = node.children
1007
1007
  if send_node.type == :lambda
1008
- type_lambda(node, block_params: params, block_body: body, type_hint: hint)
1008
+ type_lambda(node, params_node: params, body_node: body, type_hint: hint)
1009
1009
  else
1010
1010
  type_send(node, send_node: send_node, block_params: params, block_body: body, unwrap: send_node.type == :csend)
1011
1011
  end
@@ -1024,7 +1024,7 @@ module Steep
1024
1024
  params = Parser::AST::Node.new(:args, arg_nodes)
1025
1025
 
1026
1026
  if send_node.type == :lambda
1027
- type_lambda(node, block_params: params, block_body: body, type_hint: hint)
1027
+ type_lambda(node, params_node: params, body_node: body, type_hint: hint)
1028
1028
  else
1029
1029
  type_send(node, send_node: send_node, block_params: params, block_body: body, unwrap: send_node.type == :csend)
1030
1030
  end
@@ -1181,9 +1181,9 @@ module Steep
1181
1181
 
1182
1182
  when :return
1183
1183
  yield_self do
1184
- if node.children.size > 0
1185
- method_return_type = expand_alias(method_context&.return_type)
1184
+ method_return_type = expand_alias(method_context&.return_type)
1186
1185
 
1186
+ if node.children.size > 0
1187
1187
  return_types = node.children.map do |value|
1188
1188
  synthesize(
1189
1189
  value,
@@ -1201,20 +1201,23 @@ module Steep
1201
1201
  AST::Builtin::Array.instance_type(union_type(*return_types))
1202
1202
  end
1203
1203
 
1204
- if method_return_type
1205
- unless method_return_type.is_a?(AST::Types::Void)
1206
- result = check_relation(sub_type: value_type, super_type: method_return_type)
1204
+ else
1205
+ value_type = AST::Builtin.nil_type
1206
+ end
1207
1207
 
1208
- if result.failure?
1209
- typing.add_error(
1210
- Diagnostic::Ruby::ReturnTypeMismatch.new(
1211
- node: node,
1212
- expected: method_context&.return_type,
1213
- actual: value_type,
1214
- result: result
1215
- )
1208
+ if method_return_type
1209
+ unless method_return_type.is_a?(AST::Types::Void)
1210
+ result = check_relation(sub_type: value_type, super_type: method_return_type)
1211
+
1212
+ if result.failure?
1213
+ typing.add_error(
1214
+ Diagnostic::Ruby::ReturnTypeMismatch.new(
1215
+ node: node,
1216
+ expected: method_context&.return_type,
1217
+ actual: value_type,
1218
+ result: result
1216
1219
  )
1217
- end
1220
+ )
1218
1221
  end
1219
1222
  end
1220
1223
  end
@@ -2724,20 +2727,22 @@ module Steep
2724
2727
  end
2725
2728
  end
2726
2729
 
2727
- def type_lambda(node, block_params:, block_body:, type_hint:)
2730
+ def type_lambda(node, params_node:, body_node:, type_hint:)
2728
2731
  block_annotations = source.annotations(block: node, factory: checker.factory, current_module: current_namespace)
2729
- params = TypeInference::BlockParams.from_node(block_params, annotations: block_annotations)
2732
+ params = TypeInference::BlockParams.from_node(params_node, annotations: block_annotations)
2730
2733
 
2731
2734
  case type_hint
2732
2735
  when AST::Types::Proc
2733
2736
  params_hint = type_hint.type.params
2734
2737
  return_hint = type_hint.type.return_type
2738
+ block_hint = type_hint.block
2735
2739
  end
2736
2740
 
2737
2741
  block_constr = for_block(
2738
2742
  block_params: params,
2739
2743
  block_param_hint: params_hint,
2740
2744
  block_type_hint: return_hint,
2745
+ block_block_hint: block_hint,
2741
2746
  block_annotations: block_annotations,
2742
2747
  node_type_hint: nil
2743
2748
  )
@@ -2748,10 +2753,30 @@ module Steep
2748
2753
  _, block_constr = block_constr.synthesize(param.node, hint: param.type)
2749
2754
  end
2750
2755
 
2751
- if block_body
2756
+ block =
2757
+ if block_param = params.block_param
2758
+ if block_param_type = block_param.type
2759
+ case block_param_type
2760
+ when AST::Types::Proc
2761
+ Interface::Block.new(type: block_param_type.type, optional: false)
2762
+ when AST::Types::Union
2763
+ if block_param_type.types.size == 2
2764
+ if block_param_type.types.find {|t| t.is_a?(AST::Types::Nil) }
2765
+ if proc_type = block_param_type.types.find {|t| t.is_a?(AST::Types::Proc) }
2766
+ Interface::Block.new(type: proc_type.type, optional: true)
2767
+ end
2768
+ end
2769
+ end
2770
+ end
2771
+ else
2772
+ type_hint.block
2773
+ end
2774
+ end
2775
+
2776
+ if body_node
2752
2777
  return_type = block_constr.synthesize_block(
2753
2778
  node: node,
2754
- block_body: block_body,
2779
+ block_body: body_node,
2755
2780
  block_type_hint: return_hint
2756
2781
  )
2757
2782
 
@@ -2779,7 +2804,7 @@ module Steep
2779
2804
  return_type: return_type,
2780
2805
  location: nil
2781
2806
  ),
2782
- block: nil
2807
+ block: block
2783
2808
  )
2784
2809
 
2785
2810
  add_typing node, type: block_type
@@ -3246,7 +3271,7 @@ module Steep
3246
3271
 
3247
3272
  if method_type.block
3248
3273
  # Method accepts block
3249
- pairs = method_type.block && block_params_&.zip(method_type.block.type.params)
3274
+ pairs = method_type.block && block_params_&.zip(method_type.block.type.params, nil)
3250
3275
 
3251
3276
  if pairs
3252
3277
  # Block parameters are compatible with the block type
@@ -3254,6 +3279,7 @@ module Steep
3254
3279
  block_params: block_params_,
3255
3280
  block_param_hint: method_type.block.type.params,
3256
3281
  block_type_hint: method_type.block.type.return_type,
3282
+ block_block_hint: nil,
3257
3283
  block_annotations: block_annotations,
3258
3284
  node_type_hint: method_type.type.return_type
3259
3285
  )
@@ -3503,13 +3529,14 @@ module Steep
3503
3529
  message: "Unsupported block params pattern, probably masgn?"
3504
3530
  )
3505
3531
  )
3506
- block_params = TypeInference::BlockParams.new(leading_params: [], optional_params: [], rest_param: nil, trailing_params: [])
3532
+ block_params = TypeInference::BlockParams.new(leading_params: [], optional_params: [], rest_param: nil, trailing_params: [], block_param: nil)
3507
3533
  end
3508
3534
 
3509
3535
  block_constr = for_block(
3510
3536
  block_params: block_params,
3511
3537
  block_param_hint: nil,
3512
3538
  block_type_hint: AST::Builtin.any_type,
3539
+ block_block_hint: nil,
3513
3540
  block_annotations: block_annotations,
3514
3541
  node_type_hint: AST::Builtin.any_type
3515
3542
  )
@@ -3536,8 +3563,8 @@ module Steep
3536
3563
  end
3537
3564
  end
3538
3565
 
3539
- def for_block(block_params:, block_param_hint:, block_type_hint:, block_annotations:, node_type_hint:)
3540
- block_param_pairs = block_param_hint && block_params.zip(block_param_hint)
3566
+ def for_block(block_params:, block_param_hint:, block_type_hint:, block_block_hint:, block_annotations:, node_type_hint:)
3567
+ block_param_pairs = block_param_hint && block_params.zip(block_param_hint, block_block_hint)
3541
3568
 
3542
3569
  param_types_hash = {}
3543
3570
  if block_param_pairs
@@ -29,12 +29,14 @@ module Steep
29
29
  attr_reader :optional_params
30
30
  attr_reader :rest_param
31
31
  attr_reader :trailing_params
32
+ attr_reader :block_param
32
33
 
33
- def initialize(leading_params:, optional_params:, rest_param:, trailing_params:)
34
+ def initialize(leading_params:, optional_params:, rest_param:, trailing_params:, block_param:)
34
35
  @leading_params = leading_params
35
36
  @optional_params = optional_params
36
37
  @rest_param = rest_param
37
38
  @trailing_params = trailing_params
39
+ @block_param = block_param
38
40
  end
39
41
 
40
42
  def params
@@ -43,6 +45,7 @@ module Steep
43
45
  params.push(*optional_params)
44
46
  params.push rest_param if rest_param
45
47
  params.push(*trailing_params)
48
+ params.push(block_param) if block_param
46
49
  end
47
50
  end
48
51
 
@@ -51,6 +54,7 @@ module Steep
51
54
  optional_params = []
52
55
  rest_param = nil
53
56
  trailing_params = []
57
+ block_param = nil
54
58
 
55
59
  default_params = leading_params
56
60
 
@@ -72,6 +76,9 @@ module Steep
72
76
  when :restarg
73
77
  default_params = trailing_params
74
78
  rest_param = Param.new(var: var, type: type, value: nil, node: arg)
79
+ when :blockarg
80
+ block_param = Param.new(var: var, type: type, value: nil, node: arg)
81
+ break
75
82
  end
76
83
  end
77
84
 
@@ -79,7 +86,8 @@ module Steep
79
86
  leading_params: leading_params,
80
87
  optional_params: optional_params,
81
88
  rest_param: rest_param,
82
- trailing_params: trailing_params
89
+ trailing_params: trailing_params,
90
+ block_param: block_param
83
91
  )
84
92
  end
85
93
 
@@ -141,7 +149,7 @@ module Steep
141
149
  )
142
150
  end
143
151
 
144
- def zip(params_type)
152
+ def zip(params_type, block)
145
153
  if trailing_params.any?
146
154
  Steep.logger.error "Block definition with trailing required parameters are not supported yet"
147
155
  end
@@ -204,6 +212,26 @@ module Steep
204
212
  end
205
213
  end
206
214
  end
215
+
216
+ if block_param
217
+ if block
218
+ proc_type =
219
+ if block.optional?
220
+ AST::Types::Union.build(
221
+ types: [
222
+ AST::Types::Proc.new(type: block.type, block: nil),
223
+ AST::Builtin.nil_type
224
+ ]
225
+ )
226
+ else
227
+ AST::Types::Proc.new(type: block.type, block: nil)
228
+ end
229
+
230
+ zip << [block_param, proc_type]
231
+ else
232
+ zip << [block_param, AST::Builtin.nil_type]
233
+ end
234
+ end
207
235
  end
208
236
  end
209
237
 
data/lib/steep/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Steep
2
- VERSION = "0.48.0"
2
+ VERSION = "0.49.0"
3
3
  end
data/smoke/tsort/a.rb CHANGED
@@ -8,5 +8,5 @@ each_node = -> (&b) { g.each_key(&b) }
8
8
  # @type var each_child: ^(Integer) { (Integer) -> void } -> void
9
9
  each_child = -> (n, &b) { g[n].each(&b) }
10
10
 
11
- # @type var xs: Array[String]
11
+ # @type var xs: Array[Integer]
12
12
  xs = TSort.tsort(each_node, each_child)
@@ -1,63 +1 @@
1
- ---
2
- - file: a.rb
3
- diagnostics:
4
- - range:
5
- start:
6
- line: 7
7
- character: 0
8
- end:
9
- line: 7
10
- character: 38
11
- severity: ERROR
12
- message: |-
13
- Cannot assign a value of type `^() -> ::Hash[::Integer, ::Array[::Integer]]` to a variable of type `^() { (::Integer) -> void } -> void`
14
- ^() -> ::Hash[::Integer, ::Array[::Integer]] <: ^() { (::Integer) -> void } -> void
15
- code: Ruby::IncompatibleAssignment
16
- - range:
17
- start:
18
- line: 7
19
- character: 34
20
- end:
21
- line: 7
22
- character: 35
23
- severity: ERROR
24
- message: Cannot detect the type of the expression
25
- code: Ruby::FallbackAny
26
- - range:
27
- start:
28
- line: 9
29
- character: 0
30
- end:
31
- line: 9
32
- character: 41
33
- severity: ERROR
34
- message: |-
35
- Cannot assign a value of type `^(::Integer) -> ::Enumerator[::Integer, ::Array[::Integer]]` to a variable of type `^(::Integer) { (::Integer) -> void } -> void`
36
- ^(::Integer) -> ::Enumerator[::Integer, ::Array[::Integer]] <: ^(::Integer) { (::Integer) -> void } -> void
37
- code: Ruby::IncompatibleAssignment
38
- - range:
39
- start:
40
- line: 9
41
- character: 37
42
- end:
43
- line: 9
44
- character: 38
45
- severity: ERROR
46
- message: Cannot detect the type of the expression
47
- code: Ruby::FallbackAny
48
- - range:
49
- start:
50
- line: 12
51
- character: 0
52
- end:
53
- line: 12
54
- character: 39
55
- severity: ERROR
56
- message: |-
57
- Cannot assign a value of type `::Array[::Integer]` to a variable of type `::Array[::String]`
58
- ::Array[::Integer] <: ::Array[::String]
59
- ::Integer <: ::String
60
- ::Numeric <: ::String
61
- ::Object <: ::String
62
- ::BasicObject <: ::String
63
- code: Ruby::IncompatibleAssignment
1
+ --- []
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: steep
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.48.0
4
+ version: 0.49.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Soutaro Matsumoto
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-03-07 00:00:00.000000000 Z
11
+ date: 2022-03-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parser