rbs_rails 0.5.0 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/.dependabot/config.yml +8 -0
  3. data/.github/workflows/ci.yml +29 -0
  4. data/.gitignore +4 -2
  5. data/.gitmodules +0 -3
  6. data/CHANGELOG.md +22 -0
  7. data/Gemfile +2 -2
  8. data/Gemfile.lock +61 -0
  9. data/README.md +16 -44
  10. data/Steepfile +3 -0
  11. data/bin/add-type-params.rb +2 -1
  12. data/bin/gem_rbs +94 -0
  13. data/bin/postprocess.rb +1 -1
  14. data/bin/rbs +1 -1
  15. data/bin/rbs-prototype-rb.rb +5 -1
  16. data/bin/setup +1 -0
  17. data/lib/rbs_rails.rb +4 -0
  18. data/lib/rbs_rails/active_record.rb +91 -46
  19. data/lib/rbs_rails/dependency_builder.rb +43 -0
  20. data/lib/rbs_rails/rake_task.rb +72 -0
  21. data/lib/rbs_rails/util.rb +25 -0
  22. data/lib/rbs_rails/version.rb +1 -1
  23. data/rbs_rails.gemspec +2 -2
  24. data/sig/activerecord.rbs +4 -0
  25. data/sig/fileutils.rbs +1 -0
  26. data/sig/rake.rbs +6 -0
  27. data/sig/rbs_rails/active_record.rbs +11 -2
  28. data/sig/rbs_rails/dependency_builder.rbs +9 -0
  29. data/sig/rbs_rails/rake_task.rbs +26 -0
  30. data/sig/rbs_rails/util.rbs +11 -0
  31. metadata +19 -30
  32. data/.travis.yml +0 -11
  33. data/assets/sig/action_mailer.rbs +0 -8
  34. data/assets/sig/builtin.rbs +0 -7
  35. data/assets/sig/capybara.rbs +0 -14
  36. data/assets/sig/concurrent.rbs +0 -4
  37. data/assets/sig/erb.rbs +0 -4
  38. data/assets/sig/erubi.rbs +0 -4
  39. data/assets/sig/i18n.rbs +0 -4
  40. data/assets/sig/libxml.rbs +0 -10
  41. data/assets/sig/minitest.rbs +0 -13
  42. data/assets/sig/nokogiri.rbs +0 -8
  43. data/assets/sig/pg.rbs +0 -5
  44. data/assets/sig/que.rbs +0 -4
  45. data/assets/sig/queue_classic.rbs +0 -4
  46. data/assets/sig/racc.rbs +0 -4
  47. data/assets/sig/rack-test.rbs +0 -6
  48. data/assets/sig/rack.rbs +0 -47
  49. data/assets/sig/rails.rbs +0 -14
  50. data/assets/sig/rdoc.rbs +0 -9
  51. data/assets/sig/sidekiq.rbs +0 -4
  52. data/assets/sig/sneakers.rbs +0 -4
  53. data/assets/sig/stdlib.rbs +0 -24
  54. data/assets/sig/sucker_punch.rbs +0 -4
  55. data/assets/sig/thor.rbs +0 -12
  56. data/assets/sig/tzinfo.rbs +0 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 820a0b86c257e12194d883e6f5edda1793b54cb789c2b57da2e496e16041c803
4
- data.tar.gz: 173abfdce9274fc34671198b7640f5e84a92c8b0bb1a7ede8224cd2fb851137d
3
+ metadata.gz: 2d70009e239cba7c79ad16cf1861495051952a6930205678b05fcf5ad97f0809
4
+ data.tar.gz: 20e8d58362c2222651aa10430417ac90af1b8e38e5b3bbfcfdf43f186f77eff6
5
5
  SHA512:
