rbs 3.3.0.pre.1 → 3.3.0.pre.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0ce19044f9943d12d17256e09e0296aca13a4284b9e2f76de3b130c002ed9244
4
- data.tar.gz: d3b2b843cf28aeb5ef4608356aa0eb2d958d4392f541fe91e5e00e7f68a40fc4
3
+ metadata.gz: 7dc5c4dc317f2e52f4626a4fec99d333422d69e6e18ec9fcad02d710bf17a212
4
+ data.tar.gz: e9da32752089f0d923e82ee304e36751f28263adeb5893860d4f0f84f5b62caf
5
5
  SHA512:
6
- metadata.gz: 02e143cf64af949a560f3b41b9d1a1756375ae0456182a3b727b985db88d5f5fe092887d21c3237036ddf177f19661ef80f03c6daa96fdd6840e727d579f1018
7
- data.tar.gz: 38df75f2912926a63b6082a4515b063e8f4c71d9e3c820adb0b2ee6e7030464fa3702faad28b04b221facb31c79c5aff0f96b7f4d2624b1b399378fc5bcd6168
6
+ metadata.gz: eb722e98a22685907310de9465590da330bf86f4387fc40e65ce692a9fbbd6839d850a706ca7f489954048d40555d3040e83ffddb452494529febfcd98dbeff5
7
+ data.tar.gz: 2ed8a1e9a4bbb28341f5c578903a94a23ea3b6bcc95721308dcfddce514f269755f0f7baaaf2cb0a4511c7895fc39992fe2cdfe95ad33e66f045971cb137587e
data/.rubocop.yml CHANGED
@@ -1,6 +1,6 @@
1
1
  require: rubocop-rubycw
2
2
  AllCops:
3
- TargetRubyVersion: 2.7
3
+ TargetRubyVersion: 3.0
4
4
  DisabledByDefault: true
5
5
  Exclude:
6
6
  - 'vendor/bundle/**/*'
