rbi 0.2.1 → 0.2.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: 68328047c11f18c7617e8101a773a3b3b9438be4e36a0b01072274eba2b1c583
4
- data.tar.gz: 275b2ed35e5486461d2ebf4afae88d7b75b9f26ac1d7d8d9693ff630b17dff3d
3
+ metadata.gz: 7d7b27863b9b9ece5a4cc59fb638a2e51055cd2ca39416e311ea38e9929f124e
4
+ data.tar.gz: 24356f96be5c3381865496aab481214a0cfcbfa423b29eb728691b973a051a5e
5
5
  SHA512:
6
- metadata.gz: 53e510f0df7f4e44c45686774f3573e06031ba7c81a29f7ff429b2dacb601c42a83be37acca12809161ef7acd50722682ad88483b12d4af8d536c6f709e540b8
7
- data.tar.gz: 172bbba7e9c3cd29032d4d34a4fda47ce81728b971a8956d742b0d012ca393b3f555109493ec2ebfe1aa3087a142da109061fc07074f8a4b721096cf1884091d
6
+ metadata.gz: cd47ce37c3cd31e92d24172e08bb9c1a6a0416a3399bb39529788655f0b1138947cd35a9afb85cc0915c2e04989cdd9f1a04b8a2a511dfd64a1ca6ee82701edc
7
+ data.tar.gz: eddda9af791aef98efb957b0017376cdc058a96aff0b39c6716ee5e18809da21b12d4a5b79df1c34c923a0c34383286785de5e160934aff3a93289f756a6dac5
data/Gemfile CHANGED
@@ -10,7 +10,7 @@ group(:development, :test) do
10
10
  gem("minitest")
11
11
  gem("minitest-reporters")
12
12
  gem("rake", "~> 13.2")
13
- gem("rubocop", "~> 1.66", require: false)
13
+ gem("rubocop", "~> 1.69", require: false)
14
14
  gem("rubocop-shopify", require: false)
15
15
  gem("rubocop-sorbet", require: false)
16
16
  gem("sorbet", ">= 0.5.9204", require: false)
data/lib/rbi/formatter.rb CHANGED
@@ -5,9 +5,6 @@ module RBI
5
5
  class Formatter
6
6
  extend T::Sig
7
7
 
8
- sig { params(sort_nodes: T::Boolean).returns(T::Boolean) }
9
- attr_writer :sort_nodes
10
-
11
8
  sig { returns(T.nilable(Integer)) }
12
9
  attr_accessor :max_line_length
13
10
 
data/lib/rbi/model.rb CHANGED
@@ -581,7 +581,7 @@ module RBI
581
581
  is_final: T::Boolean,
582
582
  type_params: T::Array[String],
583
583
  checked: T.nilable(Symbol),
584
- block: T.proc.params(node: Sig).void,
584
+ block: T.nilable(T.proc.params(node: Sig).void),
585
585
  ).void
586
586
  end
