rbs_rails 0.8.2 → 0.9.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 +4 -4
- data/.dependabot/config.yml +0 -3
- data/.github/workflows/ci.yml +1 -3
- data/.gitignore +1 -1
- data/CHANGELOG.md +16 -0
- data/Gemfile +5 -2
- data/Gemfile.lock +148 -30
- data/README.md +5 -3
- data/Rakefile +4 -2
- data/Steepfile +1 -17
- data/bin/setup +1 -1
- data/lib/rbs_rails/active_record.rb +107 -17
- data/lib/rbs_rails/version.rb +1 -1
- data/rbs_collection.lock.yaml +132 -0
- data/rbs_collection.yaml +45 -0
- data/sig/rbs_rails/active_record.rbs +8 -0
- metadata +5 -5
- data/bin/gem_rbs +0 -94
- data/bin/rbs +0 -30
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ccb7076ac91a406f491cf3e6c4d8499525f860660061ff23809635d000d1aba3
|
|
4
|
+
data.tar.gz: a863d9e16999e7491cef930b8fb79515c538ad7d83b919abad762a5c1290e370
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 10dccf3356c898258d6c13aaed04d61a5f137787f9ea696fe0d7005e2063c2fd130d9fdda59c4c7b4fa58d1cde84a3ca0cf750dac28f1ac9ffbfe94ead90da57
|
|
7
|
+
data.tar.gz: b8f5c227bf58bdb16044867cd4abd883f21782817eda8fa6d85d1956418c763829748d5d0ee0e81e1005ffd18e022d6da6e83b64aa97cf4f77fe6942bacec48b
|
data/.dependabot/config.yml
CHANGED
data/.github/workflows/ci.yml
CHANGED
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
## master (unreleased)
|
|
4
4
|
|
|
5
|
+
## 0.9.0 (2021-09-18)
|
|
6
|
+
|
|
7
|
+
### New Features
|
|
8
|
+
|
|
9
|
+
* Support delegated_type association. [#181](https://github.com/pocke/rbs_rails/pull/181)
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* Fix error on a table that doesn't have the PK. [#121](https://github.com/pocke/rbs_rails/pull/121)
|
|
14
|
+
* Quote variable names to avoid syntax errors. [#178](https://github.com/pocke/rbs_rails/pull/178)
|
|
15
|
+
* Add scope methods to `ActiveRecord_Associations_CollectionProxy`. [#182](https://github.com/pocke/rbs_rails/pull/182)
|
|
16
|
+
* Make `has_one` association optional. [#180](https://github.com/pocke/rbs_rails/pull/180)
|
|
17
|
+
* Omit some methods for polymorphic associations. [#184](https://github.com/pocke/rbs_rails/pull/184)
|
|
18
|
+
* Include enum methods to GeneratedRelationMethods. [#183](https://github.com/pocke/rbs_rails/pull/183)
|
|
19
|
+
* Include `_ActiveRecord_Relation` to `CollectionProxy`. [#189](https://github.com/pocke/rbs_rails/pull/189)
|
|
20
|
+
|
|
5
21
|
## 0.8.2 (2021-02-20)
|
|
6
22
|
|
|
7
23
|
* Add ActiveRecord::AttributeMethods::Dirty methods [#104](https://github.com/pocke/rbs_rails/pull/104)
|
data/Gemfile
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
source "https://rubygems.org"
|
|
2
2
|
|
|
3
|
+
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
|
|
4
|
+
|
|
3
5
|
# Specify your gem's dependencies in rbs_rails.gemspec
|
|
4
6
|
gemspec
|
|
5
7
|
|
|
6
8
|
gem "rake", "~> 13.0"
|
|
7
|
-
gem '
|
|
8
|
-
gem '
|
|
9
|
+
gem 'rails', '< 6.1', '>= 6.0'
|
|
10
|
+
gem 'rbs', '>= 1.6'
|
|
11
|
+
gem 'steep', github: 'soutaro/steep'
|
|
9
12
|
gem 'minitest'
|
data/Gemfile.lock
CHANGED
|
@@ -1,49 +1,166 @@
|
|
|
1
|
+
GIT
|
|
2
|
+
remote: https://github.com/soutaro/steep
|
|
3
|
+
revision: 0673d88395fb0ea380463fef1aed568dfb077a60
|
|
4
|
+
specs:
|
|
5
|
+
steep (0.46.0)
|
|
6
|
+
activesupport (>= 5.1)
|
|
7
|
+
language_server-protocol (>= 3.15, < 4.0)
|
|
8
|
+
listen (~> 3.0)
|
|
9
|
+
parallel (>= 1.0.0)
|
|
10
|
+
parser (>= 3.0)
|
|
11
|
+
rainbow (>= 2.2.2, < 4.0)
|
|
12
|
+
rbs (>= 1.6.0)
|
|
13
|
+
terminal-table (>= 2, < 4)
|
|
14
|
+
|
|
1
15
|
PATH
|
|
2
16
|
remote: .
|
|
3
17
|
specs:
|
|
4
|
-
rbs_rails (0.
|
|
18
|
+
rbs_rails (0.9.0)
|
|
5
19
|
parser
|
|
6
20
|
rbs (>= 1)
|
|
7
21
|
|
|
8
22
|
GEM
|
|
9
23
|
remote: https://rubygems.org/
|
|
10
24
|
specs:
|
|
11
|
-
|
|
25
|
+
actioncable (6.0.4.1)
|
|
26
|
+
actionpack (= 6.0.4.1)
|
|
27
|
+
nio4r (~> 2.0)
|
|
28
|
+
websocket-driver (>= 0.6.1)
|
|
29
|
+
actionmailbox (6.0.4.1)
|
|
30
|
+
actionpack (= 6.0.4.1)
|
|
31
|
+
activejob (= 6.0.4.1)
|
|
32
|
+
activerecord (= 6.0.4.1)
|
|
33
|
+
activestorage (= 6.0.4.1)
|
|
34
|
+
activesupport (= 6.0.4.1)
|
|
35
|
+
mail (>= 2.7.1)
|
|
36
|
+
actionmailer (6.0.4.1)
|
|
37
|
+
actionpack (= 6.0.4.1)
|
|
38
|
+
actionview (= 6.0.4.1)
|
|
39
|
+
activejob (= 6.0.4.1)
|
|
40
|
+
mail (~> 2.5, >= 2.5.4)
|
|
41
|
+
rails-dom-testing (~> 2.0)
|
|
42
|
+
actionpack (6.0.4.1)
|
|
43
|
+
actionview (= 6.0.4.1)
|
|
44
|
+
activesupport (= 6.0.4.1)
|
|
45
|
+
rack (~> 2.0, >= 2.0.8)
|
|
46
|
+
rack-test (>= 0.6.3)
|
|
47
|
+
rails-dom-testing (~> 2.0)
|
|
48
|
+
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
|
49
|
+
actiontext (6.0.4.1)
|
|
50
|
+
actionpack (= 6.0.4.1)
|
|
51
|
+
activerecord (= 6.0.4.1)
|
|
52
|
+
activestorage (= 6.0.4.1)
|
|
53
|
+
activesupport (= 6.0.4.1)
|
|
54
|
+
nokogiri (>= 1.8.5)
|
|
55
|
+
actionview (6.0.4.1)
|
|
56
|
+
activesupport (= 6.0.4.1)
|
|
57
|
+
builder (~> 3.1)
|
|
58
|
+
erubi (~> 1.4)
|
|
59
|
+
rails-dom-testing (~> 2.0)
|
|
60
|
+
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
|
61
|
+
activejob (6.0.4.1)
|
|
62
|
+
activesupport (= 6.0.4.1)
|
|
63
|
+
globalid (>= 0.3.6)
|
|
64
|
+
activemodel (6.0.4.1)
|
|
65
|
+
activesupport (= 6.0.4.1)
|
|
66
|
+
activerecord (6.0.4.1)
|
|
67
|
+
activemodel (= 6.0.4.1)
|
|
68
|
+
activesupport (= 6.0.4.1)
|
|
69
|
+
activestorage (6.0.4.1)
|
|
70
|
+
actionpack (= 6.0.4.1)
|
|
71
|
+
activejob (= 6.0.4.1)
|
|
72
|
+
activerecord (= 6.0.4.1)
|
|
73
|
+
marcel (~> 1.0.0)
|
|
74
|
+
activesupport (6.0.4.1)
|
|
12
75
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
13
|
-
i18n (>=
|
|
14
|
-
minitest (
|
|
15
|
-
tzinfo (~>
|
|
16
|
-
zeitwerk (~> 2.
|
|
76
|
+
i18n (>= 0.7, < 2)
|
|
77
|
+
minitest (~> 5.1)
|
|
78
|
+
tzinfo (~> 1.1)
|
|
79
|
+
zeitwerk (~> 2.2, >= 2.2.2)
|
|
17
80
|
ast (2.4.2)
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
81
|
+
builder (3.2.4)
|
|
82
|
+
concurrent-ruby (1.1.9)
|
|
83
|
+
crass (1.0.6)
|
|
84
|
+
erubi (1.10.0)
|
|
85
|
+
ffi (1.15.4)
|
|
86
|
+
globalid (0.5.2)
|
|
87
|
+
activesupport (>= 5.0)
|
|
88
|
+
i18n (1.8.10)
|
|
23
89
|
concurrent-ruby (~> 1.0)
|
|
24
|
-
language_server-protocol (3.
|
|
25
|
-
listen (3.
|
|
90
|
+
language_server-protocol (3.16.0.3)
|
|
91
|
+
listen (3.7.0)
|
|
26
92
|
rb-fsevent (~> 0.10, >= 0.10.3)
|
|
27
93
|
rb-inotify (~> 0.9, >= 0.9.10)
|
|
28
|
-
|
|
29
|
-
|
|
94
|
+
loofah (2.12.0)
|
|
95
|
+
crass (~> 1.0.2)
|
|
96
|
+
nokogiri (>= 1.5.9)
|
|
97
|
+
mail (2.7.1)
|
|
98
|
+
mini_mime (>= 0.1.1)
|
|
99
|
+
marcel (1.0.1)
|
|
100
|
+
method_source (1.0.0)
|
|
101
|
+
mini_mime (1.1.1)
|
|
102
|
+
mini_portile2 (2.6.1)
|
|
103
|
+
minitest (5.14.4)
|
|
104
|
+
nio4r (2.5.8)
|
|
105
|
+
nokogiri (1.12.4)
|
|
106
|
+
mini_portile2 (~> 2.6.1)
|
|
107
|
+
racc (~> 1.4)
|
|
108
|
+
parallel (1.20.1)
|
|
109
|
+
parser (3.0.2.0)
|
|
30
110
|
ast (~> 2.4.1)
|
|
111
|
+
racc (1.5.2)
|
|
112
|
+
rack (2.2.3)
|
|
113
|
+
rack-test (1.1.0)
|
|
114
|
+
rack (>= 1.0, < 3)
|
|
115
|
+
rails (6.0.4.1)
|
|
116
|
+
actioncable (= 6.0.4.1)
|
|
117
|
+
actionmailbox (= 6.0.4.1)
|
|
118
|
+
actionmailer (= 6.0.4.1)
|
|
119
|
+
actionpack (= 6.0.4.1)
|
|
120
|
+
actiontext (= 6.0.4.1)
|
|
121
|
+
actionview (= 6.0.4.1)
|
|
122
|
+
activejob (= 6.0.4.1)
|
|
123
|
+
activemodel (= 6.0.4.1)
|
|
124
|
+
activerecord (= 6.0.4.1)
|
|
125
|
+
activestorage (= 6.0.4.1)
|
|
126
|
+
activesupport (= 6.0.4.1)
|
|
127
|
+
bundler (>= 1.3.0)
|
|
128
|
+
railties (= 6.0.4.1)
|
|
129
|
+
sprockets-rails (>= 2.0.0)
|
|
130
|
+
rails-dom-testing (2.0.3)
|
|
131
|
+
activesupport (>= 4.2.0)
|
|
132
|
+
nokogiri (>= 1.6)
|
|
133
|
+
rails-html-sanitizer (1.4.2)
|
|
134
|
+
loofah (~> 2.3)
|
|
135
|
+
railties (6.0.4.1)
|
|
136
|
+
actionpack (= 6.0.4.1)
|
|
137
|
+
activesupport (= 6.0.4.1)
|
|
138
|
+
method_source
|
|
139
|
+
rake (>= 0.8.7)
|
|
140
|
+
thor (>= 0.20.3, < 2.0)
|
|
31
141
|
rainbow (3.0.0)
|
|
32
|
-
rake (13.0.
|
|
33
|
-
rb-fsevent (0.
|
|
142
|
+
rake (13.0.6)
|
|
143
|
+
rb-fsevent (0.11.0)
|
|
34
144
|
rb-inotify (0.10.1)
|
|
35
145
|
ffi (~> 1.0)
|
|
36
|
-
rbs (1.
|
|
37
|
-
|
|
38
|
-
activesupport (>= 5.1)
|
|
39
|
-
ast_utils (>= 0.4.0)
|
|
40
|
-
language_server-protocol (~> 3.15.0.1)
|
|
41
|
-
listen (~> 3.0)
|
|
42
|
-
parser (>= 2.7)
|
|
43
|
-
rainbow (>= 2.2.2, < 4.0)
|
|
44
|
-
rbs (~> 1.0.3)
|
|
45
|
-
tzinfo (2.0.4)
|
|
146
|
+
rbs (1.6.2)
|
|
147
|
+
sprockets (4.0.2)
|
|
46
148
|
concurrent-ruby (~> 1.0)
|
|
149
|
+
rack (> 1, < 3)
|
|
150
|
+
sprockets-rails (3.2.2)
|
|
151
|
+
actionpack (>= 4.0)
|
|
152
|
+
activesupport (>= 4.0)
|
|
153
|
+
sprockets (>= 3.0.0)
|
|
154
|
+
terminal-table (3.0.1)
|
|
155
|
+
unicode-display_width (>= 1.1.1, < 3)
|
|
156
|
+
thor (1.1.0)
|
|
157
|
+
thread_safe (0.3.6)
|
|
158
|
+
tzinfo (1.2.9)
|
|
159
|
+
thread_safe (~> 0.1)
|
|
160
|
+
unicode-display_width (2.0.0)
|
|
161
|
+
websocket-driver (0.7.5)
|
|
162
|
+
websocket-extensions (>= 0.1.0)
|
|
163
|
+
websocket-extensions (0.1.5)
|
|
47
164
|
zeitwerk (2.4.2)
|
|
48
165
|
|
|
49
166
|
PLATFORMS
|
|
@@ -52,10 +169,11 @@ PLATFORMS
|
|
|
52
169
|
|
|
53
170
|
DEPENDENCIES
|
|
54
171
|
minitest
|
|
172
|
+
rails (>= 6.0, < 6.1)
|
|
55
173
|
rake (~> 13.0)
|
|
56
|
-
rbs (>= 1.
|
|
174
|
+
rbs (>= 1.6)
|
|
57
175
|
rbs_rails!
|
|
58
|
-
steep
|
|
176
|
+
steep!
|
|
59
177
|
|
|
60
178
|
BUNDLED WITH
|
|
61
|
-
2.2.
|
|
179
|
+
2.2.27
|
data/README.md
CHANGED
|
@@ -58,6 +58,9 @@ target :app do
|
|
|
58
58
|
library 'monitor'
|
|
59
59
|
library 'singleton'
|
|
60
60
|
library 'tsort'
|
|
61
|
+
library 'time'
|
|
62
|
+
|
|
63
|
+
library 'rack'
|
|
61
64
|
|
|
62
65
|
library 'activesupport'
|
|
63
66
|
library 'actionpack'
|
|
@@ -69,12 +72,11 @@ target :app do
|
|
|
69
72
|
end
|
|
70
73
|
```
|
|
71
74
|
|
|
72
|
-
You need to put RBS repo to `path/to/rbs_repo`. See https://github.com/ruby/
|
|
75
|
+
You need to put RBS repo to `path/to/rbs_repo`. See https://github.com/ruby/gem_rbs_collection
|
|
73
76
|
|
|
74
77
|
## Development
|
|
75
78
|
|
|
76
|
-
After checking out the repo, run `
|
|
77
|
-
`GITHUB_TOKEN` environment variable is required to fetch RBS from [ruby/gem_rbs](https://github.com/ruby/gem_rbs) repository.
|
|
79
|
+
After checking out the repo, run `bin/setup` to install dependencies.
|
|
78
80
|
|
|
79
81
|
You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
|
80
82
|
|
data/Rakefile
CHANGED
|
@@ -9,8 +9,10 @@ task :steep do
|
|
|
9
9
|
end
|
|
10
10
|
|
|
11
11
|
task :rbs_validate do
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
repo = ENV['RBS_REPO_DIR']&.then do |env|
|
|
13
|
+
"--repo=#{env}"
|
|
14
|
+
end
|
|
15
|
+
sh "rbs #{repo} validate --silent"
|
|
14
16
|
end
|
|
15
17
|
|
|
16
18
|
Rake::TestTask.new do |test|
|
data/Steepfile
CHANGED
|
@@ -3,21 +3,5 @@ target :lib do
|
|
|
3
3
|
signature 'assets/sig'
|
|
4
4
|
|
|
5
5
|
check "lib" # Directory name
|
|
6
|
-
repo_path ENV['RBS_REPO_DIR']
|
|
7
|
-
|
|
8
|
-
library "pathname"
|
|
9
|
-
library "logger"
|
|
10
|
-
library "mutex_m"
|
|
11
|
-
library "date"
|
|
12
|
-
library 'monitor'
|
|
13
|
-
library 'singleton'
|
|
14
|
-
library 'tsort'
|
|
15
|
-
|
|
16
|
-
library 'activesupport'
|
|
17
|
-
library 'actionpack'
|
|
18
|
-
library 'activejob'
|
|
19
|
-
library 'activemodel'
|
|
20
|
-
library 'actionview'
|
|
21
|
-
library 'activerecord'
|
|
22
|
-
library 'railties'
|
|
6
|
+
repo_path ENV['RBS_REPO_DIR'] if ENV['RBS_REPO_DIR']
|
|
23
7
|
end
|
data/bin/setup
CHANGED
|
@@ -32,10 +32,14 @@ module RbsRails
|
|
|
32
32
|
|
|
33
33
|
#{columns}
|
|
34
34
|
#{associations}
|
|
35
|
+
#{delegated_type_instance}
|
|
36
|
+
#{delegated_type_scope(singleton: true)}
|
|
35
37
|
#{enum_instance_methods}
|
|
36
38
|
#{enum_scope_methods(singleton: true)}
|
|
37
39
|
#{scopes(singleton: true)}
|
|
38
40
|
|
|
41
|
+
#{generated_relation_methods_decl}
|
|
42
|
+
|
|
39
43
|
#{relation_decl}
|
|
40
44
|
|
|
41
45
|
#{collection_proxy_decl}
|
|
@@ -46,18 +50,28 @@ module RbsRails
|
|
|
46
50
|
|
|
47
51
|
private def pk_type
|
|
48
52
|
pk = klass.primary_key
|
|
53
|
+
return 'top' unless pk
|
|
54
|
+
|
|
49
55
|
col = klass.columns.find {|col| col.name == pk }
|
|
50
56
|
sql_type_to_class(col.type)
|
|
51
57
|
end
|
|
52
58
|
|
|
59
|
+
private def generated_relation_methods_decl
|
|
60
|
+
<<~RBS
|
|
61
|
+
module GeneratedRelationMethods
|
|
62
|
+
#{enum_scope_methods(singleton: false)}
|
|
63
|
+
#{scopes(singleton: false)}
|
|
64
|
+
#{delegated_type_scope(singleton: false)}
|
|
65
|
+
end
|
|
66
|
+
RBS
|
|
67
|
+
end
|
|
68
|
+
|
|
53
69
|
private def relation_decl
|
|
54
70
|
<<~RBS
|
|
55
71
|
class #{relation_class_name} < ActiveRecord::Relation
|
|
72
|
+
include GeneratedRelationMethods
|
|
56
73
|
include _ActiveRecord_Relation[#{klass_name}, #{pk_type}]
|
|
57
74
|
include Enumerable[#{klass_name}]
|
|
58
|
-
|
|
59
|
-
#{enum_scope_methods(singleton: false)}
|
|
60
|
-
#{scopes(singleton: false)}
|
|
61
75
|
end
|
|
62
76
|
RBS
|
|
63
77
|
end
|
|
@@ -65,6 +79,8 @@ module RbsRails
|
|
|
65
79
|
private def collection_proxy_decl
|
|
66
80
|
<<~RBS
|
|
67
81
|
class ActiveRecord_Associations_CollectionProxy < ActiveRecord::Associations::CollectionProxy
|
|
82
|
+
include GeneratedRelationMethods
|
|
83
|
+
include _ActiveRecord_Relation[#{klass_name}, #{pk_type}]
|
|
68
84
|
end
|
|
69
85
|
RBS
|
|
70
86
|
end
|
|
@@ -121,7 +137,7 @@ module RbsRails
|
|
|
121
137
|
type = a.polymorphic? ? 'untyped' : Util.module_name(a.klass)
|
|
122
138
|
type_optional = optional(type)
|
|
123
139
|
<<~RUBY.chomp
|
|
124
|
-
def #{a.name}: () -> #{
|
|
140
|
+
def #{a.name}: () -> #{type_optional}
|
|
125
141
|
def #{a.name}=: (#{type_optional}) -> #{type_optional}
|
|
126
142
|
def build_#{a.name}: (untyped) -> #{type}
|
|
127
143
|
def create_#{a.name}: (untyped) -> #{type}
|
|
@@ -135,17 +151,91 @@ module RbsRails
|
|
|
135
151
|
klass.reflect_on_all_associations(:belongs_to).map do |a|
|
|
136
152
|
type = a.polymorphic? ? 'untyped' : Util.module_name(a.klass)
|
|
137
153
|
type_optional = optional(type)
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
def
|
|
145
|
-
|
|
154
|
+
# @type var methods: Array[String]
|
|
155
|
+
methods = []
|
|
156
|
+
methods << "def #{a.name}: () -> #{type}"
|
|
157
|
+
methods << "def #{a.name}=: (#{type_optional}) -> #{type_optional}"
|
|
158
|
+
methods << "def reload_#{a.name}: () -> #{type_optional}"
|
|
159
|
+
if !a.polymorphic?
|
|
160
|
+
methods << "def build_#{a.name}: (untyped) -> #{type}"
|
|
161
|
+
methods << "def create_#{a.name}: (untyped) -> #{type}"
|
|
162
|
+
methods << "def create_#{a.name}!: (untyped) -> #{type}"
|
|
163
|
+
end
|
|
164
|
+
methods.join("\n")
|
|
146
165
|
end.join("\n")
|
|
147
166
|
end
|
|
148
167
|
|
|
168
|
+
private def delegated_type_scope(singleton:)
|
|
169
|
+
definitions = delegated_type_definitions
|
|
170
|
+
return "" unless definitions
|
|
171
|
+
definitions.map do |definition|
|
|
172
|
+
definition[:types].map do |type|
|
|
173
|
+
scope_name = type.tableize.gsub("/", "_")
|
|
174
|
+
"def #{singleton ? 'self.' : ''}#{scope_name}: () -> #{relation_class_name}"
|
|
175
|
+
end
|
|
176
|
+
end.flatten.join("\n")
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
private def delegated_type_instance
|
|
180
|
+
definitions = delegated_type_definitions
|
|
181
|
+
return "" unless definitions
|
|
182
|
+
# @type var methods: Array[String]
|
|
183
|
+
methods = []
|
|
184
|
+
definitions.each do |definition|
|
|
185
|
+
methods << "def #{definition[:role]}_class: () -> Class"
|
|
186
|
+
methods << "def #{definition[:role]}_name: () -> String"
|
|
187
|
+
methods << definition[:types].map do |type|
|
|
188
|
+
scope_name = type.tableize.gsub("/", "_")
|
|
189
|
+
singular = scope_name.singularize
|
|
190
|
+
<<~RUBY.chomp
|
|
191
|
+
def #{singular}?: () -> bool
|
|
192
|
+
def #{singular}: () -> #{type.classify}?
|
|
193
|
+
def #{singular}_id: () -> Integer?
|
|
194
|
+
RUBY
|
|
195
|
+
end.join("\n")
|
|
196
|
+
end
|
|
197
|
+
methods.join("\n")
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
private def delegated_type_definitions
|
|
201
|
+
ast = parse_model_file
|
|
202
|
+
return unless ast
|
|
203
|
+
|
|
204
|
+
traverse(ast).map do |node|
|
|
205
|
+
# @type block: { role: Symbol, types: Array[String] }?
|
|
206
|
+
next unless node.type == :send
|
|
207
|
+
next unless node.children[0].nil?
|
|
208
|
+
next unless node.children[1] == :delegated_type
|
|
209
|
+
|
|
210
|
+
role_node = node.children[2]
|
|
211
|
+
next unless role_node
|
|
212
|
+
next unless role_node.type == :sym
|
|
213
|
+
# @type var role: Symbol
|
|
214
|
+
role = role_node.children[0]
|
|
215
|
+
|
|
216
|
+
args_node = node.children[3]
|
|
217
|
+
next unless args_node
|
|
218
|
+
next unless args_node.type == :hash
|
|
219
|
+
|
|
220
|
+
types = traverse(args_node).map do |n|
|
|
221
|
+
# @type block: Array[String]?
|
|
222
|
+
next unless n.type == :pair
|
|
223
|
+
key_node = n.children[0]
|
|
224
|
+
next unless key_node
|
|
225
|
+
next unless key_node.type == :sym
|
|
226
|
+
next unless key_node.children[0] == :types
|
|
227
|
+
|
|
228
|
+
types_node = n.children[1]
|
|
229
|
+
next unless types_node
|
|
230
|
+
next unless types_node.type == :array
|
|
231
|
+
code = types_node.loc.expression.source
|
|
232
|
+
eval(code)
|
|
233
|
+
end.compact.flatten
|
|
234
|
+
|
|
235
|
+
{ role: role, types: types }
|
|
236
|
+
end.compact
|
|
237
|
+
end
|
|
238
|
+
|
|
149
239
|
private def enum_instance_methods
|
|
150
240
|
# @type var methods: Array[String]
|
|
151
241
|
methods = []
|
|
@@ -258,17 +348,17 @@ module RbsRails
|
|
|
258
348
|
args_node.children.each do |node|
|
|
259
349
|
case node.type
|
|
260
350
|
when :arg
|
|
261
|
-
res << "untyped
|
|
351
|
+
res << "untyped `#{node.children[0]}`"
|
|
262
352
|
when :optarg
|
|
263
|
-
res << "?untyped
|
|
353
|
+
res << "?untyped `#{node.children[0]}`"
|
|
264
354
|
when :kwarg
|
|
265
355
|
res << "#{node.children[0]}: untyped"
|
|
266
356
|
when :kwoptarg
|
|
267
357
|
res << "?#{node.children[0]}: untyped"
|
|
268
358
|
when :restarg
|
|
269
|
-
res << "*untyped
|
|
359
|
+
res << "*untyped `#{node.children[0]}`"
|
|
270
360
|
when :kwrestarg
|
|
271
|
-
res << "**untyped
|
|
361
|
+
res << "**untyped `#{node.children[0]}`"
|
|
272
362
|
when :blockarg
|
|
273
363
|
block = " { (*untyped) -> untyped }"
|
|
274
364
|
else
|
|
@@ -292,7 +382,7 @@ module RbsRails
|
|
|
292
382
|
end
|
|
293
383
|
|
|
294
384
|
private def traverse(node, &block)
|
|
295
|
-
return to_enum(__method__, node) unless block_given?
|
|
385
|
+
return to_enum(__method__ || raise, node) unless block_given?
|
|
296
386
|
|
|
297
387
|
# @type var block: ^(Parser::AST::Node) -> untyped
|
|
298
388
|
block.call node
|
data/lib/rbs_rails/version.rb
CHANGED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
---
|
|
2
|
+
sources:
|
|
3
|
+
- name: ruby/gem_rbs_collection
|
|
4
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
5
|
+
revision: main
|
|
6
|
+
repo_dir: gems
|
|
7
|
+
path: ".gem_rbs_collection"
|
|
8
|
+
gems:
|
|
9
|
+
- name: pathname
|
|
10
|
+
version: '0'
|
|
11
|
+
source:
|
|
12
|
+
type: stdlib
|
|
13
|
+
- name: logger
|
|
14
|
+
version: '0'
|
|
15
|
+
source:
|
|
16
|
+
type: stdlib
|
|
17
|
+
- name: mutex_m
|
|
18
|
+
version: '0'
|
|
19
|
+
source:
|
|
20
|
+
type: stdlib
|
|
21
|
+
- name: date
|
|
22
|
+
version: '0'
|
|
23
|
+
source:
|
|
24
|
+
type: stdlib
|
|
25
|
+
- name: monitor
|
|
26
|
+
version: '0'
|
|
27
|
+
source:
|
|
28
|
+
type: stdlib
|
|
29
|
+
- name: singleton
|
|
30
|
+
version: '0'
|
|
31
|
+
source:
|
|
32
|
+
type: stdlib
|
|
33
|
+
- name: tsort
|
|
34
|
+
version: '0'
|
|
35
|
+
source:
|
|
36
|
+
type: stdlib
|
|
37
|
+
- name: time
|
|
38
|
+
version: '0'
|
|
39
|
+
source:
|
|
40
|
+
type: stdlib
|
|
41
|
+
- name: set
|
|
42
|
+
version: '0'
|
|
43
|
+
source:
|
|
44
|
+
type: stdlib
|
|
45
|
+
- name: rack
|
|
46
|
+
version: 2.2.2
|
|
47
|
+
source:
|
|
48
|
+
type: git
|
|
49
|
+
name: ruby/gem_rbs_collection
|
|
50
|
+
revision: 51880bed87fbc3dc8076fedb5cf798be05148220
|
|
51
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
52
|
+
repo_dir: gems
|
|
53
|
+
- name: json
|
|
54
|
+
version: '0'
|
|
55
|
+
source:
|
|
56
|
+
type: stdlib
|
|
57
|
+
- name: strscan
|
|
58
|
+
version: '0'
|
|
59
|
+
source:
|
|
60
|
+
type: stdlib
|
|
61
|
+
- name: optparse
|
|
62
|
+
version: '0'
|
|
63
|
+
source:
|
|
64
|
+
type: stdlib
|
|
65
|
+
- name: actionpack
|
|
66
|
+
version: '6.0'
|
|
67
|
+
source:
|
|
68
|
+
type: git
|
|
69
|
+
name: ruby/gem_rbs_collection
|
|
70
|
+
revision: 51880bed87fbc3dc8076fedb5cf798be05148220
|
|
71
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
72
|
+
repo_dir: gems
|
|
73
|
+
- name: actionview
|
|
74
|
+
version: '6.0'
|
|
75
|
+
source:
|
|
76
|
+
type: git
|
|
77
|
+
name: ruby/gem_rbs_collection
|
|
78
|
+
revision: 51880bed87fbc3dc8076fedb5cf798be05148220
|
|
79
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
80
|
+
repo_dir: gems
|
|
81
|
+
- name: activejob
|
|
82
|
+
version: '6.0'
|
|
83
|
+
source:
|
|
84
|
+
type: git
|
|
85
|
+
name: ruby/gem_rbs_collection
|
|
86
|
+
revision: 51880bed87fbc3dc8076fedb5cf798be05148220
|
|
87
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
88
|
+
repo_dir: gems
|
|
89
|
+
- name: activemodel
|
|
90
|
+
version: '6.0'
|
|
91
|
+
source:
|
|
92
|
+
type: git
|
|
93
|
+
name: ruby/gem_rbs_collection
|
|
94
|
+
revision: 51880bed87fbc3dc8076fedb5cf798be05148220
|
|
95
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
96
|
+
repo_dir: gems
|
|
97
|
+
- name: activerecord
|
|
98
|
+
version: '6.0'
|
|
99
|
+
source:
|
|
100
|
+
type: git
|
|
101
|
+
name: ruby/gem_rbs_collection
|
|
102
|
+
revision: 51880bed87fbc3dc8076fedb5cf798be05148220
|
|
103
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
104
|
+
repo_dir: gems
|
|
105
|
+
- name: activesupport
|
|
106
|
+
version: '6.0'
|
|
107
|
+
source:
|
|
108
|
+
type: git
|
|
109
|
+
name: ruby/gem_rbs_collection
|
|
110
|
+
revision: 51880bed87fbc3dc8076fedb5cf798be05148220
|
|
111
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
112
|
+
repo_dir: gems
|
|
113
|
+
- name: parallel
|
|
114
|
+
version: '1.20'
|
|
115
|
+
source:
|
|
116
|
+
type: git
|
|
117
|
+
name: ruby/gem_rbs_collection
|
|
118
|
+
revision: 51880bed87fbc3dc8076fedb5cf798be05148220
|
|
119
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
120
|
+
repo_dir: gems
|
|
121
|
+
- name: railties
|
|
122
|
+
version: '6.0'
|
|
123
|
+
source:
|
|
124
|
+
type: git
|
|
125
|
+
name: ruby/gem_rbs_collection
|
|
126
|
+
revision: 51880bed87fbc3dc8076fedb5cf798be05148220
|
|
127
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
128
|
+
repo_dir: gems
|
|
129
|
+
- name: rbs
|
|
130
|
+
version: 1.6.2
|
|
131
|
+
source:
|
|
132
|
+
type: rubygems
|
data/rbs_collection.yaml
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Download sources
|
|
2
|
+
sources:
|
|
3
|
+
- name: ruby/gem_rbs_collection
|
|
4
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
|
5
|
+
revision: main
|
|
6
|
+
repo_dir: gems
|
|
7
|
+
|
|
8
|
+
# A directory to install the downloaded RBSs
|
|
9
|
+
path: .gem_rbs_collection
|
|
10
|
+
|
|
11
|
+
gems:
|
|
12
|
+
# stdlibs
|
|
13
|
+
- name: 'pathname'
|
|
14
|
+
- name: 'logger'
|
|
15
|
+
- name: 'mutex_m'
|
|
16
|
+
- name: 'date'
|
|
17
|
+
- name: 'monitor'
|
|
18
|
+
- name: 'singleton'
|
|
19
|
+
- name: 'tsort'
|
|
20
|
+
- name: 'time'
|
|
21
|
+
- name: 'set'
|
|
22
|
+
|
|
23
|
+
# gems
|
|
24
|
+
- name: 'rack'
|
|
25
|
+
|
|
26
|
+
# RBS gem dependencies
|
|
27
|
+
- name: 'json'
|
|
28
|
+
- name: 'strscan'
|
|
29
|
+
- name: 'optparse'
|
|
30
|
+
|
|
31
|
+
# Ignores - Gemfile.lock contains them but their RBSs are unnecessary
|
|
32
|
+
- name: steep
|
|
33
|
+
ignore: true
|
|
34
|
+
- name: nokogiri
|
|
35
|
+
ignore: true
|
|
36
|
+
- name: ast
|
|
37
|
+
ignore: true
|
|
38
|
+
- name: rainbow
|
|
39
|
+
ignore: true
|
|
40
|
+
- name: listen
|
|
41
|
+
ignore: true
|
|
42
|
+
|
|
43
|
+
# ignore RBS Rails itself
|
|
44
|
+
- name: rbs_rails
|
|
45
|
+
ignore: true
|
|
@@ -14,6 +14,8 @@ class RbsRails::ActiveRecord::Generator
|
|
|
14
14
|
|
|
15
15
|
def pk_type: () -> String
|
|
16
16
|
|
|
17
|
+
def generated_relation_methods_decl: () -> String
|
|
18
|
+
|
|
17
19
|
def relation_decl: () -> String
|
|
18
20
|
|
|
19
21
|
def collection_proxy_decl: () -> String
|
|
@@ -30,6 +32,12 @@ class RbsRails::ActiveRecord::Generator
|
|
|
30
32
|
|
|
31
33
|
def belongs_to: () -> String
|
|
32
34
|
|
|
35
|
+
def delegated_type_scope: (singleton: bool) -> String
|
|
36
|
+
|
|
37
|
+
def delegated_type_instance: () -> String
|
|
38
|
+
|
|
39
|
+
def delegated_type_definitions: () -> Array[{ role: Symbol, types: Array[String] }]?
|
|
40
|
+
|
|
33
41
|
def enum_instance_methods: () -> String
|
|
34
42
|
|
|
35
43
|
def enum_scope_methods: (singleton: untyped `singleton`) -> String
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rbs_rails
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.9.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Masataka Pocke Kuwabara
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2021-
|
|
11
|
+
date: 2021-09-18 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: parser
|
|
@@ -58,9 +58,7 @@ files:
|
|
|
58
58
|
- Steepfile
|
|
59
59
|
- bin/add-type-params.rb
|
|
60
60
|
- bin/console
|
|
61
|
-
- bin/gem_rbs
|
|
62
61
|
- bin/postprocess.rb
|
|
63
|
-
- bin/rbs
|
|
64
62
|
- bin/rbs-prototype-rb.rb
|
|
65
63
|
- bin/setup
|
|
66
64
|
- bin/to-ascii.rb
|
|
@@ -71,6 +69,8 @@ files:
|
|
|
71
69
|
- lib/rbs_rails/rake_task.rb
|
|
72
70
|
- lib/rbs_rails/util.rb
|
|
73
71
|
- lib/rbs_rails/version.rb
|
|
72
|
+
- rbs_collection.lock.yaml
|
|
73
|
+
- rbs_collection.yaml
|
|
74
74
|
- rbs_rails.gemspec
|
|
75
75
|
- sig/activerecord.rbs
|
|
76
76
|
- sig/fileutils.rbs
|
|
@@ -105,7 +105,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
105
105
|
- !ruby/object:Gem::Version
|
|
106
106
|
version: '0'
|
|
107
107
|
requirements: []
|
|
108
|
-
rubygems_version: 3.
|
|
108
|
+
rubygems_version: 3.3.0.dev
|
|
109
109
|
signing_key:
|
|
110
110
|
specification_version: 4
|
|
111
111
|
summary: A RBS files generator for Rails application
|
data/bin/gem_rbs
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
|
|
3
|
-
require 'net/http'
|
|
4
|
-
require 'json'
|
|
5
|
-
require 'securerandom'
|
|
6
|
-
require 'pathname'
|
|
7
|
-
|
|
8
|
-
TOKEN = ENV.fetch('GITHUB_TOKEN')
|
|
9
|
-
VERSION = "6.0.3.2"
|
|
10
|
-
|
|
11
|
-
def req(query)
|
|
12
|
-
http = Net::HTTP.new("api.github.com", 443)
|
|
13
|
-
http.use_ssl = true
|
|
14
|
-
header = {
|
|
15
|
-
"Authorization" => "Bearer #{TOKEN}",
|
|
16
|
-
'Content-Type' => 'application/json',
|
|
17
|
-
'User-Agent' => 'gem_rbs client',
|
|
18
|
-
}
|
|
19
|
-
resp = http.request_post('/graphql', JSON.generate(query), header)
|
|
20
|
-
JSON.parse(resp.body, symbolize_names: true).tap do |content|
|
|
21
|
-
raise content[:errors].inspect if content[:errors]
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
class QueryBuilder
|
|
26
|
-
attr_reader :variables
|
|
27
|
-
|
|
28
|
-
def initialize
|
|
29
|
-
@queries = []
|
|
30
|
-
@variables = {}
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def add(query, variables)
|
|
34
|
-
query = query.dup
|
|
35
|
-
variables = variables.transform_keys do |key|
|
|
36
|
-
next key unless @variables.key?(key)
|
|
37
|
-
|
|
38
|
-
new_key = key + '_' + SecureRandom.hex(8)
|
|
39
|
-
query.gsub!(key, new_key)
|
|
40
|
-
new_key
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
@queries << query
|
|
44
|
-
@variables.merge!(variables)
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def query
|
|
48
|
-
# TODO: Allow non-String type for variables
|
|
49
|
-
"query(#{variables.keys.map { |v| "$#{v}: String!" }.join(',')}) { #{@queries.join("\n")} }"
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
gems = %w[activesupport actionpack activejob activemodel actionview activerecord railties]
|
|
54
|
-
|
|
55
|
-
builder = QueryBuilder.new
|
|
56
|
-
gems.each do |gem|
|
|
57
|
-
path = "main:gems/#{gem}/#{VERSION}"
|
|
58
|
-
builder.add(<<~GRAPHQL, { 'path' => path })
|
|
59
|
-
#{gem}:repository(owner: "ruby", name: "gem_rbs_collection") {
|
|
60
|
-
object(expression: $path) {
|
|
61
|
-
... on Tree {
|
|
62
|
-
entries {
|
|
63
|
-
name
|
|
64
|
-
object {
|
|
65
|
-
... on Blob {
|
|
66
|
-
isTruncated
|
|
67
|
-
text
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
GRAPHQL
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
resp = req(query: builder.query, variables: builder.variables)
|
|
78
|
-
|
|
79
|
-
resp[:data].each do |gem_name, gem_value|
|
|
80
|
-
gem_value.dig(:object, :entries).each do |entry|
|
|
81
|
-
fname = entry[:name]
|
|
82
|
-
if fname.end_with?('.rbs')
|
|
83
|
-
content =
|
|
84
|
-
if entry.dig(:object, :isTruncated)
|
|
85
|
-
`curl -H 'Accept: application/vnd.github.v3.raw' -H Authorization: token #{TOKEN} https://api.github.com/repos/ruby/gem_rbs_collection/contents/gems/#{gem_name}/#{VERSION}/#{fname}`
|
|
86
|
-
else
|
|
87
|
-
entry.dig(:object, :text)
|
|
88
|
-
end
|
|
89
|
-
dir = Pathname("gem_rbs/gems/#{gem_name}/#{VERSION}")
|
|
90
|
-
dir.mkpath
|
|
91
|
-
dir.join(fname).write(content)
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
end
|
data/bin/rbs
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
#!ruby
|
|
2
|
-
|
|
3
|
-
require 'pathname'
|
|
4
|
-
root = Pathname(__dir__) / '../'
|
|
5
|
-
|
|
6
|
-
def v(require)
|
|
7
|
-
if v = ENV['RAILS_VERSION']
|
|
8
|
-
"#{require}:#{v}"
|
|
9
|
-
else
|
|
10
|
-
require
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def repo
|
|
15
|
-
ENV['RBS_REPO_DIR'] || Pathname(__dir__).join('../gem_rbs/gems').to_s
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
exec(
|
|
19
|
-
'rbs',
|
|
20
|
-
# Require stdlibs
|
|
21
|
-
'-rlogger', '-rpathname', '-rmutex_m', '-rdate', '-rmonitor', '-rsingleton', '-rtsort',
|
|
22
|
-
"--repo=#{repo}",
|
|
23
|
-
# Require Rails libraries
|
|
24
|
-
v('-ractivesupport'), v('-ractionpack'), v('-ractivejob'), v('-ractivemodel'), v('-ractionview'), v('-ractiverecord'), v('-rrailties'),
|
|
25
|
-
# Load signatures that are bundled in rbs_rails
|
|
26
|
-
'-I' + root.join('sig').to_s, '-I' + root.join('assets/sig').to_s,
|
|
27
|
-
# Expand arguments
|
|
28
|
-
*ARGV,
|
|
29
|
-
)
|
|
30
|
-
|