6
- metadata.gz: 500bb14e66e9d6188d931e8a655b8af42b17caf13fa9487e8ad22318a54f34b5e05c412e65c2e68258d13165cb5760d09dc00d52d05b7cb9c9696e97dbbcc8bb
7
- data.tar.gz: 86e1ec208cba577ce7ed5ac4a6b7bcd5ada10fe7d3ca0fd4ba5e014a68144bbe3182fcbd04145e9b9472be24a627eb0d5c3a2b7424661caae25d43507390d15a
6
+ metadata.gz: ef998ce7910f4169eb43716ed8ad0132338751b0c9346213cb02ddecae71fe1c0159d8eb2404877cd599dbd352fe42d3d52bd1316f6577fe2568c912ec0f402a
7
+ data.tar.gz: 846055b9290bfb250e933686a7dcd05bd52ff331cc1a83a3ddae4cd05ff480b2b43b7c164dbbbff164f25c568837b9d30353eb787464f430b08ffbed69737add
@@ -0,0 +1,8 @@
1
+ version: 1
2
+ update_configs:
3
+ - package_manager: "ruby:bundler"
4
+ directory: "/"
5
+ update_schedule: "live"
6
+ - package_manager: "ruby:bundler"
7
+ directory: "/test/app/"
8
+ update_schedule: "live"
@@ -0,0 +1,29 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ pull_request:
8
+ types:
9
+ - opened
10
+ - synchronize
11
+ - reopened
12
+
13
+ jobs:
14
+ test:
15
+ strategy:
16
+ fail-fast: false
17
+ matrix:
18
+ ruby: [2.6, 2.7, '3.0', head]
19
+ runs-on: ubuntu-latest
20
+ steps:
21
+ - uses: actions/checkout@v2
22
+ - uses: ruby/setup-ruby@v1
23
+ with:
24
+ ruby-version: ${{ matrix.ruby }}
25
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
26
+ - env:
27
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
28
+ run: bin/gem_rbs
29
+ - run: bundle exec rake
data/.gitignore CHANGED
@@ -6,5 +6,7 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
- /Gemfile.lock
10
- /test/sig
9
+ /test/app/sig/rbs_rails
10
+ /test/app/sig/app
11
+ /test/app/sig/path_helpers.rbs
12
+ /gem_rbs
data/.gitmodules CHANGED
@@ -1,3 +0,0 @@
1
- [submodule "gem_rbs"]
2
- path = gem_rbs
3
- url = https://github.com/ruby/gem_rbs.git
data/CHANGELOG.md ADDED
@@ -0,0 +1,22 @@
1
+ # Change log
2
+
3
+ ## master (unreleased)
4
+
5
+ ## 0.8.2 (2021-02-20)
6
+
7
+ * Add ActiveRecord::AttributeMethods::Dirty methods [#104](https://github.com/pocke/rbs_rails/pull/104)
8
+ * Define find method based on primary key [#105](https://github.com/pocke/rbs_rails/pull/105)
9
+
10
+ ## 0.8.1 (2021-01-09)
11
+
12
+ * Skip generation RBS fro class that doesn't have table in DB. [#95](https://github.com/pocke/rbs_rails/pull/95)
13
+
14
+ ## 0.8.0 (2020-12-31)
15
+
16
+ * **[BREAKING]** Move RBS files that are copied by `rbs_rails:copy_signature_files` task to [ruby/gem_rbs](https://github.com/ruby/gem_rbs) repository [#90](https://github.com/pocke/rbs_rails/pull/90)
17
+ * Allow all kinds of argument for scope [#89](https://github.com/pocke/rbs_rails/pull/89)
18
+
19
+ ## 0.7.0 (2020-12-28)
20
+
21
+ * **[BREAKING]** Re-structure signature directory. [#86](https://github.com/pocke/rbs_rails/pull/86)
22
+ * Generate ActiveRecord models with namespaces and superclasses. [#87](https://github.com/pocke/rbs_rails/pull/87)
data/Gemfile CHANGED
@@ -3,7 +3,7 @@ source "https://rubygems.org"
3
3
  # Specify your gem's dependencies in rbs_rails.gemspec
4
4
  gemspec
5
5
 
6
- gem "rake", "~> 12.0"
7
- gem 'rbs', '>= 0.14.0'
6
+ gem "rake", "~> 13.0"
7
+ gem 'rbs', '>= 1.0.0'
8
8
  gem 'steep', '>= 0.34.0'
9
9
  gem 'minitest'
data/Gemfile.lock ADDED
@@ -0,0 +1,61 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ rbs_rails (0.8.2)
5
+ parser
6
+ rbs (>= 1)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ activesupport (6.1.2.1)
12
+ concurrent-ruby (~> 1.0, >= 1.0.2)
13
+ i18n (>= 1.6, < 2)
14
+ minitest (>= 5.1)
15
+ tzinfo (~> 2.0)
16
+ zeitwerk (~> 2.3)
17
+ ast (2.4.2)
18
+ ast_utils (0.4.0)
19
+ parser (>= 2.7.0)
20
+ concurrent-ruby (1.1.8)
21
+ ffi (1.14.2)
22
+ i18n (1.8.9)
23
+ concurrent-ruby (~> 1.0)
24
+ language_server-protocol (3.15.0.1)
25
+ listen (3.4.1)
26
+ rb-fsevent (~> 0.10, >= 0.10.3)
27
+ rb-inotify (~> 0.9, >= 0.9.10)
28
+ minitest (5.14.3)
29
+ parser (3.0.0.0)
30
+ ast (~> 2.4.1)
31
+ rainbow (3.0.0)
32
+ rake (13.0.3)
33
+ rb-fsevent (0.10.4)
34
+ rb-inotify (0.10.1)
35
+ ffi (~> 1.0)
36
+ rbs (1.0.6)
37
+ steep (0.41.0)
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)
46
+ concurrent-ruby (~> 1.0)
47
+ zeitwerk (2.4.2)
48
+
49
+ PLATFORMS
50
+ ruby
51
+ x86_64-linux
52
+
53
+ DEPENDENCIES
54
+ minitest
55
+ rake (~> 13.0)
56
+ rbs (>= 1.0.0)
57
+ rbs_rails!
58
+ steep (>= 0.34.0)
59
+
60
+ BUNDLED WITH
61
+ 2.2.4
data/README.md CHANGED
@@ -7,7 +7,7 @@ RBS files generator for Ruby on Rails.
7
7
  Add this line to your application's Gemfile:
8
8
 
9
9
  ```ruby
10
- gem 'rbs_rails'
10
+ gem 'rbs_rails', require: false
11
11
  ```
12
12
 
13
13
  And then execute:
@@ -20,56 +20,22 @@ Or install it yourself as:
20
20
 
21
21
  ## Usage
22
22
 
23
- ### For Active Record models
24
-
25
- It has two tasks.
26
-
27
- * `copy_signature_files`: Copy type definition files for Rails from rbs_rails.
28
- * `generate_rbs_for_model`: Generate RBS files from model classes.
23
+ Put the following code to `lib/tasks/rbs.rake`.
29
24
 
30
25
  ```ruby
31
- # Rakefile
32
-
33
- task copy_signature_files: :environment do
34
- require 'rbs_rails'
35
-
36
- to = Rails.root.join('sig/rbs_rails/')
37
- to.mkpath unless to.exist?
38
- RbsRails.copy_signatures(to: to)
39
- end
40
-
41
- task generate_rbs_for_model: :environment do
42
- require 'rbs_rails'
43
-
44
- out_dir = Rails.root / 'sig'
45
- out_dir.mkdir unless out_dir.exist?
46
-
47
- Rails.application.eager_load!
26
+ require 'rbs_rails/rake_task'
48
27
 
49
- ActiveRecord::Base.descendants.each do |klass|
50
- next if klass.abstract_class?
28
+ RbsRails::RakeTask.new
29
+ ```
51
30
 
52
- path = out_dir / "app/models/#{klass.name.underscore}.rbs"
53
- FileUtils.mkdir_p(path.dirname)
31
+ Then, the following three tasks are available.
54
32
 
55
- sig = RbsRails::ActiveRecord.class_to_rbs(klass)
56
- path.write sig
57
- end
58
- end
59
- ```
33
+ * `rbs_rails:generate_rbs_for_models`: Generate RBS files for Active Record models
34
+ * `rbs_rails:generate_rbs_for_path_helpers`: Generate RBS files for path helpers
35
+ * `rbs_rails:all`: Execute all tasks of RBS Rails
60
36
 
61
- ### For path helpers
62
37
 
63
- ```ruby
64
- # Rakefile
65
38
 
66
- task generate_rbs_for_path_helpers: :environment do
67
- require 'rbs_rails'
68
- out_path = Rails.root.join 'sig/path_helpers.rbs'
69
- rbs = RbsRails::PathHelpers.generate
70
- out_path.write rbs
71
- end
72
- ```
73
39
 
74
40
  ### Steep integration
75
41
 
@@ -89,6 +55,9 @@ target :app do
89
55
  library 'logger'
90
56
  library 'mutex_m'
91
57
  library 'date'
58
+ library 'monitor'
59
+ library 'singleton'
60
+ library 'tsort'
92
61
 
93
62
  library 'activesupport'
94
63
  library 'actionpack'
@@ -104,7 +73,10 @@ You need to put RBS repo to `path/to/rbs_repo`. See https://github.com/ruby/gem_
104
73
 
105
74
  ## Development
106
75
 
107
- After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
76
+ After checking out the repo, run `GITHUB_TOKEN=xxx bin/setup` to install dependencies.
77
+ `GITHUB_TOKEN` environment variable is required to fetch RBS from [ruby/gem_rbs](https://github.com/ruby/gem_rbs) repository.
78
+
79
+ You can also run `bin/console` for an interactive prompt that will allow you to experiment.
108
80
 
109
81
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
110
82
 
data/Steepfile CHANGED
@@ -9,6 +9,9 @@ target :lib do
9
9
  library "logger"
10
10
  library "mutex_m"
11
11
  library "date"
12
+ library 'monitor'
13
+ library 'singleton'
14
+ library 'tsort'
12
15
 
13
16
  library 'activesupport'
14
17
  library 'actionpack'
@@ -4,7 +4,7 @@ require 'bundler/inline'
4
4
 
5
5
  gemfile do
6
6
  source 'https://rubygems.org'
7
- gem 'rbs', '>= 0.19'
7
+ gem 'rbs', '1.0.0'
8
8
  end
9
9
 
10
10
  require 'rbs'
@@ -16,6 +16,7 @@ end
16
16
  def env
17
17
  @env ||= begin
18
18
  loader = RBS::EnvironmentLoader.new()
19
+ loader.add(library: 'tsort')
19
20
  RBS::Environment.from_loader(loader).resolve_type_names
20
21
  end
21
22
  end
data/bin/gem_rbs ADDED
@@ -0,0 +1,94 @@
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/postprocess.rb CHANGED
@@ -6,7 +6,7 @@ require 'bundler/inline'
6
6
 
7
7
  gemfile do
8
8
  source 'https://rubygems.org'
9
- gem 'rbs', '>= 0.19.0'
9
+ gem 'rbs', '1.0.0'
10
10
  end
11
11
 
12
12
  require 'rbs'
data/bin/rbs CHANGED
@@ -18,7 +18,7 @@ end
18
18
  exec(
19
19
  'rbs',
20
20
  # Require stdlibs
21
- '-rlogger', '-rpathname', '-rmutex_m', '-rdate',
21
+ '-rlogger', '-rpathname', '-rmutex_m', '-rdate', '-rmonitor', '-rsingleton', '-rtsort',
22
22
  "--repo=#{repo}",
23
23
  # Require Rails libraries
24
24
  v('-ractivesupport'), v('-ractionpack'), v('-ractivejob'), v('-ractivemodel'), v('-ractionview'), v('-ractiverecord'), v('-rrailties'),
@@ -68,6 +68,7 @@ using Module.new {
68
68
  kls.members << RBS::AST::Members::AttrAccessor.new(
69
69
  name: f.children.first,
70
70
  type: untyped,
71
+ kind: :instance,
71
72
  ivar_name: false,
72
73
  annotations: [],
73
74
  location: nil,
@@ -98,6 +99,7 @@ using Module.new {
98
99
  name: name,
99
100
  ivar_name: :"@_#{name}",
100
101
  type: RBS::Types::Bases::Any.new(location: nil),
102
+ kind: context.attribute_kind,
101
103
  location: nil,
102
104
  comment: comments[node.first_lineno - 1],
103
105
  annotations: []
@@ -111,6 +113,7 @@ using Module.new {
111
113
  name: name,
112
114
  ivar_name: :"@_#{name}",
113
115
  type: RBS::Types::Bases::Any.new(location: nil),
116
+ kind: context.attribute_kind,
114
117
  location: nil,
115
118
  comment: comments[node.first_lineno - 1],
116
119
  annotations: []
@@ -124,6 +127,7 @@ using Module.new {
124
127
  name: name,
125
128
  ivar_name: :"@_#{name}",
126
129
  type: RBS::Types::Bases::Any.new(location: nil),
130
+ kind: context.attribute_kind,
127
131
  location: nil,
128
132
  comment: comments[node.first_lineno - 1],
129
133
  annotations: []
@@ -171,7 +175,7 @@ using Module.new {
171
175
 
172
176
  def struct_as_superclass
173
177
  name = RBS::TypeName.new(name: 'Struct', namespace: RBS::Namespace.root)
174
- RBS::AST::Declarations::Class::Super.new(name: name, args: ['untyped'])
178
+ RBS::AST::Declarations::Class::Super.new(name: name, args: ['untyped'], location: nil)
175
179
  end
176
180
  end
177
181
  }