rbs 0.11.0 → 0.13.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.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +9 -9
  3. data/CHANGELOG.md +24 -0
  4. data/Rakefile +16 -6
  5. data/Steepfile +28 -0
  6. data/bin/steep +4 -0
  7. data/bin/test_runner.rb +7 -5
  8. data/lib/rbs/ast/comment.rb +7 -1
  9. data/lib/rbs/ast/declarations.rb +15 -9
  10. data/lib/rbs/buffer.rb +1 -1
  11. data/lib/rbs/cli.rb +12 -4
  12. data/lib/rbs/constant.rb +1 -1
  13. data/lib/rbs/constant_table.rb +9 -8
  14. data/lib/rbs/definition.rb +22 -13
  15. data/lib/rbs/definition_builder.rb +79 -55
  16. data/lib/rbs/environment.rb +28 -10
  17. data/lib/rbs/environment_loader.rb +12 -12
  18. data/lib/rbs/location.rb +1 -5
  19. data/lib/rbs/method_type.rb +5 -5
  20. data/lib/rbs/namespace.rb +14 -3
  21. data/lib/rbs/parser.y +0 -8
  22. data/lib/rbs/prototype/rb.rb +3 -4
  23. data/lib/rbs/prototype/rbi.rb +1 -2
  24. data/lib/rbs/substitution.rb +4 -3
  25. data/lib/rbs/type_name.rb +18 -1
  26. data/lib/rbs/type_name_resolver.rb +10 -3
  27. data/lib/rbs/types.rb +27 -21
  28. data/lib/rbs/variance_calculator.rb +9 -6
  29. data/lib/rbs/version.rb +1 -1
  30. data/lib/rbs/writer.rb +25 -15
  31. data/sig/annotation.rbs +26 -0
  32. data/sig/buffer.rbs +28 -0
  33. data/sig/builtin_names.rbs +41 -0
  34. data/sig/comment.rbs +26 -0
  35. data/sig/constant.rbs +21 -0
  36. data/sig/constant_table.rbs +30 -0
  37. data/sig/declarations.rbs +202 -0
  38. data/sig/definition.rbs +129 -0
  39. data/sig/definition_builder.rbs +94 -0
  40. data/sig/environment.rbs +94 -0
  41. data/sig/environment_loader.rbs +58 -0
  42. data/sig/location.rbs +52 -0
  43. data/sig/members.rbs +160 -0
  44. data/sig/method_types.rbs +40 -0
  45. data/sig/namespace.rbs +124 -0
  46. data/sig/polyfill.rbs +3 -0
  47. data/sig/rbs.rbs +3 -0
  48. data/sig/substitution.rbs +39 -0
  49. data/sig/type_name_resolver.rbs +24 -0
  50. data/sig/typename.rbs +70 -0
  51. data/sig/types.rbs +361 -0
  52. data/sig/util.rbs +13 -0
  53. data/sig/variance_calculator.rbs +35 -0
  54. data/sig/version.rbs +3 -0
  55. data/sig/writer.rbs +40 -0
  56. data/stdlib/bigdecimal/big_decimal.rbs +887 -0
  57. data/stdlib/bigdecimal/math/big_math.rbs +142 -0
  58. data/stdlib/builtin/builtin.rbs +0 -3
  59. data/stdlib/builtin/kernel.rbs +2 -0
  60. data/stdlib/builtin/math.rbs +26 -26
  61. data/stdlib/builtin/struct.rbs +9 -10
  62. data/stdlib/forwardable/forwardable.rbs +204 -0
  63. data/stdlib/pathname/pathname.rbs +2 -0
  64. data/stdlib/pty/pty.rbs +5 -29
  65. data/stdlib/set/set.rbs +1 -1
  66. data/stdlib/uri/file.rbs +167 -0
  67. data/stdlib/uri/generic.rbs +875 -0
  68. data/stdlib/uri/http.rbs +158 -0
  69. data/stdlib/uri/https.rbs +108 -0
  70. data/stdlib/uri/ldap.rbs +224 -0
  71. data/stdlib/uri/ldaps.rbs +108 -0
  72. data/steep/Gemfile +3 -0
  73. data/steep/Gemfile.lock +51 -0
  74. metadata +43 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fe2c03d38ca9869e7c7bdf283f56e61e5ccbad3831b524ba14c6fd31941985e2
