rbs 3.0.4 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +37 -0
- data/Gemfile.lock +13 -13
- data/Steepfile +1 -1
- data/core/io/buffer.rbs +1 -3
- data/core/module.rbs +4 -4
- data/core/object.rbs +2 -2
- data/core/rubygems/rubygems.rbs +0 -9
- data/core/string.rbs +4 -2
- data/ext/rbs_extension/parser.c +15 -11
- data/lib/rbs/cli.rb +107 -13
- data/lib/rbs/collection/config/lockfile_generator.rb +31 -29
- data/lib/rbs/definition_builder.rb +6 -9
- data/lib/rbs/environment.rb +2 -2
- data/lib/rbs/environment_loader.rb +3 -23
- data/lib/rbs/errors.rb +59 -2
- data/lib/rbs/file_finder.rb +31 -0
- data/lib/rbs/parser_aux.rb +4 -4
- data/lib/rbs/prototype/rb.rb +2 -1
- data/lib/rbs/subtractor.rb +184 -0
- data/lib/rbs/vendorer.rb +3 -3
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs/writer.rb +12 -0
- data/lib/rbs.rb +2 -0
- data/sig/cli.rbs +2 -0
- data/sig/collection/config/lockfile_generator.rbs +3 -1
- data/sig/environment_loader.rbs +17 -15
- data/sig/file_finder.rbs +6 -0
- data/sig/manifest.yaml +1 -0
- data/sig/parser.rbs +26 -8
- data/sig/repository.rbs +7 -5
- data/sig/shims/bundler.rbs +2 -0
- data/sig/subtractor.rbs +33 -0
- data/sig/types.rbs +10 -6
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae81eb182ddb9f708925c47a5c98adcf0535ec1ddd7ff06127ba2602f076daf9
|
4
|
+
data.tar.gz: f791c1e0d14b1407ec6ae8ecb0deec2f9c5069852b67d716243a9262b4d49831
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 11b754b36d8a1c903538638774e1b51fa6abb08370ae1009d0c0c389a12b72cd222b2706e543dc89bf66f889b0eb60598a32473ee7cf52517410161259c098c8
|
7
|
+
data.tar.gz: 4f3694a3bec4492b4b885cf22d1ecf2c8e3408fc55609db45081de6865d2925ec31c7bccfb05258198b390c34f3348fe0ffc33f8f47b82cfba44f1fb3d393b43
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,43 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
## 3.1.0 (2023-04-26)
|
6
|
+
|
7
|
+
### Signature updates
|
8
|
+
|
9
|
+
* `Module#attr_*` methods ([#1300](https://github.com/ruby/rbs/pull/1300))
|
10
|
+
* `Object#define_singleton_method` ([#1299](https://github.com/ruby/rbs/pull/1299))
|
11
|
+
* `String#scan` ([#1297](https://github.com/ruby/rbs/pull/1297))
|
12
|
+
* Removed `Gem.datadir` ([#1273](https://github.com/ruby/rbs/pull/1273))
|
13
|
+
|
14
|
+
### Language updates
|
15
|
+
|
16
|
+
### Library changes
|
17
|
+
|
18
|
+
* Use fenced code block instead of indented one in .rbs files ([#1312](https://github.com/ruby/rbs/pull/1312))
|
19
|
+
* Fix single use clause `:type_name` location ([#1307](https://github.com/ruby/rbs/pull/1307))
|
20
|
+
* Fix `InvalidOverloadMethodError` on overloading extended method ([#1294](https://github.com/ruby/rbs/pull/1294))
|
21
|
+
* Fix super class of `NoTypeFoundError` from `BaseError` to `DefinitionError` ([#1290](https://github.com/ruby/rbs/pull/1290))
|
22
|
+
* Support `#detailed_message` for `NonregularTypeAliasError`, `CyclicTypeParameterBound`, `InconsistentClassModuleAliasError` and `CyclicClassAliasDefinitionError` ([#1289](https://github.com/ruby/rbs/pull/1289))
|
23
|
+
* Implement `rbs subtract` command ([#1287](https://github.com/ruby/rbs/pull/1287))
|
24
|
+
* Support `#detailed_message` for `InvalidVarianceAnnotationError`, `RecursiveAliasDefinitionError`, `MixinClassError` and `RecursiveTypeAliasError` ([#1285](https://github.com/ruby/rbs/pull/1285))
|
25
|
+
* Support `#detailed_message` for `NoTypeError`, `InheritModuleError`, `NoSelfTypeFoundError` and `NoMixinFoundError` ([#1280](https://github.com/ruby/rbs/pull/1280))
|
26
|
+
* Validate duplicate type aliases ([#1279](https://github.com/ruby/rbs/pull/1279))
|
27
|
+
* Add `-e`, `--type`, and `--method-type` options to `rbs parse` ([#1252](https://github.com/ruby/rbs/pull/1252))
|
28
|
+
|
29
|
+
#### rbs prototype
|
30
|
+
|
31
|
+
* Convert `include` in `class << self` to `extend` by `prototype rb` ([#1255](https://github.com/ruby/rbs/pull/1255))
|
32
|
+
|
33
|
+
#### rbs collection
|
34
|
+
|
35
|
+
* Skip loading `#gemspec` gems via RBS collection ([#1319](https://github.com/ruby/rbs/pull/1319))
|
36
|
+
|
37
|
+
### Miscellaneous
|
38
|
+
|
39
|
+
* Run `bundle install` automatically in `bin/steep` ([#1308](https://github.com/ruby/rbs/pull/1308))
|
40
|
+
* Fix warnings ([#1314](https://github.com/ruby/rbs/pull/1314))
|
41
|
+
|
5
42
|
## 3.0.4 (2023-03-13)
|
6
43
|
|
7
44
|
### Library changes
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rbs (3.0
|
4
|
+
rbs (3.1.0)
|
5
5
|
|
6
6
|
PATH
|
7
7
|
remote: test/assets/test-gem
|
@@ -11,8 +11,8 @@ PATH
|
|
11
11
|
GEM
|
12
12
|
remote: https://rubygems.org/
|
13
13
|
specs:
|
14
|
-
addressable (2.8.
|
15
|
-
public_suffix (>= 2.0.2, <
|
14
|
+
addressable (2.8.4)
|
15
|
+
public_suffix (>= 2.0.2, < 6.0)
|
16
16
|
ast (2.4.2)
|
17
17
|
dbm (1.1.0)
|
18
18
|
debase (0.2.5.beta2)
|
@@ -27,12 +27,12 @@ GEM
|
|
27
27
|
rainbow (>= 3.0, < 4.0)
|
28
28
|
strong_json (>= 1.1, < 2.2)
|
29
29
|
json (2.6.3)
|
30
|
-
json-schema (
|
30
|
+
json-schema (4.0.0)
|
31
31
|
addressable (>= 2.8)
|
32
32
|
marcel (1.0.2)
|
33
|
-
minitest (5.
|
33
|
+
minitest (5.18.0)
|
34
34
|
parallel (1.22.1)
|
35
|
-
parser (3.2.
|
35
|
+
parser (3.2.2.0)
|
36
36
|
ast (~> 2.4.1)
|
37
37
|
power_assert (2.0.2)
|
38
38
|
prime (0.1.2)
|
@@ -40,14 +40,14 @@ GEM
|
|
40
40
|
singleton
|
41
41
|
psych (4.0.6)
|
42
42
|
stringio
|
43
|
-
public_suffix (
|
43
|
+
public_suffix (5.0.1)
|
44
44
|
rainbow (3.1.1)
|
45
45
|
rake (13.0.6)
|
46
46
|
rake-compiler (1.2.1)
|
47
47
|
rake
|
48
48
|
rdoc (6.4.0)
|
49
49
|
psych (>= 4.0.0)
|
50
|
-
regexp_parser (2.
|
50
|
+
regexp_parser (2.8.0)
|
51
51
|
rexml (3.2.5)
|
52
52
|
rspec (3.12.0)
|
53
53
|
rspec-core (~> 3.12.0)
|
@@ -62,25 +62,25 @@ GEM
|
|
62
62
|
diff-lcs (>= 1.2.0, < 2.0)
|
63
63
|
rspec-support (~> 3.12.0)
|
64
64
|
rspec-support (3.12.0)
|
65
|
-
rubocop (1.
|
65
|
+
rubocop (1.50.2)
|
66
66
|
json (~> 2.3)
|
67
67
|
parallel (~> 1.10)
|
68
68
|
parser (>= 3.2.0.0)
|
69
69
|
rainbow (>= 2.2.2, < 4.0)
|
70
70
|
regexp_parser (>= 1.8, < 3.0)
|
71
71
|
rexml (>= 3.2.5, < 4.0)
|
72
|
-
rubocop-ast (>= 1.
|
72
|
+
rubocop-ast (>= 1.28.0, < 2.0)
|
73
73
|
ruby-progressbar (~> 1.7)
|
74
74
|
unicode-display_width (>= 2.4.0, < 3.0)
|
75
|
-
rubocop-ast (1.
|
75
|
+
rubocop-ast (1.28.0)
|
76
76
|
parser (>= 3.2.1.0)
|
77
77
|
rubocop-rubycw (0.1.6)
|
78
78
|
rubocop (~> 1.0)
|
79
79
|
ruby-debug-ide (0.7.3)
|
80
80
|
rake (>= 0.8.1)
|
81
|
-
ruby-progressbar (1.
|
81
|
+
ruby-progressbar (1.13.0)
|
82
82
|
singleton (0.1.1)
|
83
|
-
stackprof (0.2.
|
83
|
+
stackprof (0.2.25)
|
84
84
|
stringio (3.0.4)
|
85
85
|
strong_json (2.1.2)
|
86
86
|
tempfile (0.1.3)
|
data/Steepfile
CHANGED
@@ -9,7 +9,7 @@ target :lib do
|
|
9
9
|
"lib/rbs/test.rb"
|
10
10
|
)
|
11
11
|
|
12
|
-
library "set", "pathname", "json", "logger", "monitor", "tsort", "uri", 'dbm', 'pstore', 'singleton', 'shellwords', 'fileutils', 'find', 'digest'
|
12
|
+
library "set", "pathname", "json", "logger", "monitor", "tsort", "uri", 'dbm', 'pstore', 'singleton', 'shellwords', 'fileutils', 'find', 'digest', 'abbrev'
|
13
13
|
signature 'stdlib/yaml/0'
|
14
14
|
signature "stdlib/strscan/0/"
|
15
15
|
signature "stdlib/optparse/0/"
|
data/core/io/buffer.rbs
CHANGED
@@ -541,13 +541,11 @@ class IO
|
|
541
541
|
|
542
542
|
# <!--
|
543
543
|
# rdoc-file=io_buffer.c
|
544
|
-
# - read(io,
|
544
|
+
# - read(io, length, [offset]) -> read length or -errno
|
545
545
|
# -->
|
546
546
|
# Read at most `length` bytes from `io` into the buffer, starting at `offset`.
|
547
547
|
# If an error occurs, return `-errno`.
|
548
548
|
#
|
549
|
-
# If `length` is not given, read until the end of the buffer.
|
550
|
-
#
|
551
549
|
# If `offset` is not given, read from the beginning of the buffer.
|
552
550
|
#
|
553
551
|
# If `length` is 0, read nothing.
|
data/core/module.rbs
CHANGED
@@ -284,7 +284,7 @@ class Module < Object
|
|
284
284
|
# end
|
285
285
|
# Mod.instance_methods.sort #=> [:one, :one=, :two, :two=]
|
286
286
|
#
|
287
|
-
def attr_accessor: (*
|
287
|
+
def attr_accessor: (*Object::name arg0) -> Array[Symbol]
|
288
288
|
|
289
289
|
# <!--
|
290
290
|
# rdoc-file=object.c
|
@@ -298,7 +298,7 @@ class Module < Object
|
|
298
298
|
# in turn. String arguments are converted to symbols. Returns an array of
|
299
299
|
# defined method names as symbols.
|
300
300
|
#
|
301
|
-
def attr_reader: (*
|
301
|
+
def attr_reader: (*Object::name arg0) -> Array[Symbol]
|
302
302
|
|
303
303
|
# <!--
|
304
304
|
# rdoc-file=object.c
|
@@ -309,7 +309,7 @@ class Module < Object
|
|
309
309
|
# *symbol*`.id2name`. String arguments are converted to symbols. Returns an
|
310
310
|
# array of defined method names as symbols.
|
311
311
|
#
|
312
|
-
def attr_writer: (*
|
312
|
+
def attr_writer: (*Object::name arg0) -> Array[Symbol]
|
313
313
|
|
314
314
|
# <!--
|
315
315
|
# rdoc-file=load.c
|
@@ -1629,5 +1629,5 @@ class Module < Object
|
|
1629
1629
|
# `attr_reader(name)` but deprecated. Returns an array of defined method names
|
1630
1630
|
# as symbols.
|
1631
1631
|
#
|
1632
|
-
def attr: (*
|
1632
|
+
def attr: (*Object::name arg0) -> Array[Symbol]
|
1633
1633
|
end
|
data/core/object.rbs
CHANGED
@@ -205,8 +205,8 @@ class Object < BasicObject
|
|
205
205
|
# chris.define_singleton_method(:greet) {|greeting| "#{greeting}, I'm Chris!" }
|
206
206
|
# chris.greet("Hi") #=> "Hi, I'm Chris!"
|
207
207
|
#
|
208
|
-
def define_singleton_method: (
|
209
|
-
| (
|
208
|
+
def define_singleton_method: (name, Method | UnboundMethod) -> Symbol
|
209
|
+
| (name) { (*untyped) -> untyped } -> Symbol
|
210
210
|
|
211
211
|
# <!--
|
212
212
|
# rdoc-file=io.c
|
data/core/rubygems/rubygems.rbs
CHANGED
@@ -261,15 +261,6 @@ module Gem
|
|
261
261
|
#
|
262
262
|
def self.data_home: () -> String
|
263
263
|
|
264
|
-
# <!--
|
265
|
-
# rdoc-file=lib/rubygems.rb
|
266
|
-
# - datadir(gem_name)
|
267
|
-
# -->
|
268
|
-
# The path to the data directory specified by the gem name. If the package is
|
269
|
-
# not available as a gem, return nil.
|
270
|
-
#
|
271
|
-
def self.datadir: (String gem_name) -> String?
|
272
|
-
|
273
264
|
# <!--
|
274
265
|
# rdoc-file=lib/rubygems/defaults.rb
|
275
266
|
# - default_bindir()
|
data/core/string.rbs
CHANGED
@@ -2600,8 +2600,10 @@ class String
|
|
2600
2600
|
# <<cruel>> <<world>>
|
2601
2601
|
# rceu lowlr
|
2602
2602
|
#
|
2603
|
-
def scan: (Regexp
|
2604
|
-
| (Regexp
|
2603
|
+
def scan: (Regexp pattern) -> Array[String | Array[String]]
|
2604
|
+
| (Regexp pattern) { (String | Array[String]) -> void } -> self
|
2605
|
+
| (string pattern) -> Array[String]
|
2606
|
+
| (string pattern) { (String) -> void } -> self
|
2605
2607
|
|
2606
2608
|
# <!--
|
2607
2609
|
# rdoc-file=string.c
|
data/ext/rbs_extension/parser.c
CHANGED
@@ -2649,13 +2649,9 @@ void parse_use_clauses(parserstate *state, VALUE clauses) {
|
|
2649
2649
|
|
2650
2650
|
VALUE location = rbs_new_location(state->buffer, clause_range);
|
2651
2651
|
rbs_loc *loc = rbs_check_location(location);
|
2652
|
-
rbs_loc_add_required_child(loc, rb_intern("type_name"),
|
2653
|
-
|
2654
|
-
|
2655
|
-
}
|
2656
|
-
if (!null_range_p(new_name_range)) {
|
2657
|
-
rbs_loc_add_optional_child(loc, rb_intern("new_name"), new_name_range);
|
2658
|
-
}
|
2652
|
+
rbs_loc_add_required_child(loc, rb_intern("type_name"), type_name_range);
|
2653
|
+
rbs_loc_add_optional_child(loc, rb_intern("keyword"), keyword_range);
|
2654
|
+
rbs_loc_add_optional_child(loc, rb_intern("new_name"), new_name_range);
|
2659
2655
|
|
2660
2656
|
rb_ary_push(clauses, rbs_ast_directives_use_single_clause(type_name, new_name, location));
|
2661
2657
|
|
@@ -2739,7 +2735,7 @@ VALUE parse_signature(parserstate *state) {
|
|
2739
2735
|
}
|
2740
2736
|
|
2741
2737
|
static VALUE
|
2742
|
-
rbsparser_parse_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, VALUE variables)
|
2738
|
+
rbsparser_parse_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, VALUE variables, VALUE require_eof)
|
2743
2739
|
{
|
2744
2740
|
parserstate *parser = alloc_parser(buffer, FIX2INT(start_pos), FIX2INT(end_pos), variables);
|
2745
2741
|
|
@@ -2749,13 +2745,17 @@ rbsparser_parse_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, V
|
|
2749
2745
|
|
2750
2746
|
VALUE type = parse_type(parser);
|
2751
2747
|
|
2748
|
+
if (RB_TEST(require_eof)) {
|
2749
|
+
parser_advance_assert(parser, pEOF);
|
2750
|
+
}
|
2751
|
+
|
2752
2752
|
free_parser(parser);
|
2753
2753
|
|
2754
2754
|
return type;
|
2755
2755
|
}
|
2756
2756
|
|
2757
2757
|
static VALUE
|
2758
|
-
rbsparser_parse_method_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, VALUE variables)
|
2758
|
+
rbsparser_parse_method_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, VALUE variables, VALUE require_eof)
|
2759
2759
|
{
|
2760
2760
|
parserstate *parser = alloc_parser(buffer, FIX2INT(start_pos), FIX2INT(end_pos), variables);
|
2761
2761
|
|
@@ -2765,6 +2765,10 @@ rbsparser_parse_method_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end
|
|
2765
2765
|
|
2766
2766
|
VALUE method_type = parse_method_type(parser);
|
2767
2767
|
|
2768
|
+
if (RB_TEST(require_eof)) {
|
2769
|
+
parser_advance_assert(parser, pEOF);
|
2770
|
+
}
|
2771
|
+
|
2768
2772
|
free_parser(parser);
|
2769
2773
|
|
2770
2774
|
return method_type;
|
@@ -2782,7 +2786,7 @@ rbsparser_parse_signature(VALUE self, VALUE buffer, VALUE end_pos)
|
|
2782
2786
|
|
2783
2787
|
void rbs__init_parser(void) {
|
2784
2788
|
RBS_Parser = rb_define_class_under(RBS, "Parser", rb_cObject);
|
2785
|
-
rb_define_singleton_method(RBS_Parser, "_parse_type", rbsparser_parse_type,
|
2786
|
-
rb_define_singleton_method(RBS_Parser, "_parse_method_type", rbsparser_parse_method_type,
|
2789
|
+
rb_define_singleton_method(RBS_Parser, "_parse_type", rbsparser_parse_type, 5);
|
2790
|
+
rb_define_singleton_method(RBS_Parser, "_parse_method_type", rbsparser_parse_method_type, 5);
|
2787
2791
|
rb_define_singleton_method(RBS_Parser, "_parse_signature", rbsparser_parse_signature, 2);
|
2788
2792
|
}
|
data/lib/rbs/cli.rb
CHANGED
@@ -3,6 +3,8 @@
|
|
3
3
|
require "open3"
|
4
4
|
require "optparse"
|
5
5
|
require "shellwords"
|
6
|
+
require "abbrev"
|
7
|
+
require "stringio"
|
6
8
|
|
7
9
|
module RBS
|
8
10
|
class CLI
|
@@ -88,7 +90,7 @@ module RBS
|
|
88
90
|
@stderr = stderr
|
89
91
|
end
|
90
92
|
|
91
|
-
COMMANDS = [:ast, :annotate, :list, :ancestors, :methods, :method, :validate, :constant, :paths, :prototype, :vendor, :parse, :test, :collection]
|
93
|
+
COMMANDS = [:ast, :annotate, :list, :ancestors, :methods, :method, :validate, :constant, :paths, :prototype, :vendor, :parse, :test, :collection, :subtract]
|
92
94
|
|
93
95
|
def parse_logging_options(opts)
|
94
96
|
opts.on("--log-level LEVEL", "Specify log level (defaults to `warn`)") do |level|
|
@@ -450,7 +452,6 @@ Examples:
|
|
450
452
|
EOU
|
451
453
|
|
452
454
|
opts.on("--silent") do
|
453
|
-
require "stringio"
|
454
455
|
@stdout = StringIO.new
|
455
456
|
end
|
456
457
|
end.parse!(args)
|
@@ -920,6 +921,10 @@ Options:
|
|
920
921
|
end
|
921
922
|
|
922
923
|
def run_parse(args, options)
|
924
|
+
parse_method = :parse_signature
|
925
|
+
# @type var e_code: String?
|
926
|
+
e_code = nil
|
927
|
+
|
923
928
|
OptionParser.new do |opts|
|
924
929
|
opts.banner = <<-EOB
|
925
930
|
Usage: rbs parse [files...]
|
@@ -929,22 +934,35 @@ Parse given RBS files and print syntax errors.
|
|
929
934
|
Examples:
|
930
935
|
|
931
936
|
$ rbs parse sig/app/models.rbs sig/app/controllers.rbs
|
937
|
+
|
938
|
+
Options:
|
932
939
|
EOB
|
933
|
-
end.parse!(args)
|
934
940
|
|
935
|
-
|
941
|
+
opts.on('-e CODE', 'One line RBS script to parse') { |e| e_code = e }
|
942
|
+
opts.on('--type', 'Parse code as a type') { |e| parse_method = :parse_type }
|
943
|
+
opts.on('--method-type', 'Parse code as a method type') { |e| parse_method = :parse_method_type }
|
944
|
+
end.parse!(args)
|
936
945
|
|
937
946
|
syntax_error = false
|
938
|
-
args.
|
947
|
+
bufs = args.flat_map do |path|
|
939
948
|
path = Pathname(path)
|
940
|
-
|
941
|
-
|
942
|
-
|
943
|
-
|
944
|
-
|
945
|
-
|
946
|
-
|
949
|
+
FileFinder.each_file(path, skip_hidden: false, immediate: true).map do |file_path|
|
950
|
+
Buffer.new(content: file_path.read, name: file_path)
|
951
|
+
end
|
952
|
+
end
|
953
|
+
bufs << Buffer.new(content: e_code, name: '-e') if e_code
|
954
|
+
|
955
|
+
bufs.each do |buf|
|
956
|
+
RBS.logger.info "Parsing #{buf.name}..."
|
957
|
+
case parse_method
|
958
|
+
when :parse_signature
|
959
|
+
Parser.parse_signature(buf)
|
960
|
+
else
|
961
|
+
Parser.public_send(parse_method, buf, require_eof: true)
|
947
962
|
end
|
963
|
+
rescue RBS::ParsingError => ex
|
964
|
+
stdout.puts ex.message
|
965
|
+
syntax_error = true
|
948
966
|
end
|
949
967
|
|
950
968
|
exit 1 if syntax_error
|
@@ -1078,7 +1096,8 @@ EOB
|
|
1078
1096
|
config_path = options.config_path or raise
|
1079
1097
|
lock_path = Collection::Config.to_lockfile_path(config_path)
|
1080
1098
|
|
1081
|
-
|
1099
|
+
subcommand = Abbrev.abbrev(['install', 'update', 'help'])[args[0]] || args[0]
|
1100
|
+
case subcommand
|
1082
1101
|
when 'install'
|
1083
1102
|
unless params[:frozen]
|
1084
1103
|
Collection::Config.generate_lockfile(config_path: config_path, definition: Bundler.definition)
|
@@ -1154,5 +1173,80 @@ EOB
|
|
1154
1173
|
opts.on('--frozen') if args[0] == 'install'
|
1155
1174
|
end
|
1156
1175
|
end
|
1176
|
+
|
1177
|
+
def run_subtract(args, _)
|
1178
|
+
write_to_file = false
|
1179
|
+
# @type var subtrahend_paths: Array[String]
|
1180
|
+
subtrahend_paths = []
|
1181
|
+
|
1182
|
+
opts = OptionParser.new do |opts|
|
1183
|
+
opts.banner = <<~HELP
|
1184
|
+
Usage:
|
1185
|
+
rbs subtract [options...] minuend.rbs [minuend2.rbs, ...] subtrahend.rbs
|
1186
|
+
rbs subtract [options...] minuend.rbs [minuend2.rbs, ...] --subtrahend subtrahend_1.rbs --subtrahend subtrahend_2.rbs
|
1187
|
+
|
1188
|
+
Remove duplications between RBS files.
|
1189
|
+
|
1190
|
+
Examples:
|
1191
|
+
|
1192
|
+
# Generate RBS files from the codebase.
|
1193
|
+
$ rbs prototype rb lib/ > generated.rbs
|
1194
|
+
|
1195
|
+
# Write more descrictive types by hand.
|
1196
|
+
$ $EDITOR handwritten.rbs
|
1197
|
+
|
1198
|
+
# Remove hand-written method definitions from generated.rbs.
|
1199
|
+
$ rbs subtract --write generated.rbs handwritten.rbs
|
1200
|
+
|
1201
|
+
Options:
|
1202
|
+
HELP
|
1203
|
+
opts.on('-w', '--write', 'Overwrite files directry') { write_to_file = true }
|
1204
|
+
opts.on('--subtrahend=PATH', '') { |path| subtrahend_paths << path }
|
1205
|
+
opts.parse!(args)
|
1206
|
+
end
|
1207
|
+
|
1208
|
+
if subtrahend_paths.empty?
|
1209
|
+
*minuend_paths, subtrahend_path = args
|
1210
|
+
unless subtrahend_path
|
1211
|
+
stdout.puts opts.help
|
1212
|
+
exit 1
|
1213
|
+
end
|
1214
|
+
subtrahend_paths << subtrahend_path
|
1215
|
+
else
|
1216
|
+
minuend_paths = args
|
1217
|
+
end
|
1218
|
+
|
1219
|
+
if minuend_paths.empty?
|
1220
|
+
stdout.puts opts.help
|
1221
|
+
exit 1
|
1222
|
+
end
|
1223
|
+
|
1224
|
+
subtrahend = Environment.new.tap do |env|
|
1225
|
+
loader = EnvironmentLoader.new(core_root: nil)
|
1226
|
+
subtrahend_paths.each do |path|
|
1227
|
+
loader.add(path: Pathname(path))
|
1228
|
+
end
|
1229
|
+
loader.load(env: env)
|
1230
|
+
end
|
1231
|
+
|
1232
|
+
minuend_paths.each do |minuend_path|
|
1233
|
+
FileFinder.each_file(Pathname(minuend_path), immediate: true, skip_hidden: true) do |rbs_path|
|
1234
|
+
buf = Buffer.new(name: rbs_path, content: rbs_path.read)
|
1235
|
+
_, dirs, decls = Parser.parse_signature(buf)
|
1236
|
+
subtracted = Subtractor.new(decls, subtrahend).call
|
1237
|
+
|
1238
|
+
io = StringIO.new
|
1239
|
+
w = Writer.new(out: io)
|
1240
|
+
w.write(dirs)
|
1241
|
+
w.write(subtracted)
|
1242
|
+
|
1243
|
+
if write_to_file
|
1244
|
+
rbs_path.write(io.string)
|
1245
|
+
else
|
1246
|
+
stdout.puts(io.string)
|
1247
|
+
end
|
1248
|
+
end
|
1249
|
+
end
|
1250
|
+
end
|
1157
1251
|
end
|
1158
1252
|
end
|
@@ -76,7 +76,7 @@ module RBS
|
|
76
76
|
end
|
77
77
|
|
78
78
|
if spec = gem_hash[dep.name]
|
79
|
-
assign_gem(name: dep.name, version: spec.version, ignored_gems: ignored_gems, src_data: nil)
|
79
|
+
assign_gem(name: dep.name, version: spec.version, ignored_gems: ignored_gems, src_data: nil, skip: dep.source.is_a?(Bundler::Source::Gemspec))
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
@@ -91,43 +91,45 @@ module RBS
|
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
|
-
private def assign_gem(name:, version:, src_data:, ignored_gems:)
|
94
|
+
private def assign_gem(name:, version:, src_data:, ignored_gems:, skip: false)
|
95
95
|
return if ignored_gems.include?(name)
|
96
96
|
return if lockfile.gems.key?(name)
|
97
97
|
|
98
|
-
|
98
|
+
unless skip
|
99
|
+
# @type var locked: Lockfile::library?
|
99
100
|
|
100
|
-
|
101
|
-
|
102
|
-
|
101
|
+
if existing_lockfile
|
102
|
+
locked = existing_lockfile.gems[name]
|
103
|
+
end
|
103
104
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
105
|
+
# If rbs_collection.lock.yaml contain the gem, use it.
|
106
|
+
# Else find the gem from gem_collection.
|
107
|
+
unless locked
|
108
|
+
source =
|
109
|
+
if src_data
|
110
|
+
Sources.from_config_entry(src_data, base_directory: config.config_path.dirname)
|
111
|
+
else
|
112
|
+
find_source(name: name)
|
113
|
+
end
|
114
|
+
|
115
|
+
if source
|
116
|
+
installed_version = version
|
117
|
+
best_version = find_best_version(version: installed_version, versions: source.versions(name))
|
118
|
+
|
119
|
+
locked = {
|
120
|
+
name: name,
|
121
|
+
version: best_version.to_s,
|
122
|
+
source: source,
|
123
|
+
}
|
112
124
|
end
|
113
|
-
|
114
|
-
if source
|
115
|
-
installed_version = version
|
116
|
-
best_version = find_best_version(version: installed_version, versions: source.versions(name))
|
117
|
-
|
118
|
-
locked = {
|
119
|
-
name: name,
|
120
|
-
version: best_version.to_s,
|
121
|
-
source: source,
|
122
|
-
}
|
123
125
|
end
|
124
|
-
end
|
125
126
|
|
126
|
-
|
127
|
-
|
127
|
+
if locked
|
128
|
+
lockfile.gems[name] = locked
|
128
129
|
|
129
|
-
|
130
|
-
|
130
|
+
locked[:source].dependencies_of(locked[:name], locked[:version])&.each do |dep|
|
131
|
+
assign_stdlib(name: dep["name"], from_gem: name)
|
132
|
+
end
|
131
133
|
end
|
132
134
|
end
|
133
135
|
|
@@ -239,14 +239,6 @@ module RBS
|
|
239
239
|
definition.class_variables.merge!(defn.class_variables)
|
240
240
|
end
|
241
241
|
|
242
|
-
all_interfaces = one_ancestors.each_extended_interface.flat_map do |interface|
|
243
|
-
other_interfaces = ancestor_builder.interface_ancestors(interface.name).ancestors #: Array[Definition::Ancestor::Instance]
|
244
|
-
other_interfaces = other_interfaces.select {|ancestor| ancestor.source }
|
245
|
-
[interface, *other_interfaces]
|
246
|
-
end
|
247
|
-
interface_methods = interface_methods(all_interfaces)
|
248
|
-
import_methods(definition, type_name, methods, interface_methods, Substitution.new)
|
249
|
-
|
250
242
|
one_ancestors.each_extended_module do |mod|
|
251
243
|
mod.args.each do |arg|
|
252
244
|
validate_type_presence(arg)
|
@@ -256,7 +248,12 @@ module RBS
|
|
256
248
|
define_instance(definition, mod.name, subst)
|
257
249
|
end
|
258
250
|
|
259
|
-
|
251
|
+
all_interfaces = one_ancestors.each_extended_interface.flat_map do |interface|
|
252
|
+
other_interfaces = ancestor_builder.interface_ancestors(interface.name).ancestors #: Array[Definition::Ancestor::Instance]
|
253
|
+
other_interfaces = other_interfaces.select {|ancestor| ancestor.source }
|
254
|
+
[interface, *other_interfaces]
|
255
|
+
end
|
256
|
+
interface_methods = interface_methods(all_interfaces)
|
260
257
|
import_methods(definition, type_name, methods, interface_methods, Substitution.new)
|
261
258
|
|
262
259
|
entry.decls.each do |d|
|
data/lib/rbs/environment.rb
CHANGED
@@ -365,7 +365,7 @@ module RBS
|
|
365
365
|
name = decl.name.with_prefix(namespace)
|
366
366
|
|
367
367
|
if interface_entry = interface_decls[name]
|
368
|
-
DuplicatedDeclarationError.new(name, decl, interface_entry.decl)
|
368
|
+
raise DuplicatedDeclarationError.new(name, decl, interface_entry.decl)
|
369
369
|
end
|
370
370
|
|
371
371
|
interface_decls[name] = InterfaceEntry.new(name: name, decl: decl, outer: outer)
|
@@ -374,7 +374,7 @@ module RBS
|
|
374
374
|
name = decl.name.with_prefix(namespace)
|
375
375
|
|
376
376
|
if entry = type_alias_decls[name]
|
377
|
-
DuplicatedDeclarationError.new(name, decl, entry.decl)
|
377
|
+
raise DuplicatedDeclarationError.new(name, decl, entry.decl)
|
378
378
|
end
|
379
379
|
|
380
380
|
type_alias_decls[name] = TypeAliasEntry.new(name: name, decl: decl, outer: outer)
|
@@ -12,6 +12,8 @@ module RBS
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
+
include FileFinder
|
16
|
+
|
15
17
|
Library = _ = Struct.new(:name, :version, keyword_init: true)
|
16
18
|
|
17
19
|
attr_reader :core_root
|
@@ -129,35 +131,13 @@ module RBS
|
|
129
131
|
end
|
130
132
|
end
|
131
133
|
|
132
|
-
def each_file(path, immediate:, skip_hidden:, &block)
|
133
|
-
case
|
134
|
-
when path.file?
|
135
|
-
if path.extname == ".rbs" || immediate
|
136
|
-
yield path
|
137
|
-
end
|
138
|
-
|
139
|
-
when path.directory?
|
140
|
-
if path.basename.to_s.start_with?("_")
|
141
|
-
if skip_hidden
|
142
|
-
unless immediate
|
143
|
-
return
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
path.children.sort.each do |child|
|
149
|
-
each_file(child, immediate: false, skip_hidden: skip_hidden, &block)
|
150
|
-
end
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
134
|
def each_signature
|
155
135
|
files = Set[]
|
156
136
|
|
157
137
|
each_dir do |source, dir|
|
158
138
|
skip_hidden = !source.is_a?(Pathname)
|
159
139
|
|
160
|
-
each_file(dir, skip_hidden: skip_hidden, immediate: true) do |path|
|
140
|
+
FileFinder.each_file(dir, skip_hidden: skip_hidden, immediate: true) do |path|
|
161
141
|
next if files.include?(path)
|
162
142
|
|
163
143
|
files << path
|