rbs_rails 0.12.0 → 0.12.1
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 +4 -4
- data/.github/workflows/ci.yml +1 -1
- data/CHANGELOG.md +8 -0
- data/Gemfile +3 -3
- data/Gemfile.lock +179 -124
- data/README.md +1 -0
- data/Steepfile +5 -0
- data/lib/generators/rbs_rails/install_generator.rb +16 -12
- data/lib/rbs_rails/active_record.rb +51 -43
- data/lib/rbs_rails/dependency_builder.rb +5 -1
- data/lib/rbs_rails/rake_task.rb +7 -7
- data/lib/rbs_rails/util.rb +7 -12
- data/lib/rbs_rails/version.rb +1 -1
- data/rbs_collection.lock.yaml +228 -48
- data/rbs_collection.yaml +0 -2
- data/rbs_rails.gemspec +1 -1
- data/sig/rbs_rails/active_record.rbs +7 -3
- data/sig/rbs_rails/dependency_builder.rbs +4 -0
- data/sig/rbs_rails/rake_task.rbs +1 -1
- data/sig/rbs_rails/util.rbs +1 -1
- metadata +4 -9
- data/sig/_internal/fileutils.rbs +0 -4
- data/sig/_internal/thor.rbs +0 -5
@@ -17,9 +17,9 @@ module RbsRails
|
|
17
17
|
def initialize(klass, dependencies:)
|
18
18
|
@klass = klass
|
19
19
|
@dependencies = dependencies
|
20
|
-
@klass_name = Util.module_name(klass)
|
20
|
+
@klass_name = Util.module_name(klass, abs: false)
|
21
21
|
|
22
|
-
namespaces = klass_name.split('::').tap{ |names| names.pop }
|
22
|
+
namespaces = klass_name(abs: false).split('::').tap{ |names| names.pop }
|
23
23
|
@dependencies << namespaces.join('::') unless namespaces.empty?
|
24
24
|
end
|
25
25
|
|
@@ -30,7 +30,7 @@ module RbsRails
|
|
30
30
|
private def klass_decl
|
31
31
|
<<~RBS
|
32
32
|
#{header}
|
33
|
-
extend _ActiveRecord_Relation_ClassMethods[#{klass_name}, #{relation_class_name}, #{pk_type}]
|
33
|
+
extend ::_ActiveRecord_Relation_ClassMethods[#{klass_name}, #{relation_class_name}, #{pk_type}]
|
34
34
|
|
35
35
|
#{columns}
|
36
36
|
#{associations}
|
@@ -62,7 +62,7 @@ module RbsRails
|
|
62
62
|
|
63
63
|
private def generated_relation_methods_decl
|
64
64
|
<<~RBS
|
65
|
-
module
|
65
|
+
module #{generated_relation_methods_name(abs: false)}
|
66
66
|
#{enum_scope_methods(singleton: false)}
|
67
67
|
#{scopes(singleton: false)}
|
68
68
|
#{delegated_type_scope(singleton: false)}
|
@@ -72,10 +72,10 @@ module RbsRails
|
|
72
72
|
|
73
73
|
private def relation_decl
|
74
74
|
<<~RBS
|
75
|
-
class #{relation_class_name} < ::ActiveRecord::Relation
|
76
|
-
include
|
77
|
-
include _ActiveRecord_Relation[#{klass_name}, #{pk_type}]
|
78
|
-
include Enumerable[#{klass_name}]
|
75
|
+
class #{relation_class_name(abs: false)} < ::ActiveRecord::Relation
|
76
|
+
include #{generated_relation_methods_name}
|
77
|
+
include ::_ActiveRecord_Relation[#{klass_name}, #{pk_type}]
|
78
|
+
include ::Enumerable[#{klass_name}]
|
79
79
|
end
|
80
80
|
RBS
|
81
81
|
end
|
@@ -83,22 +83,22 @@ module RbsRails
|
|
83
83
|
private def collection_proxy_decl
|
84
84
|
<<~RBS
|
85
85
|
class ActiveRecord_Associations_CollectionProxy < ::ActiveRecord::Associations::CollectionProxy
|
86
|
-
include
|
87
|
-
include _ActiveRecord_Relation[#{klass_name}, #{pk_type}]
|
86
|
+
include #{generated_relation_methods_name}
|
87
|
+
include ::_ActiveRecord_Relation[#{klass_name}, #{pk_type}]
|
88
88
|
end
|
89
89
|
RBS
|
90
90
|
end
|
91
91
|
|
92
92
|
private def header
|
93
93
|
namespace = +''
|
94
|
-
klass_name.split('::').map do |mod_name|
|
94
|
+
klass_name(abs: false).split('::').map do |mod_name|
|
95
95
|
namespace += "::#{mod_name}"
|
96
96
|
mod_object = Object.const_get(namespace)
|
97
97
|
case mod_object
|
98
98
|
when Class
|
99
99
|
# @type var superclass: Class
|
100
100
|
superclass = _ = mod_object.superclass
|
101
|
-
superclass_name = Util.module_name(superclass)
|
101
|
+
superclass_name = Util.module_name(superclass, abs: false)
|
102
102
|
@dependencies << superclass_name
|
103
103
|
|
104
104
|
"class #{mod_name} < ::#{superclass_name}"
|
@@ -111,7 +111,7 @@ module RbsRails
|
|
111
111
|
end
|
112
112
|
|
113
113
|
private def footer
|
114
|
-
"end\n" * klass_name.split('::').size
|
114
|
+
"end\n" * klass_name(abs: false).split('::').size
|
115
115
|
end
|
116
116
|
|
117
117
|
private def associations
|
@@ -133,9 +133,9 @@ module RbsRails
|
|
133
133
|
|
134
134
|
<<~RUBY.chomp
|
135
135
|
def #{a.name}: () -> #{collection_type}
|
136
|
-
def #{a.name}=: (#{collection_type} | Array[#{type}]) -> (#{collection_type} | Array[#{type}])
|
137
|
-
def #{singular_name}_ids: () -> Array[Integer]
|
138
|
-
def #{singular_name}_ids=: (Array[Integer]) -> Array[Integer]
|
136
|
+
def #{a.name}=: (#{collection_type} | ::Array[#{type}]) -> (#{collection_type} | ::Array[#{type}])
|
137
|
+
def #{singular_name}_ids: () -> ::Array[::Integer]
|
138
|
+
def #{singular_name}_ids=: (::Array[::Integer]) -> ::Array[::Integer]
|
139
139
|
RUBY
|
140
140
|
end.join("\n")
|
141
141
|
end
|
@@ -149,7 +149,7 @@ module RbsRails
|
|
149
149
|
<<~RUBY.chomp
|
150
150
|
def #{a.name}: () -> #{type_optional}
|
151
151
|
def #{a.name}=: (#{type_optional}) -> #{type_optional}
|
152
|
-
def build_#{a.name}: (untyped) -> #{type}
|
152
|
+
def build_#{a.name}: (?untyped) -> #{type}
|
153
153
|
def create_#{a.name}: (untyped) -> #{type}
|
154
154
|
def create_#{a.name}!: (untyped) -> #{type}
|
155
155
|
def reload_#{a.name}: () -> #{type_optional}
|
@@ -190,21 +190,21 @@ module RbsRails
|
|
190
190
|
case reflection.macro
|
191
191
|
when :has_one_attached
|
192
192
|
<<~EOS
|
193
|
-
def #{name}: () -> ActiveStorage::Attached::One
|
194
|
-
def #{name}=: (ActionDispatch::Http::UploadedFile) -> ActionDispatch::Http::UploadedFile
|
195
|
-
| (Rack::Test::UploadedFile) -> Rack::Test::UploadedFile
|
196
|
-
| (ActiveStorage::Blob) -> ActiveStorage::Blob
|
197
|
-
| (String) -> String
|
198
|
-
| ({ io: IO, filename: String, content_type: String? }) -> { io: IO, filename: String, content_type: String? }
|
193
|
+
def #{name}: () -> ::ActiveStorage::Attached::One
|
194
|
+
def #{name}=: (::ActionDispatch::Http::UploadedFile) -> ::ActionDispatch::Http::UploadedFile
|
195
|
+
| (::Rack::Test::UploadedFile) -> ::Rack::Test::UploadedFile
|
196
|
+
| (::ActiveStorage::Blob) -> ::ActiveStorage::Blob
|
197
|
+
| (::String) -> ::String
|
198
|
+
| ({ io: ::IO, filename: ::String, content_type: ::String? }) -> { io: ::IO, filename: ::String, content_type: ::String? }
|
199
199
|
| (nil) -> nil
|
200
200
|
EOS
|
201
201
|
when :has_many_attached
|
202
202
|
<<~EOS
|
203
|
-
def #{name}: () -> ActiveStorage::Attached::Many
|
203
|
+
def #{name}: () -> ::ActiveStorage::Attached::Many
|
204
204
|
def #{name}=: (untyped) -> untyped
|
205
205
|
EOS
|
206
206
|
else
|
207
|
-
raise
|
207
|
+
raise "unknown macro: #{reflection.macro}"
|
208
208
|
end
|
209
209
|
end.join("\n")
|
210
210
|
sigs << "end"
|
@@ -460,7 +460,7 @@ module RbsRails
|
|
460
460
|
private def parse_model_file
|
461
461
|
return @parse_model_file if defined?(@parse_model_file)
|
462
462
|
|
463
|
-
path = Rails.root.join('app/models/', klass_name.underscore + '.rb')
|
463
|
+
path = Rails.root.join('app/models/', klass_name(abs: false).underscore + '.rb')
|
464
464
|
return @parse_model_file = nil unless path.exist?
|
465
465
|
return [] unless path.exist?
|
466
466
|
|
@@ -471,24 +471,32 @@ module RbsRails
|
|
471
471
|
end
|
472
472
|
|
473
473
|
private def traverse(node, &block)
|
474
|
-
return to_enum(__method__ || raise, node) unless
|
474
|
+
return to_enum(__method__ || raise, node) unless block
|
475
475
|
|
476
|
-
# @type var block: ^(Parser::AST::Node) -> untyped
|
477
476
|
block.call node
|
478
477
|
node.children.each do |child|
|
479
478
|
traverse(child, &block) if child.is_a?(Parser::AST::Node)
|
480
479
|
end
|
481
480
|
end
|
482
481
|
|
483
|
-
private def relation_class_name
|
484
|
-
"ActiveRecord_Relation"
|
482
|
+
private def relation_class_name(abs: true)
|
483
|
+
abs ? "#{klass_name}::ActiveRecord_Relation" : "ActiveRecord_Relation"
|
485
484
|
end
|
486
485
|
|
486
|
+
private def klass_name(abs: true)
|
487
|
+
abs ? "::#{@klass_name}" : @klass_name
|
488
|
+
end
|
489
|
+
|
490
|
+
private def generated_relation_methods_name(abs: true)
|
491
|
+
abs ? "#{klass_name}::GeneratedRelationMethods" : "GeneratedRelationMethods"
|
492
|
+
end
|
493
|
+
|
494
|
+
|
487
495
|
private def columns
|
488
496
|
mod_sig = +"module GeneratedAttributeMethods\n"
|
489
497
|
mod_sig << klass.columns.map do |col|
|
490
498
|
class_name = if enum_definitions.any? { |hash| hash.key?(col.name) || hash.key?(col.name.to_sym) }
|
491
|
-
'String'
|
499
|
+
'::String'
|
492
500
|
else
|
493
501
|
sql_type_to_class(col.type)
|
494
502
|
end
|
@@ -503,12 +511,12 @@ module RbsRails
|
|
503
511
|
def #{col.name}_will_change!: () -> void
|
504
512
|
def #{col.name}_was: () -> #{class_name_opt}
|
505
513
|
def #{col.name}_previously_changed?: () -> bool
|
506
|
-
def #{col.name}_previous_change: () -> Array[#{class_name_opt}]?
|
514
|
+
def #{col.name}_previous_change: () -> ::Array[#{class_name_opt}]?
|
507
515
|
def #{col.name}_previously_was: () -> #{class_name_opt}
|
508
516
|
def #{col.name}_before_last_save: () -> #{class_name_opt}
|
509
|
-
def #{col.name}_change_to_be_saved: () -> Array[#{class_name_opt}]?
|
517
|
+
def #{col.name}_change_to_be_saved: () -> ::Array[#{class_name_opt}]?
|
510
518
|
def #{col.name}_in_database: () -> #{class_name_opt}
|
511
|
-
def saved_change_to_#{col.name}: () -> Array[#{class_name_opt}]?
|
519
|
+
def saved_change_to_#{col.name}: () -> ::Array[#{class_name_opt}]?
|
512
520
|
def saved_change_to_#{col.name}?: () -> bool
|
513
521
|
def will_save_change_to_#{col.name}?: () -> bool
|
514
522
|
def restore_#{col.name}!: () -> void
|
@@ -529,25 +537,25 @@ module RbsRails
|
|
529
537
|
private def sql_type_to_class(t)
|
530
538
|
case t
|
531
539
|
when :integer
|
532
|
-
'Integer'
|
540
|
+
'::Integer'
|
533
541
|
when :float
|
534
|
-
'Float'
|
542
|
+
'::Float'
|
535
543
|
when :decimal
|
536
|
-
'BigDecimal'
|
544
|
+
'::BigDecimal'
|
537
545
|
when :string, :text, :citext, :uuid, :binary
|
538
|
-
'String'
|
546
|
+
'::String'
|
539
547
|
when :datetime
|
540
|
-
'ActiveSupport::TimeWithZone'
|
548
|
+
'::ActiveSupport::TimeWithZone'
|
541
549
|
when :boolean
|
542
550
|
"bool"
|
543
551
|
when :jsonb, :json
|
544
552
|
"untyped"
|
545
553
|
when :date
|
546
|
-
'Date'
|
554
|
+
'::Date'
|
547
555
|
when :time
|
548
|
-
'Time'
|
556
|
+
'::Time'
|
549
557
|
when :inet
|
550
|
-
"IPAddr"
|
558
|
+
"::IPAddr"
|
551
559
|
else
|
552
560
|
# Unknown column type, give up
|
553
561
|
'untyped'
|
@@ -555,7 +563,7 @@ module RbsRails
|
|
555
563
|
end
|
556
564
|
|
557
565
|
private
|
558
|
-
attr_reader :klass
|
566
|
+
attr_reader :klass
|
559
567
|
end
|
560
568
|
end
|
561
569
|
end
|
@@ -10,7 +10,7 @@ module RbsRails
|
|
10
10
|
def build
|
11
11
|
dep_rbs = +""
|
12
12
|
deps.uniq!
|
13
|
-
while dep =
|
13
|
+
while dep = shift
|
14
14
|
next unless done.add?(dep)
|
15
15
|
|
16
16
|
case dep_object = Object.const_get(dep)
|
@@ -39,5 +39,9 @@ module RbsRails
|
|
39
39
|
Util.format_rbs(dep_rbs)
|
40
40
|
end
|
41
41
|
end
|
42
|
+
|
43
|
+
private def shift
|
44
|
+
deps.shift&.sub(/^::/, '')
|
45
|
+
end
|
42
46
|
end
|
43
47
|
end
|
data/lib/rbs_rails/rake_task.rb
CHANGED
@@ -3,17 +3,17 @@ require 'rake/tasklib'
|
|
3
3
|
|
4
4
|
module RbsRails
|
5
5
|
class RakeTask < Rake::TaskLib
|
6
|
-
attr_accessor :ignore_model_if, :name
|
6
|
+
attr_accessor :ignore_model_if, :name
|
7
|
+
attr_writer :signature_root_dir
|
7
8
|
|
8
9
|
def initialize(name = :rbs_rails, &block)
|
9
10
|
super()
|
10
11
|
|
11
12
|
@name = name
|
13
|
+
@signature_root_dir = Rails.root / 'sig/rbs_rails'
|
12
14
|
|
13
15
|
block.call(self) if block
|
14
16
|
|
15
|
-
setup_signature_root_dir!
|
16
|
-
|
17
17
|
def_generate_rbs_for_models
|
18
18
|
def_generate_rbs_for_path_helpers
|
19
19
|
def_all
|
@@ -64,10 +64,10 @@ module RbsRails
|
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
|
-
private def
|
68
|
-
@signature_root_dir
|
69
|
-
|
70
|
-
|
67
|
+
private def signature_root_dir
|
68
|
+
Pathname(@signature_root_dir).tap do |dir|
|
69
|
+
dir.mkpath
|
70
|
+
end
|
71
71
|
end
|
72
72
|
end
|
73
73
|
end
|
data/lib/rbs_rails/util.rb
CHANGED
@@ -4,26 +4,21 @@ module RbsRails
|
|
4
4
|
|
5
5
|
extend self
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
end
|
12
|
-
else
|
13
|
-
def module_name(mod)
|
14
|
-
MODULE_NAME.bind(mod).call
|
15
|
-
end
|
7
|
+
def module_name(mod, abs: true)
|
8
|
+
name = MODULE_NAME.bind_call(mod)
|
9
|
+
name ="::#{name}" if abs
|
10
|
+
name
|
16
11
|
end
|
17
12
|
|
18
13
|
def format_rbs(rbs)
|
19
14
|
decls =
|
20
15
|
if Gem::Version.new('3') <= Gem::Version.new(RBS::VERSION)
|
21
|
-
# TODO: Remove this type annotation when rbs_rails depends on RBS v3
|
22
|
-
# @type var parsed: [RBS::Buffer, untyped, RBS::Declarations::t]
|
23
16
|
parsed = _ = RBS::Parser.parse_signature(rbs)
|
24
17
|
parsed[1] + parsed[2]
|
25
18
|
else
|
26
|
-
RBS
|
19
|
+
# TODO: Remove this type annotation when rbs_rails drops support of RBS 2.x.
|
20
|
+
# @type var parsed: [RBS::Declarations::t]
|
21
|
+
parsed = _ = RBS::Parser.parse_signature(rbs)
|
27
22
|
end
|
28
23
|
|
29
24
|
StringIO.new.tap do |io|
|
data/lib/rbs_rails/version.rb
CHANGED