4
- data.tar.gz: d9cc6563f7eb3173410209daeda05a8216d2ade261a3f05d3f258d0782a08e64
3
+ metadata.gz: 74ff49fc40275647a8d06dcda0f3a210454b5e1d73a4a08a65e3b6c9147cceb5
4
+ data.tar.gz: fe69119582d76d69cfe3bcf91bf902bdb5c329b32787adfccb473da93ed99a71
5
5
  SHA512:
6
- metadata.gz: fb4391906260a8414e2c2ef44ded8fda974c495830fb6c2335204052cba67260f1f0d0fd44dd560c3c05b7cdcaffa20ee24d7d16a529c37f900689bb084ce198
7
- data.tar.gz: 68cb88ea29edbce815a6887b716f20c640b651628b55b9b3e660e6bc93c218081464888632f9df7bc42da49700c253bc74fb9d01970f7bf13a2425742890431e
6
+ metadata.gz: b35ce98a3183f6c2ef53e9fafb52620d837fb2d2300a27bedf4d81a45b245769c42770ae9b6b07a2ad873bcf6dd191f7faf3986cc895646f515f395fc5003bc8
7
+ data.tar.gz: 479296ba1c726b424d86817b0b33956b270a6f7df56ff40f41122f600e49ab3858a3f438ce4277bc0bbff6be32b74d41b470c956c0a7977d5d067ab016d4e3df
@@ -15,20 +15,20 @@ jobs:
15
15
  - master-nightly-bionic
16
16
  - 2.6.5-bionic
17
17
  - 2.7.0-bionic
18
+ job:
19
+ - test
20
+ - stdlib_test
21
+ - rubocop validate test_doc build test_generate_stdlib
18
22
  container:
19
23
  image: rubylang/ruby:${{ matrix.container_tag }}
20
24
  steps:
21
25
  - uses: actions/checkout@v1
22
- - name: Run test
26
+ - name: Install
23
27
  run: |
24
28
  ruby -v
25
29
  gem install bundler
26
30
  bin/setup