587
587
  def add_sig(
@@ -1111,7 +1111,7 @@ module RBI
1111
1111
  attr_accessor :return_type
1112
1112
 
1113
1113
  sig { returns(T::Boolean) }
1114
- attr_accessor :is_abstract, :is_override, :is_overridable, :is_final
1114
+ attr_accessor :is_abstract, :is_override, :is_overridable, :is_final, :allow_incompatible_override
1115
1115
 
1116
1116
  sig { returns(T::Array[String]) }
1117
1117
  attr_reader :type_params
@@ -1127,6 +1127,7 @@ module RBI
1127
1127
  is_override: T::Boolean,
1128
1128
  is_overridable: T::Boolean,
1129
1129
  is_final: T::Boolean,
1130
+ allow_incompatible_override: T::Boolean,
1130
1131
  type_params: T::Array[String],
1131
1132
  checked: T.nilable(Symbol),
1132
1133
  loc: T.nilable(Loc),
@@ -1141,6 +1142,7 @@ module RBI
1141
1142
  is_override: false,
1142
1143
  is_overridable: false,
1143
1144
  is_final: false,
1145
+ allow_incompatible_override: false,
1144
1146
  type_params: [],
1145
1147
  checked: nil,
1146
1148
  loc: nil,
@@ -1154,6 +1156,7 @@ module RBI
1154
1156
  @is_override = is_override
1155
1157
  @is_overridable = is_overridable
1156
1158
  @is_final = is_final
1159
+ @allow_incompatible_override = allow_incompatible_override
1157
1160
  @type_params = type_params
1158
1161
  @checked = checked
1159
1162
  block&.call(self)
data/lib/rbi/parser.rb CHANGED
@@ -858,6 +858,22 @@ module RBI
858
858
  end
859
859
  when "override"
860
860
  @current.is_override = true
861
+
862
+ args = node.arguments&.arguments
863
+
864
+ keywords_hash = args
865
+ &.grep(Prism::KeywordHashNode)
866
+ &.first
867
+
868
+ allow_incompatible_override = keywords_hash
869
+ &.elements
870
+ &.any? do |assoc|
871
+ assoc.is_a?(Prism::AssocNode) &&
872
+ node_string(assoc.key) == "allow_incompatible:" &&
873
+ node_string(assoc.value) == "true"
874
+ end
875
+
876
+ @current.allow_incompatible_override = !!allow_incompatible_override
861
877
  when "overridable"
862
878
  @current.is_overridable = true
863
879
  when "params"
data/lib/rbi/printer.rb CHANGED
@@ -721,7 +721,15 @@ module RBI
721
721
  def sig_modifiers(node)
722
722
  modifiers = T.let([], T::Array[String])
723
723
  modifiers << "abstract" if node.is_abstract
724
- modifiers << "override" if node.is_override
724
+
725
+ if node.is_override
726
+ modifiers << if node.allow_incompatible_override
727
+ "override(allow_incompatible: true)"
728
+ else
729
+ "override"
730
+ end
731
+ end
732
+
725
733
  modifiers << "overridable" if node.is_overridable
726
734
  modifiers << "type_parameters(#{node.type_params.map { |type| ":#{type}" }.join(", ")})" if node.type_params.any?
727
735
  modifiers << "checked(:#{node.checked})" if node.checked
@@ -273,19 +273,24 @@ module RBI
273
273
 
274
274
  sig { params(node: RBI::Attr, sig: Sig).void }
275
275
  def print_attr_sig(node, sig)
276
+ ret_type = sig.return_type
277
+
276
278
  type = case node
277
- when AttrAccessor, AttrReader
278
- parse_type(sig.return_type)
279
+ when AttrReader, AttrAccessor
280
+ parse_type(ret_type).rbs_string
279
281
  else
280
- first_arg = sig.params.first
281
- if first_arg
282
- parse_type(first_arg.type)
282
+ # For attr_writer, Sorbet will prioritize the return type over the argument type in case of mismatch
283
+ arg_type = sig.params.first
284
+ if arg_type && (ret_type.is_a?(Type::Void) || ret_type == "void")
285
+ # If we have an argument type and the return type is void, we prioritize the argument type
286
+ parse_type(arg_type.type).rbs_string
283
287
  else
284
- Type.untyped
288
+ # Otherwise, we prioritize the return type
289
+ parse_type(ret_type).rbs_string
285
290
  end
286
291
  end
287
292
 
288
- print(type.rbs_string)
293
+ print(type)
289
294
  end
290
295
 
291
296
  sig { override.params(node: Method).void }
@@ -298,13 +303,21 @@ module RBI
298
303
  end
299
304
 
300
305
  if node.sigs.any?(&:is_override)
301
- printl("# @override")
306
+ if node.sigs.any?(&:allow_incompatible_override)
307
+ printl("# @override(allow_incompatible: true)")
308
+ else
309
+ printl("# @override")
310
+ end
302
311
  end
303
312
 
304
313
  if node.sigs.any?(&:is_overridable)
305
314
  printl("# @overridable")
306
315
  end
307
316
 
317
+ if node.sigs.any?(&:is_final)
318
+ printl("# @final")
319
+ end
320
+
308
321
  print_loc(node)
309
322
  printt
310
323
  unless in_visibility_group || node.visibility.public?
@@ -349,7 +362,7 @@ module RBI
349
362
  sig { params(node: RBI::Method, sig: Sig).void }
350
363
  def print_method_sig(node, sig)
351
364
  unless sig.type_params.empty?
352
- print("[#{sig.type_params.map { |t| "TYPE_#{t}" }.join(", ")}] ")
365
+ print("[#{sig.type_params.join(", ")}] ")
353
366
  end
354
367
 
355
368
  block_param = node.params.find { |param| param.is_a?(BlockParam) }
@@ -388,9 +401,7 @@ module RBI
388
401
  type_string = "(?) -> untyped"
389
402
  block_is_nilable = true
390
403
  when Type::Simple
391
- if block_type.name == "Proc"
392
- type_string = "(?) -> untyped"
393
- end
404
+ type_string = "(?) -> untyped"
394
405
  skip = true if block_type.name == "NilClass"
395
406
  end
396
407
 
@@ -410,6 +421,24 @@ module RBI
410
421
  print(" # #{loc}") if loc && print_locs
411
422
  end
412
423
 
424
+ sig { params(node: Sig).void }
425
+ def visit_sig(node)
426
+ if node.params
427
+ print("(")
428
+ node.params.each do |param|
429
+ visit(param)
430
+ end
431
+ print(") ")
432
+ end
433
+
434
+ print("-> #{parse_type(node.return_type).rbs_string}")
435
+ end
436
+
437
+ sig { params(node: SigParam).void }
438
+ def visit_sig_param(node)
439
+ print(parse_type(node.type).rbs_string)
440
+ end
441
+
413
442
  sig { override.params(node: ReqParam).void }
414
443
  def visit_req_param(node)
415
444
  print("untyped #{node.name}")
@@ -770,17 +799,10 @@ module RBI
770
799
  return unless node.name == :let
771
800
  return unless node.receiver&.slice =~ /^(::)?T$/
772
801
 
773
- node.arguments&.arguments&.fetch(1, nil)&.slice
774
- end
775
-
776
- sig { params(node: Type).returns(T::Boolean) }
777
- def bare_proc?(node)
778
- node.is_a?(Type::Simple) && node.name == "Proc"
779
- end
802
+ arguments = node.arguments&.arguments
803
+ return unless arguments
780
804
 
781
- sig { params(node: Type).returns(T::Boolean) }
782
- def bare_nilable_proc?(node)
783
- node.is_a?(Type::Nilable) && bare_proc?(node.type)
805
+ arguments.fetch(1, nil)&.slice
784
806
  end
785
807
  end
786
808
 
@@ -841,7 +863,7 @@ module RBI
841
863
 
842
864
  sig { params(type: Type::Simple).void }
843
865
  def visit_simple(type)
844
- @string << translate_t_type(type.name)
866
+ @string << translate_t_type(type.name.gsub(/\s/, ""))
845
867
  end
846
868
 
847
869
  sig { params(type: Type::Boolean).void }
@@ -851,7 +873,7 @@ module RBI
851
873
 
852
874
  sig { params(type: Type::Generic).void }
853
875
  def visit_generic(type)
854
- @string << translate_t_type(type.name)
876
+ @string << translate_t_type(type.name.gsub(/\s/, ""))
855
877
  @string << "["
856
878
  type.params.each_with_index do |arg, index|
857
879
  visit(arg)
@@ -887,12 +909,19 @@ module RBI
887
909
 
888
910
  sig { params(type: Type::AttachedClass).void }
889
911
  def visit_attached_class(type)
890
- @string << "attached_class"
912
+ @string << "instance"
891
913
  end
892
914
 
893
915
  sig { params(type: Type::Nilable).void }
894
916
  def visit_nilable(type)
895
- visit(type.type)
917
+ inner = type.type
918
+ if inner.is_a?(Type::Proc)
919
+ @string << "("
920
+ end
921
+ visit(inner)
922
+ if inner.is_a?(Type::Proc)
923
+ @string << ")"
924
+ end
896
925
  @string << "?"
897
926
  end
898
927
 
@@ -937,7 +966,16 @@ module RBI
937
966
  def visit_shape(type)
938
967
  @string << "{"
939
968
  type.types.each_with_index do |(key, value), index|
940
- @string << "#{key}: "
969
+ @string << case key
970
+ when String
971
+ "\"#{key}\" => "
972
+ when Symbol
973
+ if key.match?(/\A[a-zA-Z_]+[a-zA-Z0-9_]*\z/)
974
+ "#{key}: "
975
+ else
976
+ "\"#{key}\": "
977
+ end
978
+ end
941
979
  visit(value)
942
980
  @string << ", " if index < type.types.size - 1
943
981
  end
@@ -956,20 +994,26 @@ module RBI
956
994
  end
957
995
  @string << ") "
958
996
  end
997
+ proc_bind = type.proc_bind
998
+ if proc_bind
999
+ @string << "[self: "
1000
+ visit(proc_bind)
1001
+ @string << "] "
1002
+ end
959
1003
  @string << "-> "
960
1004
  visit(type.proc_returns)
961
1005
  end
962
1006
 
963
1007
  sig { params(type: Type::TypeParameter).void }
964
1008
  def visit_type_parameter(type)
965
- @string << "TYPE_#{type.name}"
1009
+ @string << type.name.to_s
966
1010
  end
967
1011
 
968
1012
  sig { params(type: Type::Class).void }
969
1013
  def visit_class(type)
970
- @string << "singleton("
1014
+ @string << "Class["
971
1015
  visit(type.type)
972
- @string << ")"
1016
+ @string << "]"
973
1017
  end
974
1018
 
975
1019
  private
data/lib/rbi/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module RBI
5
- VERSION = "0.2.1"
5
+ VERSION = "0.2.3"
6
6
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexandre Terrasa
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-10-03 00:00:00.000000000 Z
10
+ date: 2025-01-15 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: prism
@@ -38,7 +37,6 @@ dependencies:
38
37
  - - ">="
39
38
  - !ruby/object:Gem::Version
40
39
  version: 0.5.9204
41
- description:
42
40
  email:
43
41
  - ruby@shopify.com
44
42
  executables: []
@@ -80,7 +78,6 @@ licenses:
80
78
  - MIT
81
79
  metadata:
82
80
  allowed_push_host: https://rubygems.org
83
- post_install_message:
84
81
  rdoc_options: []
85
82
  require_paths:
86
83
  - lib
@@ -95,8 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
95
92
  - !ruby/object:Gem::Version
96
93
  version: '0'
97
94
  requirements: []
98
- rubygems_version: 3.5.20
99
- signing_key:
95
+ rubygems_version: 3.6.2
100
96
  specification_version: 4
101
97
  summary: RBI generation framework
102
98
  test_files: []