data/CHANGELOG.md CHANGED
@@ -2,6 +2,25 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 3.3.0.pre.2 (2023-11-02)
6
+
7
+ ### Signature updates
8
+
9
+ * net/smtp ([#1560](https://github.com/ruby/rbs/pull/1560))
10
+ * open-uri ([#1592](https://github.com/ruby/rbs/pull/1592))
11
+ * `Set` ([#1595](https://github.com/ruby/rbs/pull/1595))
12
+
13
+ ### Library changes
14
+
15
+ * Fixup validation ([#1596](https://github.com/ruby/rbs/pull/1596))
16
+ * Print type syntax errors instead of raising error ([#1594](https://github.com/ruby/rbs/pull/1594))
17
+
18
+ #### rbs prototype
19
+
20
+ * Fix error when MASGN ([#1593](https://github.com/ruby/rbs/pull/1593))
21
+ * Support cases where `Module#constants` has been redefined ([#1591](https://github.com/ruby/rbs/pull/1591))
22
+ * [prototype runtime] Fix error if direct inherited ([#1590](https://github.com/ruby/rbs/pull/1590))
23
+
5
24
  ## 3.3.0.pre.1 (2023-10-31)
6
25
 
7
26
  ### Signature updates
@@ -38,7 +57,6 @@
38
57
  * `constants.rbs` ([#1531](https://github.com/ruby/rbs/pull/1531))
39
58
  * `::interned` ([#1499](https://github.com/ruby/rbs/pull/1499), [#1488](https://github.com/ruby/rbs/pull/1488))
40
59
 
41
-
42
60
  ### Language updates
43
61
 
44
62
  * Add `__todo__` type ([#1520](https://github.com/ruby/rbs/pull/1520))
@@ -50,8 +68,10 @@
50
68
  * Add `Abbrev` to runtime dependency ([#1573](https://github.com/ruby/rbs/pull/1573))
51
69
  * Avoid an error when parsing files including SyntaxError ([#1574](https://github.com/ruby/rbs/pull/1574))
52
70
  * Implement rbs diff command ([#1459](https://github.com/ruby/rbs/pull/1459))
53
- * Add another type syntax validation ([#1566](https://github.com/ruby/rbs/pull/1566))* Mark global variables ([#1551](https://github.com/ruby/rbs/pull/1551))
54
- * Show location of type by method command ([#1537](https://github.com/ruby/rbs/pull/1537))* Make alias and interface names absolute ([#1502](https://github.com/ruby/rbs/pull/1502))
71
+ * Add another type syntax validation ([#1566](https://github.com/ruby/rbs/pull/1566))
72
+ * Mark global variables ([#1551](https://github.com/ruby/rbs/pull/1551))
73
+ * Show location of type by method command ([#1537](https://github.com/ruby/rbs/pull/1537))
74
+ * Make alias and interface names absolute ([#1502](https://github.com/ruby/rbs/pull/1502))
55
75
  * Better record type format ([#1501](https://github.com/ruby/rbs/pull/1501))
56
76
  * Should keep escape of alias and attr family ([#1486](https://github.com/ruby/rbs/pull/1486))
57
77
  * Fix error when undefined interface or alias ([#1465](https://github.com/ruby/rbs/pull/1465))
data/Gemfile CHANGED
@@ -22,6 +22,9 @@ gem "rdoc", "~> 6.4.0"
22
22
  # Test gems
23
23
  gem "rbs-amber", path: "test/assets/test-gem"
24
24
 
25
+ # Bundled gems
26
+ gem "net-smtp"
27
+
25
28
  group :minitest do
26
29
  gem "minitest"
27
30
  end
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rbs (3.3.0.pre.1)
4
+ rbs (3.3.0.pre.2)
5
5
  abbrev
6
6
 
7
7
  PATH
@@ -30,6 +30,10 @@ GEM
30
30
  language_server-protocol (3.17.0.3)
31
31
  marcel (1.0.2)
32
32
  minitest (5.20.0)
33
+ net-protocol (0.2.1)
34
+ timeout
35
+ net-smtp (0.4.0)
36
+ net-protocol
33
37
  parallel (1.23.0)
34
38
  parser (3.2.2.4)
35
39
  ast (~> 2.4.1)
@@ -82,6 +86,7 @@ GEM
82
86
  tempfile (0.1.3)
83
87
  test-unit (3.6.1)
84
88
  power_assert
89
+ timeout (0.4.0)
85
90
  unicode-display_width (2.5.0)
86
91
 
87
92
  PLATFORMS
@@ -95,6 +100,7 @@ DEPENDENCIES
95
100
  json
96
101
  json-schema
97
102
  minitest
103
+ net-smtp
98
104
  rake
99
105
  rake-compiler
100
106
  rbs!
data/core/set.rbs CHANGED
@@ -439,7 +439,7 @@ class Set[unchecked out A]
439
439
  # Set[1, 2, 3].disjoint? [3, 4] #=> false
440
440
  # Set[1, 2, 3].disjoint? 4..5 #=> true
441
441
  #
442
- def disjoint?: (self) -> bool
442
+ def disjoint?: (_Each[A]) -> bool
443
443
 
444
444
  # <!--
445
445
  # rdoc-file=lib/set.rb
@@ -502,7 +502,7 @@ class Set[unchecked out A]
502
502
  # Set[1, 2, 3].intersect? 4..5 #=> false
503
503
  # Set[1, 2, 3].intersect? [3, 4] #=> true
504
504
  #
505
- def intersect?: (self) -> bool
505
+ def intersect?: (_Each[A]) -> bool
506
506
 
507
507
  # <!--
508
508
  # rdoc-file=lib/set.rb
@@ -625,4 +625,5 @@ module Enumerable[unchecked out Elem]
625
625
  # Needs to `require "set"` to use this method.
626
626
  #
627
627
  def to_set: () -> Set[Elem]
628
+ | [T] { (Elem) -> T } -> Set[T]
628
629
  end
data/lib/rbs/cli.rb CHANGED
@@ -444,6 +444,8 @@ EOU
444
444
  end
445
445
 
446
446
  def run_validate(args, options)
447
+ stdout = stdout()
448
+
447
449
  OptionParser.new do |opts|
448
450
  opts.banner = <<EOU
449
451
  Usage: rbs validate
@@ -456,7 +458,7 @@ Examples:
456
458
  EOU
457
459
 
458
460
  opts.on("--silent") do
459
- @stdout = StringIO.new
461
+ stdout = StringIO.new
460
462
  end
461
463
  end.parse!(args)
462
464
 
@@ -466,17 +468,19 @@ EOU
466
468
  builder = DefinitionBuilder.new(env: env)
467
469
  validator = Validator.new(env: env, resolver: Resolver::TypeNameResolver.new(env))
468
470
 
471
+ syntax_errors = [] #: Array[String]
472
+
469
473
  no_self_type_validator = ->(type) {
470
474
  # @type var type: Types::t | MethodType
471
475
  if type.has_self_type?
472
- raise "#{type.location}: `self` type is not allowed in this context"
476
+ syntax_errors << "#{type.location}: `self` type is not allowed in this context"
473
477
  end
474
478
  }
475
479
 
476
480
  no_classish_type_validator = ->(type) {
477
481
  # @type var type: Types::t | MethodType
478
482
  if type.has_classish_type?
479
- raise "#{type.location}: `instance` or `class` type is not allowed in this context"
483
+ syntax_errors << "#{type.location}: `instance` or `class` type is not allowed in this context"
480
484
  end
481
485
  }
482
486
 
@@ -486,7 +490,7 @@ EOU
486
490
  next if type.is_a?(Types::Bases::Void)
487
491
  end
488
492
  if type.with_nonreturn_void?
489
- raise "#{type.location}: `void` type is only allowed in return type or generics parameter"
493
+ syntax_errors << "#{type.location}: `void` type is only allowed in return type or generics parameter"
490
494
  end
491
495
  }
492
496
 
@@ -621,6 +625,15 @@ EOU
621
625
  no_classish_type_validator[decl.decl.type]
622
626
  void_type_context_validator[decl.decl.type]
623
627
  end
628
+
629
+ unless syntax_errors.empty?
630
+ syntax_errors.sort!
631
+ syntax_errors.uniq!
632
+ syntax_errors.each do |message|
633
+ self.stdout.puts message
634
+ end
635
+ exit(1)
636
+ end
624
637
  end
625
638
 
626
639
  def run_constant(args, options)
@@ -246,7 +246,7 @@ module RBS
246
246
  end
247
247
  end
248
248
  value_node = node.children.last
249
- type = if value_node.type == :CALL && value_node.children[1] == :let
249
+ type = if value_node && value_node.type == :CALL && value_node.children[1] == :let
250
250
  type_node = each_arg(value_node.children[2]).to_a[1]
251
251
  type_of type_node, variables: current_module&.type_params || []
252
252
  else
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ module Prototype
5
+ class Runtime
6
+ module Reflection
7
+ def self.object_class(value)
8
+ @object_class ||= Object.instance_method(:class)
9
+ @object_class.bind_call(value)
10
+ end
11
+
12
+ def self.constants_of(mod, inherit = true)
13
+ @constants_of ||= Module.instance_method(:constants)
14
+ @constants_of.bind_call(mod, inherit)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -85,6 +85,16 @@ module RBS
85
85
  end
86
86
 
87
87
  class StructGenerator < ValueObjectBase
88
+ def self.generatable?(target)
89
+ return false unless target < Struct
90
+ # Avoid direct inherited class like `class Option < Struct`
91
+ return false unless target.respond_to?(:members)
92
+
93
+ true
94
+ end
95
+
96
+ private
97
+
88
98
  CAN_CALL_KEYWORD_INIT_P = Struct.new(:tmp).respond_to?(:keyword_init?)
89
99
 
90
100
  def build_super_class
@@ -104,31 +114,21 @@ module RBS
104
114
  [:new, :[]].map do |name|
105
115
  new_overloads = []
106
116
 
107
- if CAN_CALL_KEYWORD_INIT_P ? (@target_class.keyword_init? == false || @target_class.keyword_init? == nil) : true
108
- new_overloads << AST::Members::MethodDefinition::Overload.new(
109
- annotations: [],
110
- method_type: MethodType.new(
111
- type: Types::Function.empty(Types::Bases::Instance.new(location: nil)).update(
112
- optional_positionals: @target_class.members.map { |m| Types::Function::Param.new(name: m, type: untyped) },
113
- ),
114
- type_params: [],
115
- block: nil,
116
- location: nil,
117
- )
118
- )
119
- end
120
- if CAN_CALL_KEYWORD_INIT_P ? (@target_class.keyword_init? == true || @target_class.keyword_init? == nil) : true
121
- new_overloads << AST::Members::MethodDefinition::Overload.new(
122
- annotations: [],
123
- method_type: MethodType.new(
124
- type: Types::Function.empty(Types::Bases::Instance.new(location: nil)).update(
125
- optional_keywords: @target_class.members.to_h { |m| [m, Types::Function::Param.new(name: nil, type: untyped)] },
126
- ),
127
- type_params: [],
128
- block: nil,
129
- location: nil,
130
- )
131
- )
117
+ if CAN_CALL_KEYWORD_INIT_P
118
+ case @target_class.keyword_init?
119
+ when false
120
+ new_overloads << build_overload_for_positional_arguments
121
+ when true
122
+ new_overloads << build_overload_for_keyword_arguments
123
+ when nil
124
+ new_overloads << build_overload_for_positional_arguments
125
+ new_overloads << build_overload_for_keyword_arguments
126
+ else
127
+ raise
128
+ end
129
+ else
130
+ new_overloads << build_overload_for_positional_arguments
131
+ new_overloads << build_overload_for_keyword_arguments
132
132
  end
133
133
 
134
134
  AST::Members::MethodDefinition.new(
@@ -144,6 +144,34 @@ module RBS
144
144
  end
145
145
  end
146
146
 
147
+ def build_overload_for_positional_arguments
148
+ AST::Members::MethodDefinition::Overload.new(
149
+ annotations: [],
150
+ method_type: MethodType.new(
151
+ type: Types::Function.empty(Types::Bases::Instance.new(location: nil)).update(
152
+ optional_positionals: @target_class.members.map { |m| Types::Function::Param.new(name: m, type: untyped) },
153
+ ),
154
+ type_params: [],
155
+ block: nil,
156
+ location: nil,
157
+ )
158
+ )
159
+ end
160
+
161
+ def build_overload_for_keyword_arguments
162
+ AST::Members::MethodDefinition::Overload.new(
163
+ annotations: [],
164
+ method_type: MethodType.new(
165
+ type: Types::Function.empty(Types::Bases::Instance.new(location: nil)).update(
166
+ optional_keywords: @target_class.members.to_h { |m| [m, Types::Function::Param.new(name: nil, type: untyped)] },
167
+ ),
168
+ type_params: [],
169
+ block: nil,
170
+ location: nil,
171
+ )
172
+ )
173
+ end
174
+
147
175
  # def self.keyword_init?: () -> bool?
148
176
  def build_s_keyword_init_p
149
177
  return [] unless CAN_CALL_KEYWORD_INIT_P
@@ -179,6 +207,17 @@ module RBS
179
207
  end
180
208
 
181
209
  class DataGenerator < ValueObjectBase
210
+ def self.generatable?(target)
211
+ return false unless RUBY_VERSION >= '3.2'
212
+ return false unless target < Data
213
+ # Avoid direct inherited class like `class Option < Data`
214
+ return false unless target.respond_to?(:members)
215
+
216
+ true
217
+ end
218
+
219
+ private
220
+
182
221
  def build_super_class
183
222
  AST::Declarations::Class::Super.new(name: TypeName("::Data"), args: [], location: nil)
184
223
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require_relative 'runtime/helpers'
4
4
  require_relative 'runtime/value_object_generator'
5
+ require_relative 'runtime/reflection'
5
6
 
6
7
  module RBS
7
8
  module Prototype
@@ -422,7 +423,7 @@ module RBS
422
423
 
423
424
  def generate_constants(mod, decls)
424
425
  module_name = const_name!(mod)
425
- mod.constants(false).sort.each do |name|
426
+ Reflection.constants_of(mod, false).sort.each do |name|
426
427
  next if todo_object&.skip_constant?(module_name: module_name, name: name)
427
428
 
428
429
  begin
@@ -432,10 +433,10 @@ module RBS
432
433
  next
433
434
  end
434
435
 
435
- next if object_class(value).equal?(Class)
436
- next if object_class(value).equal?(Module)
436
+ next if Reflection.object_class(value).equal?(Class)
437
+ next if Reflection.object_class(value).equal?(Module)
437
438
 
438
- unless object_class(value).name
439
+ unless Reflection.object_class(value).name
439
440
  RBS.logger.warn("Skipping constant #{name} #{value} of #{mod} as an instance of anonymous class")
440
441
  next
441
442
  end
@@ -453,7 +454,7 @@ module RBS
453
454
  when ENV
454
455
  Types::ClassInstance.new(name: TypeName("::RBS::Unnamed::ENVClass"), args: [], location: nil)
455
456
  else
456
- value_type_name = to_type_name(const_name!(object_class(value)), full_name: true).absolute!
457
+ value_type_name = to_type_name(const_name!(Reflection.object_class(value)), full_name: true).absolute!
457
458
  args = type_args(value_type_name)
458
459
  Types::ClassInstance.new(name: value_type_name, args: args, location: nil)
459
460
  end
@@ -493,9 +494,9 @@ module RBS
493
494
  end #: AST::Declarations::Class?
494
495
 
495
496
  unless decl
496
- if mod < Struct
497
+ if StructGenerator.generatable?(mod)
497
498
  decl = StructGenerator.new(mod).build_decl
498
- elsif RUBY_VERSION >= '3.2' && mod < Data
499
+ elsif DataGenerator.generatable?(mod)
499
500
  decl = DataGenerator.new(mod).build_decl
500
501
  else
501
502
  decl = AST::Declarations::Class.new(
@@ -631,11 +632,6 @@ module RBS
631
632
  destination
632
633
  end
633
634
 
634
- def object_class(value)
635
- @object_class ||= Object.instance_method(:class)
636
- @object_class.bind_call(value)
637
- end
638
-
639
635
  def type_args(type_name)
640
636
  if class_decl = env.class_decls.fetch(type_name.absolute!, nil)
641
637
  class_decl.type_params.size.times.map { Types::Bases::Any.new(location: nil) }
data/lib/rbs/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RBS
4
- VERSION = "3.3.0.pre.1"
4
+ VERSION = "3.3.0.pre.2"
5
5
  end
@@ -1,6 +1,73 @@
1
1
  module RBS
2
2
  module Prototype
3
3
  class Runtime
4
+ module Reflection
5
+ def self.object_class: (Module value) -> Class
6
+
7
+ def self.constants_of: (Module mod, ?bool inherit) -> Array[Symbol]
8
+ end
9
+
10
+ module Helpers
11
+ private
12
+
13
+ def const_name: (Module const) -> String?
14
+
15
+ def const_name!: (Module const) -> String
16
+
17
+ # Returns the exact name & not compactly declared name
18
+ def only_name: (Module mod) -> String
19
+
20
+ def to_type_name: (String name, ?full_name: bool) -> TypeName
21
+
22
+ def untyped: () -> untyped
23
+ end
24
+
25
+ class ValueObjectBase
26
+ include Helpers
27
+
28
+ def build_decl: () -> AST::Declarations::Class
29
+
30
+ private
31
+
32
+ def build_member_accessors: (untyped ast_members_class) -> untyped
33
+
34
+ def build_s_members: () -> Array[AST::Members::MethodDefinition]
35
+
36
+ def initialize: (Class target_class) -> void
37
+ end
38
+
39
+ class StructGenerator < ValueObjectBase
40
+ def self.generatable?: (Class target) -> bool
41
+
42
+ private
43
+
44
+ def add_decl_members: (AST::Declarations::Class decl) -> void
45
+
46
+ def build_overload_for_keyword_arguments: () -> AST::Members::MethodDefinition::Overload
47
+
48
+ def build_overload_for_positional_arguments: () -> AST::Members::MethodDefinition::Overload
49
+
50
+ def build_s_keyword_init_p: () -> Array[AST::Members::MethodDefinition]
51
+
52
+ def build_s_new: () -> Array[AST::Members::MethodDefinition]
53
+
54
+ def build_super_class: () -> AST::Declarations::Class::Super
55
+
56
+ CAN_CALL_KEYWORD_INIT_P: bool
57
+ end
58
+
59
+ class DataGenerator < ValueObjectBase
60
+ def self.generatable?: (Class target) -> bool
61
+
62
+ private
63
+
64
+ def add_decl_members: (AST::Declarations::Class decl) -> void
65
+
66
+ def build_s_new: () -> Array[AST::Members::MethodDefinition]
67
+
68
+ def build_super_class: () -> AST::Declarations::Class::Super
69
+ end
70
+
4
71
  class Todo
5
72
  @builder: DefinitionBuilder
6
73
 
@@ -58,8 +125,6 @@ module RBS
58
125
 
59
126
  def decls: () -> Array[AST::Declarations::t]
60
127
 
61
- def to_type_name: (String name, ?full_name: bool) -> TypeName
62
-
63
128
  def each_mixined_module: (TypeName type_name, Module mod) { (TypeName, TypeName, mixin_class) -> void } -> void
64
129
 
65
130
  def each_mixined_module_one: (TypeName type_name, Module mod) { (TypeName, TypeName, bool) -> void } -> void
@@ -87,13 +152,6 @@ module RBS
87
152
  # This generates/finds declarations in nested form & returns the last array of declarations
88
153
  def ensure_outer_module_declarations: (Module mod) -> Array[AST::Declarations::Class::member]
89
154
 
90
- # Returns the exact name & not compactly declared name
91
- def only_name: (Module mod) -> String
92
-
93
- def const_name: (Module const) -> String?
94
-
95
- def const_name!: (Module const) -> String
96
-
97
155
  def object_class: (untyped) -> untyped
98
156
 
99
157
  def type_args: (TypeName type_name) -> Array[Types::t]
@@ -0,0 +1,2 @@
1
+ dependencies:
2
+ - name: net-protocol
@@ -0,0 +1,55 @@
1
+ module Net
2
+ # Module mixed in to all SMTP error classes
3
+ module SMTPError
4
+ attr_reader response: Response
5
+
6
+ def initialize: (Response response, ?message: String) -> void
7
+
8
+ def message: () -> String?
9
+ end
10
+
11
+ # Represents an SMTP authentication error.
12
+ class SMTPAuthenticationError < ProtoAuthError
13
+ include SMTPError
14
+ end
15
+
16
+ # Represents SMTP error code 4xx, a temporary error.
17
+ class SMTPServerBusy < ProtoServerError
18
+ include SMTPError
19
+ end
20
+
21
+ # Represents an SMTP command syntax error (error code 500)
22
+ class SMTPSyntaxError < ProtoSyntaxError
23
+ include SMTPError
24
+ end
25
+
26
+ # Represents a fatal SMTP error (error code 5xx, except for 500)
27
+ class SMTPFatalError < ProtoFatalError
28
+ include SMTPError
29
+ end
30
+
31
+ # Unexpected reply code returned from server.
32
+ class SMTPUnknownError < ProtoUnknownError
33
+ include SMTPError
34
+ end
35
+
36
+ # Command is not supported on server.
37
+ class SMTPUnsupportedCommand < ProtocolError
38
+ include SMTPError
39
+ end
40
+
41
+ class SMTP < Protocol
42
+ def self.start: (String address, ?Integer port, ?tls_verify: bool, ?tls_hostname: String?, ?helo: String, ?user: String?, ?password: String?, ?auth_type: Symbol) -> instance
43
+ | [T] (String address, ?Integer port, ?tls_verify: bool, ?tls_hostname: String?, ?helo: String, ?user: String?, ?password: String?, ?auth_type: Symbol) { (instance) -> T } -> T
44
+ | (String address, ?Integer port, ?String helo, ?String? user, ?String? password, ?Symbol auth_type) -> instance
45
+ | [T] (String address, ?Integer port, ?String helo, ?String? user, ?String? password, ?Symbol auth_type) { (instance) -> T } -> T
46
+
47
+ def initialize: (String address, ?Integer port) -> void
48
+ def send_message: (_Each[String] mail_src, String from_addr, *String to_addrs) -> void
49
+ end
50
+
51
+ class Response
52
+ end
53
+
54
+ class SMTPSession = SMTP
55
+ end
@@ -0,0 +1,3 @@
1
+ dependencies:
2
+ - name: tempfile
3
+ - name: uri
@@ -0,0 +1,341 @@
1
+ %a{annotate:rdoc:skip}
2
+ module URI
3
+ # <!--
4
+ # rdoc-file=lib/open-uri.rb
5
+ # - open(name, *rest, &block)
6
+ # -->
7
+ # Allows the opening of various resources including URIs.
8
+ #
9
+ # If the first argument responds to the 'open' method, 'open' is called on it
10
+ # with the rest of the arguments.
11
+ #
12
+ # If the first argument is a string that begins with `(protocol)://`, it is
13
+ # parsed by URI.parse. If the parsed object responds to the 'open' method,
14
+ # 'open' is called on it with the rest of the arguments.
15
+ #
16
+ # Otherwise, Kernel#open is called.
17
+ #
18
+ # OpenURI::OpenRead#open provides URI::HTTP#open, URI::HTTPS#open and
19
+ # URI::FTP#open, Kernel#open.
20
+ #
21
+ # We can accept URIs and strings that begin with http://, https:// and ftp://.
22
+ # In these cases, the opened file object is extended by OpenURI::Meta.
23
+ #
24
+ def self.open: (String name, ?String mode, ?Integer perm, ?untyped options) -> (StringIO & OpenURI::Meta | Tempfile & OpenURI::Meta)
25
+ | [T] (String name, ?String mode, ?Integer perm, ?untyped options) { (StringIO | Tempfile) -> T } -> T
26
+ end
27
+
28
+ # <!-- rdoc-file=lib/open-uri.rb -->
29
+ # OpenURI is an easy-to-use wrapper for Net::HTTP, Net::HTTPS and Net::FTP.
30
+ #
31
+ # ## Example
32
+ #
33
+ # It is possible to open an http, https or ftp URL as though it were a file:
34
+ #
35
+ # URI.open("http://www.ruby-lang.org/") {|f|
36
+ # f.each_line {|line| p line}
37
+ # }
38
+ #
39
+ # The opened file has several getter methods for its meta-information, as
40
+ # follows, since it is extended by OpenURI::Meta.
41
+ #
42
+ # URI.open("http://www.ruby-lang.org/en") {|f|
43
+ # f.each_line {|line| p line}
44
+ # p f.base_uri # <URI::HTTP:0x40e6ef2 URL:http://www.ruby-lang.org/en/>
45
+ # p f.content_type # "text/html"
46
+ # p f.charset # "iso-8859-1"
47
+ # p f.content_encoding # []
48
+ # p f.last_modified # Thu Dec 05 02:45:02 UTC 2002
49
+ # }
50
+ #
51
+ # Additional header fields can be specified by an optional hash argument.
52
+ #
53
+ # URI.open("http://www.ruby-lang.org/en/",
54
+ # "User-Agent" => "Ruby/#{RUBY_VERSION}",
55
+ # "From" => "foo@bar.invalid",
56
+ # "Referer" => "http://www.ruby-lang.org/") {|f|
57
+ # # ...
58
+ # }
59
+ #
60
+ # The environment variables such as http_proxy, https_proxy and ftp_proxy are in
61
+ # effect by default. Here we disable proxy:
62
+ #
63
+ # URI.open("http://www.ruby-lang.org/en/", :proxy => nil) {|f|
64
+ # # ...
65
+ # }
66
+ #
67
+ # See OpenURI::OpenRead.open and URI.open for more on available options.
68
+ #
69
+ # URI objects can be opened in a similar way.
70
+ #
71
+ # uri = URI.parse("http://www.ruby-lang.org/en/")
72
+ # uri.open {|f|
73
+ # # ...
74
+ # }
75
+ #
76
+ # URI objects can be read directly. The returned string is also extended by
77
+ # OpenURI::Meta.
78
+ #
79
+ # str = uri.read
80
+ # p str.base_uri
81
+ #
82
+ # Author
83
+ # : Tanaka Akira <akr@m17n.org>
84
+ #
85
+ module OpenURI
86
+ # <!-- rdoc-file=lib/open-uri.rb -->
87
+ # Mixin for holding meta-information.
88
+ #
89
+ module Meta
90
+ # <!-- rdoc-file=lib/open-uri.rb -->
91
+ # returns an Array that consists of status code and message.
92
+ #
93
+ attr_accessor status: [ String, String ]
94
+
95
+ # <!-- rdoc-file=lib/open-uri.rb -->
96
+ # returns a URI that is the base of relative URIs in the data. It may differ
97
+ # from the URI supplied by a user due to redirection.
98
+ #
99
+ attr_accessor base_uri: URI::Generic
100
+
101
+ # <!-- rdoc-file=lib/open-uri.rb -->
102
+ # returns a Hash that represents header fields. The Hash keys are downcased for
103
+ # canonicalization. The Hash values are a field body. If there are multiple
104
+ # field with same field name, the field values are concatenated with a comma.
105
+ #
106
+ attr_reader meta: Hash[String, String]
107
+
108
+ # <!--
109
+ # rdoc-file=lib/open-uri.rb
110
+ # - last_modified()
111
+ # -->
112
+ # returns a Time that represents the Last-Modified field.
113
+ #
114
+ def last_modified: () -> Time?
115
+
116
+ # <!--
117
+ # rdoc-file=lib/open-uri.rb
118
+ # - content_type()
119
+ # -->
120
+ # returns "type/subtype" which is MIME Content-Type. It is downcased for
121
+ # canonicalization. Content-Type parameters are stripped.
122
+ #
123
+ def content_type: () -> String
124
+
125
+ def charet: () -> String?
126
+
127
+ # <!--
128
+ # rdoc-file=lib/open-uri.rb
129
+ # - content_encoding()
130
+ # -->
131
+ # Returns a list of encodings in Content-Encoding field as an array of strings.
132
+ #
133
+ # The encodings are downcased for canonicalization.
134
+ #
135
+ def content_encoding: () -> Array[String]
136
+ end
137
+
138
+ # <!-- rdoc-file=lib/open-uri.rb -->
139
+ # Mixin for HTTP and FTP URIs.
140
+ #
141
+ module OpenRead
142
+ # <!--
143
+ # rdoc-file=lib/open-uri.rb
144
+ # - open(*rest, &block)
145
+ # -->
146
+ # OpenURI::OpenRead#open provides `open' for URI::HTTP and URI::FTP.
147
+ #
148
+ # OpenURI::OpenRead#open takes optional 3 arguments as:
149
+ #
150
+ # OpenURI::OpenRead#open([mode [, perm]] [, options]) [{|io| ... }]
151
+ #
152
+ # OpenURI::OpenRead#open returns an IO-like object if block is not given.
153
+ # Otherwise it yields the IO object and return the value of the block. The IO
154
+ # object is extended with OpenURI::Meta.
155
+ #
156
+ # `mode` and `perm` are the same as Kernel#open.
157
+ #
158
+ # However, `mode` must be read mode because OpenURI::OpenRead#open doesn't
159
+ # support write mode (yet). Also `perm` is ignored because it is meaningful only
160
+ # for file creation.
161
+ #
162
+ # `options` must be a hash.
163
+ #
164
+ # Each option with a string key specifies an extra header field for HTTP. I.e.,
165
+ # it is ignored for FTP without HTTP proxy.
166
+ #
167
+ # The hash may include other options, where keys are symbols:
168
+ #
169
+ # :proxy
170
+ # : Synopsis:
171
+ # :proxy => "http://proxy.foo.com:8000/"
172
+ # :proxy => URI.parse("http://proxy.foo.com:8000/")
173
+ # :proxy => true
174
+ # :proxy => false
175
+ # :proxy => nil
176
+ #
177
+ # If :proxy option is specified, the value should be String, URI, boolean or
178
+ # nil.
179
+ #
180
+ # When String or URI is given, it is treated as proxy URI.
181
+ #
182
+ # When true is given or the option itself is not specified, environment
183
+ # variable `scheme_proxy' is examined. `scheme' is replaced by `http',
184
+ # `https' or `ftp'.
185
+ #
186
+ # When false or nil is given, the environment variables are ignored and
187
+ # connection will be made to a server directly.
188
+ #
189
+ # :proxy_http_basic_authentication
190
+ # : Synopsis:
191
+ # :proxy_http_basic_authentication =>
192
+ # ["http://proxy.foo.com:8000/", "proxy-user", "proxy-password"]
193
+ # :proxy_http_basic_authentication =>
194
+ # [URI.parse("http://proxy.foo.com:8000/"),
195
+ # "proxy-user", "proxy-password"]
196
+ #
197
+ # If :proxy option is specified, the value should be an Array with 3
198
+ # elements. It should contain a proxy URI, a proxy user name and a proxy
199
+ # password. The proxy URI should be a String, an URI or nil. The proxy
200
+ # user name and password should be a String.
201
+ #
202
+ # If nil is given for the proxy URI, this option is just ignored.
203
+ #
204
+ # If :proxy and :proxy_http_basic_authentication is specified, ArgumentError
205
+ # is raised.
206
+ #
207
+ # :http_basic_authentication
208
+ # : Synopsis:
209
+ # :http_basic_authentication=>[user, password]
210
+ #
211
+ # If :http_basic_authentication is specified, the value should be an array
212
+ # which contains 2 strings: username and password. It is used for HTTP Basic
213
+ # authentication defined by RFC 2617.
214
+ #
215
+ # :content_length_proc
216
+ # : Synopsis:
217
+ # :content_length_proc => lambda {|content_length| ... }
218
+ #
219
+ # If :content_length_proc option is specified, the option value procedure is
220
+ # called before actual transfer is started. It takes one argument, which is
221
+ # expected content length in bytes.
222
+ #
223
+ # If two or more transfers are performed by HTTP redirection, the procedure
224
+ # is called only once for the last transfer.
225
+ #
226
+ # When expected content length is unknown, the procedure is called with nil.
227
+ # This happens when the HTTP response has no Content-Length header.
228
+ #
229
+ # :progress_proc
230
+ # : Synopsis:
231
+ # :progress_proc => lambda {|size| ...}
232
+ #
233
+ # If :progress_proc option is specified, the proc is called with one
234
+ # argument each time when `open' gets content fragment from network. The
235
+ # argument `size` is the accumulated transferred size in bytes.
236
+ #
237
+ # If two or more transfer is done by HTTP redirection, the procedure is
238
+ # called only one for a last transfer.
239
+ #
240
+ # :progress_proc and :content_length_proc are intended to be used for
241
+ # progress bar. For example, it can be implemented as follows using
242
+ # Ruby/ProgressBar.
243
+ #
244
+ # pbar = nil
245
+ # open("http://...",
246
+ # :content_length_proc => lambda {|t|
247
+ # if t && 0 < t
248
+ # pbar = ProgressBar.new("...", t)
249
+ # pbar.file_transfer_mode
250
+ # end
251
+ # },
252
+ # :progress_proc => lambda {|s|
253
+ # pbar.set s if pbar
254
+ # }) {|f| ... }
255
+ #
256
+ # :read_timeout
257
+ # : Synopsis:
258
+ # :read_timeout=>nil (no timeout)
259
+ # :read_timeout=>10 (10 second)
260
+ #
261
+ # :read_timeout option specifies a timeout of read for http connections.
262
+ #
263
+ # :open_timeout
264
+ # : Synopsis:
265
+ # :open_timeout=>nil (no timeout)
266
+ # :open_timeout=>10 (10 second)
267
+ #
268
+ # :open_timeout option specifies a timeout of open for http connections.
269
+ #
270
+ # :ssl_ca_cert
271
+ # : Synopsis:
272
+ # :ssl_ca_cert=>filename or an Array of filenames
273
+ #
274
+ # :ssl_ca_cert is used to specify CA certificate for SSL. If it is given,
275
+ # default certificates are not used.
276
+ #
277
+ # :ssl_verify_mode
278
+ # : Synopsis:
279
+ # :ssl_verify_mode=>mode
280
+ #
281
+ # :ssl_verify_mode is used to specify openssl verify mode.
282
+ #
283
+ # :ssl_min_version
284
+ # : Synopsis:
285
+ # :ssl_min_version=>:TLS1_2
286
+ #
287
+ # :ssl_min_version option specifies the minimum allowed SSL/TLS protocol
288
+ # version. See also OpenSSL::SSL::SSLContext#min_version=.
289
+ #
290
+ # :ssl_max_version
291
+ # : Synopsis:
292
+ # :ssl_max_version=>:TLS1_2
293
+ #
294
+ # :ssl_max_version option specifies the maximum allowed SSL/TLS protocol
295
+ # version. See also OpenSSL::SSL::SSLContext#max_version=.
296
+ #
297
+ # :ftp_active_mode
298
+ # : Synopsis:
299
+ # :ftp_active_mode=>bool
300
+ #
301
+ # `:ftp_active_mode => true` is used to make ftp active mode. Ruby 1.9 uses
302
+ # passive mode by default. Note that the active mode is default in Ruby 1.8
303
+ # or prior.
304
+ #
305
+ # :redirect
306
+ # : Synopsis:
307
+ # :redirect=>bool
308
+ #
309
+ # `:redirect` is true by default. `:redirect => false` is used to disable
310
+ # all HTTP redirects.
311
+ #
312
+ # OpenURI::HTTPRedirect exception raised on redirection. Using `true` also
313
+ # means that redirections between http and ftp are permitted.
314
+ #
315
+ def open: (*untyped) -> IO
316
+ | [T] (*untyped) { (IO) -> T } -> T
317
+
318
+ # <!--
319
+ # rdoc-file=lib/open-uri.rb
320
+ # - read(options={})
321
+ # -->
322
+ # OpenURI::OpenRead#read([ options ]) reads a content referenced by self and
323
+ # returns the content as string. The string is extended with OpenURI::Meta. The
324
+ # argument `options` is same as OpenURI::OpenRead#open.
325
+ #
326
+ def read: (untyped options) -> String
327
+ end
328
+ end
329
+
330
+ %a{annotate:rdoc:skip}
331
+ module URI
332
+ %a{annotate:rdoc:skip}
333
+ class HTTP
334
+ include OpenURI::OpenRead
335
+ end
336
+
337
+ %a{annotate:rdoc:skip}
338
+ class FTP
339
+ include OpenURI::OpenRead
340
+ end
341
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbs
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0.pre.1
4
+ version: 3.3.0.pre.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Soutaro Matsumoto
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-10-31 00:00:00.000000000 Z
11
+ date: 2023-11-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: abbrev
@@ -216,6 +216,7 @@ files:
216
216
  - lib/rbs/prototype/rbi.rb
217
217
  - lib/rbs/prototype/runtime.rb
218
218
  - lib/rbs/prototype/runtime/helpers.rb
219
+ - lib/rbs/prototype/runtime/reflection.rb
219
220
  - lib/rbs/prototype/runtime/value_object_generator.rb
220
221
  - lib/rbs/repository.rb
221
222
  - lib/rbs/resolver/constant_resolver.rb
@@ -397,9 +398,13 @@ files:
397
398
  - stdlib/net-http/0/net-http.rbs
398
399
  - stdlib/net-protocol/0/manifest.yaml
399
400
  - stdlib/net-protocol/0/net-protocol.rbs
401
+ - stdlib/net-smtp/0/manifest.yaml
402
+ - stdlib/net-smtp/0/net-smtp.rbs
400
403
  - stdlib/nkf/0/nkf.rbs
401
404
  - stdlib/objspace/0/objspace.rbs
402
405
  - stdlib/observable/0/observable.rbs
406
+ - stdlib/open-uri/0/manifest.yaml
407
+ - stdlib/open-uri/0/open-uri.rbs
403
408
  - stdlib/openssl/0/manifest.yaml
404
409
  - stdlib/openssl/0/openssl.rbs
405
410
  - stdlib/optparse/0/optparse.rbs