27
- bundle exec rake test
28
- bundle exec rake stdlib_test
29
- bundle exec rake rubocop
30
- bundle exec rake validate
31
- bundle exec rake test_doc
32
- bundle exec rake build
33
- RBS_GENERATE_TEST_PATH=/tmp/Array_test.rb bundle exec rake 'generate:stdlib_test[Array]'
34
- ruby -c /tmp/Array_test.rb
31
+ - name: Run test
32
+ run: |
33
+ bundle exec rake ${{ matrix.job }}
34
+ if: "!(matrix.job == 'stdlib_test' && contains(matrix.container_tag, '2.6.5'))"
@@ -2,6 +2,30 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 0.13.1 (2020-09-09)
6
+
7
+ * Fix test for CI of ruby/ruby ([#412](https://github.com/ruby/rbs/pull/412))
8
+
9
+ ## 0.13.0 (2020-09-09)
10
+
11
+ * Signature updates for `URI` classes.
12
+ * Fix tests ([#410](https://github.com/ruby/rbs/pull/410))
13
+ * Add `--silent` option for `rbs validate` ([#411](https://github.com/ruby/rbs/pull/411))
14
+
15
+ ## 0.12.2 (2020-09-17)
16
+
17
+ * Minor signature update for `pty`
18
+ * Fix `PTY` stdlib test
19
+
20
+ ## 0.12.1 (2020-09-16)
21
+
22
+ This version is to improve Ruby 3 testing compatibility. Nothing changed for users.
23
+
24
+ ## 0.12.0 (2020-09-15)
25
+
26
+ * Signature updates for `forwardable`, `struct`, `set`, `URI::Generic`, `URI::File`, and `BigDecimal`.
27
+ * Define `.new` methods from `initialize` included from modules [#390](https://github.com/ruby/rbs/pull/390)
28
+
5
29
  ## 0.11.0 (2020-08-31)
6
30
 
7
31
  * Signature update for `date/datetime` [#367](https://github.com/ruby/rbs/pull/367)
data/Rakefile CHANGED
@@ -1,5 +1,10 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rake/testtask"
3
+ require "rbconfig"
4
+
5
+ ruby = ENV["RUBY"] || RbConfig.ruby
6
+ rbs = File.join(__dir__, "exe/rbs")
7
+ bin = File.join(__dir__, "bin")
3
8
 
4
9
  Rake::TestTask.new(:test) do |t|
5
10
  t.libs << "test"
@@ -16,23 +21,23 @@ task :test_doc => :parser do
16
21
  `git ls-files -z`.split("\x0").select do |file| Pathname(file).extname == ".md" end
17
22
  end
18
23
 
19
- sh "ruby bin/run_in_md.rb #{files.join(" ")}"
24
+ sh "#{ruby} #{__dir__}/bin/run_in_md.rb #{files.join(" ")}"
20
25
  end
21
26
 
22
27
  task :validate => :parser do
23
- sh "rbs validate"
28
+ sh "#{ruby} #{rbs} validate --silent"
24
29
 
25
30
  FileList["stdlib/*"].each do |path|
26
31
  next if path =~ %r{stdlib/builtin}
27
- sh "rbs -r#{File.basename(path)} validate"
32
+ sh "#{ruby} #{rbs} -r#{File.basename(path)} validate --silent"
28
33
  end
29
34
  end
30
35
 
31
36
  FileList["test/stdlib/**/*_test.rb"].each do |test|
32
- multitask test => :parser do
33
- sh "ruby bin/test_runner.rb #{test}"
37
+ task test => :parser do
38
+ sh "#{ruby} -Ilib #{bin}/test_runner.rb #{test}"
34
39
  end
35
- multitask stdlib_test: test
40
+ task stdlib_test: test
36
41
  end
37
42
 
38
43
  task :rubocop do
@@ -171,4 +176,9 @@ namespace :generate do
171
176
  end
172
177
  end
173
178
 
179
+ task :test_generate_stdlib do
180
+ sh "RBS_GENERATE_TEST_PATH=/tmp/Array_test.rb rake 'generate:stdlib_test[Array]'"
181
+ sh "ruby -c /tmp/Array_test.rb"
182
+ end
183
+
174
184
  CLEAN.include("lib/rbs/parser.rb")
@@ -0,0 +1,28 @@
1
+ target :lib do
2
+ signature "sig"
3
+ check "lib"
4
+
5
+ vendor stdlib: "stdlib"
6
+ library "set", "pathname", "json", "logger"
7
+ end
8
+
9
+ # target :lib do
10
+ # signature "sig"
11
+ #
12
+ # check "lib" # Directory name
13
+ # check "Gemfile" # File name
14
+ # check "app/models/**/*.rb" # Glob
15
+ # # ignore "lib/templates/*.rb"
16
+ #
17
+ # # library "pathname", "set" # Standard libraries
18
+ # # library "strong_json" # Gems
19
+ # end
20
+
21
+ # target :spec do
22
+ # signature "sig", "sig-private"
23
+ #
24
+ # check "spec"
25
+ #
26
+ # # library "pathname", "set" # Standard libraries
27
+ # # library "rspec"
28
+ # end
@@ -0,0 +1,4 @@
1
+ #!/bin/sh
2
+
3
+ GEMFILE=$(cd $(dirname $0); pwd)/../steep/Gemfile
4
+ bundle exec --gemfile=${GEMFILE} steep $*
@@ -1,12 +1,14 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- RUBY_27 = Gem::Version.new(RUBY_VERSION).yield_self do |ruby_version|
4
- Gem::Version.new('2.7.0') <= ruby_version && ruby_version < Gem::Version.new("2.8.0")
3
+ $LOAD_PATH << File.join(__dir__, "../lib")
4
+
5
+ IS_RUBY_27 = Gem::Version.new(RUBY_VERSION).yield_self do |ruby_version|
6
+ Gem::Version.new('2.7.0') <= ruby_version &&
7
+ ruby_version <= Gem::Version.new('2.8.0')
5
8
  end
6
9
 
7
- unless RUBY_27
8
- STDERR.puts "🚨🚨🚨 stdlib test requires Ruby 2.7 but RUBY_VERSION==#{RUBY_VERSION}, exiting... 🚨🚨🚨"
9
- exit
10
+ unless IS_RUBY_27
11
+ STDERR.puts "⚠️⚠️⚠️⚠️ stdlib test assumes Ruby 2.7 but RUBY_VERSION==#{RUBY_VERSION} ⚠️⚠️⚠️⚠️"
10
12
  end
11
13
 
12
14
  ARGV.each do |arg|
@@ -25,7 +25,13 @@ module RBS
25
25
 
26
26
  def concat(string:, location:)
27
27
  @string.concat string
28
- @location.concat location
28
+
29
+ if loc = @location
30
+ loc.concat location
31
+ else
32
+ @location = location
33
+ end
34
+
29
35
  self
30
36
  end
31
37
  end
@@ -7,7 +7,7 @@ module RBS
7
7
  class ModuleTypeParams
8
8
  attr_reader :params
9
9
 
10
- TypeParam = Struct.new(:name, :variance, :skip_validation, keyword_init: true) do
10
+ TypeParam = _ = Struct.new(:name, :variance, :skip_validation, keyword_init: true) do
11
11
  def to_json(*a)
12
12
  {
13
13
  name: name,
@@ -47,7 +47,11 @@ module RBS
47
47
  end
48
48
 
49
49
  def each(&block)
50
- params.each(&block)
50
+ if block
51
+ params.each(&block)
52
+ else
53
+ params.each
54
+ end
51
55
  end
52
56
 
53
57
  def self.empty
@@ -55,11 +59,13 @@ module RBS
55
59
  end
56
60
 
57
61
  def variance(name)
58
- self[name].variance
62
+ var = self[name] or raise
63
+ var.variance
59
64
  end
60
65
 
61
66
  def skip_validation?(name)
62
- self[name].skip_validation
67
+ var = self[name] or raise
68
+ var.skip_validation
63
69
  end
64
70
 
65
71
  def empty?
@@ -85,7 +91,7 @@ module RBS
85
91
  if block_given?
86
92
  members.each do |member|
87
93
  if member.is_a?(Members::Base)
88
- yield member
94
+ yield(_ = member)
89
95
  end
90
96
  end
91
97
  else
@@ -96,8 +102,8 @@ module RBS
96
102
  def each_decl
97
103
  if block_given?
98
104
  members.each do |member|
99
- if member.is_a?(Declarations::Base)
100
- yield member
105
+ if member.is_a?(Base)
106
+ yield(_ = member)
101
107
  end
102
108
  end
103
109
  else
@@ -108,9 +114,9 @@ module RBS
108
114
 
109
115
  module MixinHelper
110
116
  def each_mixin(&block)
111
- if block_given?
117
+ if block
112
118
  @mixins ||= begin
113
- members.select do |member|
119
+ _ = members.select do |member|
114
120
  case member
115
121
  when Members::Include, Members::Extend, Members::Prepend
116
122
  true
@@ -23,7 +23,7 @@ module RBS
23
23
 
24
24
  def pos_to_loc(pos)
25
25
  index = ranges.bsearch_index do |range|
26
- pos < range.end
26
+ pos < range.end ? true : false
27
27
  end
28
28
 
29
29
  if index
@@ -1,3 +1,4 @@
1
+ require "open3"
1
2
  require "optparse"
2
3
  require "shellwords"
3
4
 
@@ -383,6 +384,11 @@ Examples:
383
384
 
384
385
  $ rbs validate
385
386
  EOU
387
+
388
+ opts.on("--silent") do
389
+ require "stringio"
390
+ @stdout = StringIO.new
391
+ end
386
392
  end.parse!(args)
387
393
 
388
394
  loader = EnvironmentLoader.new()
@@ -488,7 +494,7 @@ Show paths to directories where the RBS files are loaded from.
488
494
  Examples:
489
495
 
490
496
  $ rbs paths
491
- $ tbs -r set paths
497
+ $ rbs -r set paths
492
498
  EOU
493
499
  end.parse!(args)
494
500
 
@@ -543,7 +549,7 @@ EOU
543
549
  Usage: rbs prototype runtime [options...] [pattern...]
544
550
 
545
551
  Generate RBS prototype based on runtime introspection.
546
- It loads Ruby code specified in [options] and generates RBS prototypes for classes matches to [pattern].
552
+ It loads Ruby code specified in [options] and generates RBS prototypes for classes matches to [pattern].
547
553
 
548
554
  Examples:
549
555
 
@@ -808,8 +814,10 @@ EOB
808
814
  'RBS_TEST_TARGET' => (targets.join(',') unless targets.empty?)
809
815
  }
810
816
 
811
- system(env_hash, *args)
812
- $?
817
+ out, err, status = Open3.capture3(env_hash, *args)
818
+ stdout.print(out)
819
+ stderr.print(err)
820
+ status
813
821
  end
814
822
  end
815
823
  end
@@ -2,7 +2,7 @@ module RBS
2
2
  class Constant
3
3
  attr_reader :name
4
4
  attr_reader :type
5
- attr_reader :declaration
5
+ attr_reader :entry
6
6
 
7
7
  def initialize(name:, type:, entry:)
8
8
  @name = name
@@ -47,6 +47,8 @@ module RBS
47
47
 
48
48
  head, *tail = split_name(name)
49
49
 
50
+ raise unless head
51
+
50
52
  head_constant = case
51
53
  when name.absolute?
52
54
  name_to_constant(TypeName.new(name: head, namespace: Namespace.root))
@@ -57,11 +59,13 @@ module RBS
57
59
  resolve_constant_reference_inherit(head, scopes: constant_scopes(context.first.to_type_name))
58
60
  end
59
61
 
60
- if head_constant
61
- tail.inject(head_constant) do |constant, name|
62
- resolve_constant_reference_inherit name,
63
- scopes: constant_scopes(constant.name),
64
- no_object: constant.name != BuiltinNames::Object.name
62
+ tail.inject(head_constant) do |constant, name|
63
+ if constant
64
+ resolve_constant_reference_inherit(
65
+ name,
66
+ scopes: constant_scopes(constant.name),
67
+ no_object: constant.name != BuiltinNames::Object.name
68
+ )
65
69
  end
66
70
  end
67
71
  end
@@ -150,9 +154,6 @@ module RBS
150
154
  when Environment::ModuleEntry
151
155
  constant_scopes0 BuiltinNames::Module.name, scopes: scopes
152
156
  constant_scopes_module name, scopes: scopes
153
-
154
- else
155
- raise "Unexpected declaration: #{name} (#{entry.class})"
156
157
  end
157
158
 
158
159
  scopes
@@ -47,9 +47,9 @@ module RBS
47
47
  end
48
48
 
49
49
  def overload?
50
- case member
50
+ case mem = member
51
51
  when AST::Members::MethodDefinition
52
- member.overload?
52
+ mem.overload?
53
53
  else
54
54
  false
55
55
  end
@@ -69,11 +69,17 @@ module RBS
69
69
  end
70
70
 
71
71
  def defined_in
72
- @defined_in ||= defs.last.defined_in
72
+ @defined_in ||= begin
73
+ last_def = defs.last or raise
74
+ last_def.defined_in
75
+ end
73
76
  end
74
77
 
75
78
  def implemented_in
76
- @implemented_in ||= defs.last.implemented_in
79
+ @implemented_in ||= begin
80
+ last_def = defs.last or raise
81
+ last_def.implemented_in
82
+ end
77
83
  end
78
84
 
79
85
  def method_types
@@ -81,7 +87,7 @@ module RBS
81
87
  end
82
88
 
83
89
  def comments
84
- @comments ||= defs.map(&:comment).compact
90
+ @comments ||= _ = defs.map(&:comment).compact
85
91
  end
86
92
 
87
93
  def annotations
@@ -126,8 +132,8 @@ module RBS
126
132
  end
127
133
 
128
134
  module Ancestor
129
- Instance = Struct.new(:name, :args, keyword_init: true)
130
- Singleton = Struct.new(:name, keyword_init: true)
135
+ Instance = _ = Struct.new(:name, :args, keyword_init: true)
136
+ Singleton = _ = Struct.new(:name, keyword_init: true)
131
137
  end
132
138
 
133
139
  class InstanceAncestors
@@ -219,7 +225,10 @@ module RBS
219
225
  end
220
226
 
221
227
  def interface?
222
- entry.is_a?(Environment::SingleEntry) && entry.decl.is_a?(AST::Declarations::Interface)
228
+ case en = entry
229
+ when Environment::SingleEntry
230
+ en.decl.is_a?(AST::Declarations::Interface)
231
+ end
223
232
  end
224
233
 
225
234
  def class_type?
@@ -239,16 +248,16 @@ module RBS
239
248
  end
240
249
 
241
250
  def type_params_decl
242
- case entry
251
+ case en = entry
243
252
  when Environment::ClassEntry, Environment::ModuleEntry
244
- entry.type_params
253
+ en.type_params
245
254
  when Environment::SingleEntry
246
- entry.decl.type_params
255
+ en.decl.type_params
247
256
  end
248
257
  end
249
258
 
250
259
  def sub(s)
251
- definition = self.class.new(type_name: type_name, self_type: self_type.sub(s), ancestors: ancestors, entry: entry)
260
+ definition = self.class.new(type_name: type_name, self_type: _ = self_type.sub(s), ancestors: ancestors, entry: entry)
252
261
 
253
262
  definition.methods.merge!(methods.transform_values {|method| method.sub(s) })
254
263
  definition.instance_variables.merge!(instance_variables.transform_values {|v| v.sub(s) })
@@ -268,7 +277,7 @@ module RBS
268
277
  end
269
278
 
270
279
  def each_type(&block)
271
- if block_given?
280
+ if block
272
281
  methods.each_value do |method|
273
282
  if method.defined_in == type_name
274
283
  method.method_types.each do |method_type|