rbs 0.7.0 → 0.8.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 +7 -0
- data/lib/rbs/cli.rb +17 -2
- data/lib/rbs/parser.y +22 -8
- data/lib/rbs/test.rb +1 -0
- data/lib/rbs/test/errors.rb +5 -1
- data/lib/rbs/test/setup.rb +28 -11
- data/lib/rbs/test/setup_helper.rb +29 -0
- data/lib/rbs/test/tester.rb +7 -7
- data/lib/rbs/test/type_check.rb +6 -7
- data/lib/rbs/version.rb +1 -1
- data/stdlib/builtin/enumerable.rbs +2 -2
- data/stdlib/pty/pty.rbs +159 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a2e86d5e87d89f97eed8e2674aa5f5035413179ba104a5cb265ab748268c51fe
|
4
|
+
data.tar.gz: 9d58fa00413d5a334496ee688bbc72520e1911558f39ad2d01b180b790e5d894
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 328850c1f912cd7cc45e1c210140c098206f668c0400a817cde00e36dec1591ec235b5b6a1255b0e66d585745d4f6f7effeb09f28ae2a7536091852f9ba8bc89
|
7
|
+
data.tar.gz: 96bc5adc81b98d723a98d20dcbeef13424fb0a4267272ff1ad6daaab5ef310f24c038f4e23793253beade1e55a00a6eece457697a3a4ec62413f08b7c42ace99
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,13 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
## 0.8.0 (2020-08-01)
|
6
|
+
|
7
|
+
* Signature updates for `Enumerator` and `PTY`
|
8
|
+
* Fix prototype rb/rbi error handling [#349](https://github.com/ruby/rbs/pull/349)
|
9
|
+
* Runtime test improvements [#344](https://github.com/ruby/rbs/pull/344), [#343](https://github.com/ruby/rbs/pull/343)
|
10
|
+
* Add `...` syntax [#342](https://github.com/ruby/rbs/pull/342)
|
11
|
+
|
5
12
|
## 0.7.0 (2020-07-20)
|
6
13
|
|
7
14
|
* Add `DefinitionBuilder#one_instance_ancestors` and `DefinitionBuilder#one_singleton_ancestors` [#341](https://github.com/ruby/rbs/pull/341)
|
data/lib/rbs/cli.rb
CHANGED
@@ -66,6 +66,10 @@ module RBS
|
|
66
66
|
opts
|
67
67
|
end
|
68
68
|
|
69
|
+
def has_parser?
|
70
|
+
defined?(RubyVM::AbstractSyntaxTree)
|
71
|
+
end
|
72
|
+
|
69
73
|
def run(args)
|
70
74
|
options = LibraryOptions.new
|
71
75
|
|
@@ -599,12 +603,18 @@ EOU
|
|
599
603
|
end
|
600
604
|
|
601
605
|
def run_prototype_file(format, args)
|
606
|
+
availability = unless has_parser?
|
607
|
+
"\n** This command does not work on this interpreter (#{RUBY_ENGINE}) **\n"
|
608
|
+
end
|
609
|
+
|
602
610
|
opts = OptionParser.new
|
603
611
|
opts.banner = <<EOU
|
604
612
|
Usage: rbs prototype #{format} [options...] [files...]
|
605
|
-
|
613
|
+
#{availability}
|
606
614
|
Generate RBS prototype from source code.
|
607
|
-
It parses specified Ruby code and and generates RBS prototypes.
|
615
|
+
It parses specified Ruby code and and generates RBS prototypes.
|
616
|
+
|
617
|
+
It only works on MRI because it parses Ruby code with `RubyVM::AbstractSyntaxTree`.
|
608
618
|
|
609
619
|
Examples:
|
610
620
|
|
@@ -613,6 +623,11 @@ Examples:
|
|
613
623
|
EOU
|
614
624
|
opts.parse!(args)
|
615
625
|
|
626
|
+
unless has_parser?
|
627
|
+
stdout.puts "Not supported on this interpreter (#{RUBY_ENGINE})."
|
628
|
+
exit 1
|
629
|
+
end
|
630
|
+
|
616
631
|
if args.empty?
|
617
632
|
stdout.puts opts
|
618
633
|
return nil
|
data/lib/rbs/parser.y
CHANGED
@@ -4,9 +4,9 @@ class RBS::Parser
|
|
4
4
|
tANNOTATION
|
5
5
|
tSTRING tSYMBOL tINTEGER tWRITE_ATTR
|
6
6
|
kLPAREN kRPAREN kLBRACKET kRBRACKET kLBRACE kRBRACE
|
7
|
-
kVOID kNIL kTRUE kFALSE kANY kUNTYPED kTOP kBOT kSELF kSELFQ kINSTANCE kCLASS kBOOL kSINGLETON kTYPE kDEF kMODULE
|
7
|
+
kVOID kNIL kTRUE kFALSE kANY kUNTYPED kTOP kBOT kSELF kSELFQ kINSTANCE kCLASS kBOOL kSINGLETON kTYPE kDEF kMODULE
|
8
8
|
kPRIVATE kPUBLIC kALIAS
|
9
|
-
kCOLON kCOLON2 kCOMMA kBAR kAMP kHAT kARROW kQUESTION kEXCLAMATION kSTAR kSTAR2 kFATARROW kEQ kDOT kLT
|
9
|
+
kCOLON kCOLON2 kCOMMA kBAR kAMP kHAT kARROW kQUESTION kEXCLAMATION kSTAR kSTAR2 kFATARROW kEQ kDOT kDOT3 kLT
|
10
10
|
kINTERFACE kEND kINCLUDE kEXTEND kATTRREADER kATTRWRITER kATTRACCESSOR tOPERATOR tQUOTEDMETHOD tQUOTEDIDENT
|
11
11
|
kPREPEND kEXTENSION kINCOMPATIBLE
|
12
12
|
type_TYPE type_SIGNATURE type_METHODTYPE tEOF
|
@@ -425,7 +425,12 @@ rule
|
|
425
425
|
comment: leading_comment(val[0].first&.location || location))
|
426
426
|
}
|
427
427
|
|
428
|
-
overload:
|
428
|
+
overload:
|
429
|
+
{ result = nil }
|
430
|
+
| kOVERLOAD {
|
431
|
+
RBS.logger.warn "`overload def` syntax is deprecated. Use `...` syntax instead."
|
432
|
+
result = val[0]
|
433
|
+
}
|
429
434
|
|
430
435
|
method_member:
|
431
436
|
annotations attributes overload kDEF method_kind def_name method_types {
|
@@ -438,15 +443,24 @@ rule
|
|
438
443
|
type
|
439
444
|
end
|
440
445
|
end
|
446
|
+
|
447
|
+
last_type = val[6].last
|
448
|
+
if last_type.is_a?(LocatedValue) && last_type.value == :dot3
|
449
|
+
overload = true
|
450
|
+
val[6].pop
|
451
|
+
else
|
452
|
+
overload = false
|
453
|
+
end
|
454
|
+
|
441
455
|
result = Members::MethodDefinition.new(
|
442
456
|
name: val[5].value,
|
443
457
|
kind: val[4],
|
444
|
-
types:
|
458
|
+
types: val[6],
|
445
459
|
annotations: val[0],
|
446
460
|
location: location,
|
447
461
|
comment: leading_comment(val[0].first&.location || val[1].first&.location || val[2]&.location || val[3].location),
|
448
462
|
attributes: val[1].map(&:value),
|
449
|
-
overload: !!val[2]
|
463
|
+
overload: overload || !!val[2]
|
450
464
|
)
|
451
465
|
}
|
452
466
|
|
@@ -463,7 +477,7 @@ rule
|
|
463
477
|
|
464
478
|
method_types:
|
465
479
|
method_type { result = [val[0]] }
|
466
|
-
|
|
480
|
+
| kDOT3 { result = [LocatedValue.new(value: :dot3, location: val[0].location)] }
|
467
481
|
| method_type kBAR method_types {
|
468
482
|
result = val[2].unshift(val[0])
|
469
483
|
}
|
@@ -548,7 +562,7 @@ rule
|
|
548
562
|
kCLASS | kVOID | kNIL | kTRUE | kFALSE | kANY | kUNTYPED | kTOP | kBOT | kINSTANCE | kBOOL | kSINGLETON
|
549
563
|
| kTYPE | kMODULE | kPRIVATE | kPUBLIC | kEND | kINCLUDE | kEXTEND | kPREPEND
|
550
564
|
| kATTRREADER | kATTRACCESSOR | kATTRWRITER | kDEF | kEXTENSION | kSELF | kINCOMPATIBLE
|
551
|
-
| kUNCHECKED | kINTERFACE |
|
565
|
+
| kUNCHECKED | kINTERFACE | kALIAS | kOUT | kIN | kOVERLOAD
|
552
566
|
|
553
567
|
module_type_params:
|
554
568
|
{ result = nil }
|
@@ -1218,7 +1232,6 @@ KEYWORDS = {
|
|
1218
1232
|
"attr_reader" => :kATTRREADER,
|
1219
1233
|
"attr_writer" => :kATTRWRITER,
|
1220
1234
|
"attr_accessor" => :kATTRACCESSOR,
|
1221
|
-
"super" => :kSUPER,
|
1222
1235
|
"public" => :kPUBLIC,
|
1223
1236
|
"private" => :kPRIVATE,
|
1224
1237
|
"alias" => :kALIAS,
|
@@ -1267,6 +1280,7 @@ PUNCTS = {
|
|
1267
1280
|
"!" => :kEXCLAMATION,
|
1268
1281
|
"**" => :kSTAR2,
|
1269
1282
|
"*" => :kSTAR,
|
1283
|
+
"..." => :kDOT3,
|
1270
1284
|
"." => :kDOT,
|
1271
1285
|
"<" => :kLT,
|
1272
1286
|
"-@" => :tOPERATOR,
|
data/lib/rbs/test.rb
CHANGED
data/lib/rbs/test/errors.rb
CHANGED
@@ -28,7 +28,11 @@ module RBS
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def self.inspect_(obj)
|
31
|
-
|
31
|
+
if obj.respond_to?(:inspect)
|
32
|
+
obj.inspect
|
33
|
+
else
|
34
|
+
Test::INSPECT.bind(obj).call # For the case inspect is not defined (like BasicObject)
|
35
|
+
end
|
32
36
|
end
|
33
37
|
|
34
38
|
def self.to_string(error)
|
data/lib/rbs/test/setup.rb
CHANGED
@@ -1,24 +1,29 @@
|
|
1
1
|
require "rbs"
|
2
2
|
require "rbs/test"
|
3
|
-
|
4
3
|
require "optparse"
|
5
4
|
require "shellwords"
|
6
5
|
|
6
|
+
include RBS::Test::SetupHelper
|
7
|
+
|
7
8
|
logger = Logger.new(STDERR)
|
8
9
|
|
9
10
|
begin
|
10
11
|
opts = Shellwords.shellsplit(ENV["RBS_TEST_OPT"] || "-I sig")
|
11
|
-
filter = ENV.fetch(
|
12
|
-
skips = (ENV[
|
13
|
-
sampling = !ENV.key?("RBS_TEST_NO_SAMPLE")
|
12
|
+
filter = ENV.fetch('RBS_TEST_TARGET').split(',').map! { |e| e.strip }
|
13
|
+
skips = (ENV['RBS_TEST_SKIP'] || '').split(',').map! { |e| e.strip }
|
14
14
|
RBS.logger_level = (ENV["RBS_TEST_LOGLEVEL"] || "info")
|
15
|
-
|
15
|
+
sample_size = get_sample_size(ENV['RBS_TEST_SAMPLE_SIZE'] || '')
|
16
|
+
rescue InvalidSampleSizeError => exception
|
17
|
+
RBS.logger.error exception.message
|
18
|
+
exit 1
|
19
|
+
rescue Exception => e
|
20
|
+
raise e.message
|
16
21
|
STDERR.puts "rbs/test/setup handles the following environment variables:"
|
17
22
|
STDERR.puts " [REQUIRED] RBS_TEST_TARGET: test target class name, `Foo::Bar,Foo::Baz` for each class or `Foo::*` for all classes under `Foo`"
|
18
23
|
STDERR.puts " [OPTIONAL] RBS_TEST_SKIP: skip testing classes"
|
19
24
|
STDERR.puts " [OPTIONAL] RBS_TEST_OPT: options for signatures (`-r` for libraries or `-I` for signatures)"
|
20
25
|
STDERR.puts " [OPTIONAL] RBS_TEST_LOGLEVEL: one of debug|info|warn|error|fatal (defaults to info)"
|
21
|
-
STDERR.puts " [OPTIONAL]
|
26
|
+
STDERR.puts " [OPTIONAL] RBS_TEST_SAMPLE_SIZE: sets the amount of values in a collection to be type-checked (Set to `ALL` to type check all the values)"
|
22
27
|
exit 1
|
23
28
|
end
|
24
29
|
|
@@ -32,26 +37,38 @@ env = RBS::Environment.from_loader(loader).resolve_type_names
|
|
32
37
|
|
33
38
|
def match(filter, name)
|
34
39
|
if filter.end_with?("*")
|
35
|
-
|
40
|
+
size = filter.size
|
41
|
+
name.start_with?(filter[0, size - 1]) || name == filter[0, size-3]
|
36
42
|
else
|
37
43
|
filter == name
|
38
44
|
end
|
39
45
|
end
|
40
46
|
|
41
|
-
|
47
|
+
def to_absolute_typename(type_name)
|
48
|
+
RBS::Factory.new().type_name(type_name).absolute!
|
49
|
+
end
|
50
|
+
|
42
51
|
tester = RBS::Test::Tester.new(env: env)
|
43
52
|
|
44
53
|
TracePoint.trace :end do |tp|
|
45
|
-
class_name = tp.self.name&.yield_self {|name|
|
54
|
+
class_name = tp.self.name&.yield_self {|name| to_absolute_typename name }
|
46
55
|
|
47
56
|
if class_name
|
48
|
-
if filter.any? {|f| match(f, class_name.to_s) } && skips.none? {|f| match(f, class_name.to_s) }
|
57
|
+
if filter.any? {|f| match(to_absolute_typename(f).to_s, class_name.to_s) } && skips.none? {|f| match(f, class_name.to_s) }
|
49
58
|
if tester.checkers.none? {|hook| hook.klass == tp.self }
|
50
59
|
if env.class_decls.key?(class_name)
|
51
60
|
logger.info "Setting up hooks for #{class_name}"
|
52
|
-
tester.install!(tp.self,
|
61
|
+
tester.install!(tp.self, sample_size: sample_size)
|
53
62
|
end
|
54
63
|
end
|
55
64
|
end
|
56
65
|
end
|
57
66
|
end
|
67
|
+
|
68
|
+
at_exit do
|
69
|
+
if $!.nil? || $!.is_a?(SystemExit) && $!.success?
|
70
|
+
logger.warn "No type checker was installed! " if tester.checkers.empty?
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module RBS
|
2
|
+
module Test
|
3
|
+
module SetupHelper
|
4
|
+
class InvalidSampleSizeError < StandardError
|
5
|
+
attr_reader :string
|
6
|
+
|
7
|
+
def initialize(string)
|
8
|
+
@string = string
|
9
|
+
super("Sample size should be a positive integer: `#{string}`")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
DEFAULT_SAMPLE_SIZE = 100
|
14
|
+
|
15
|
+
def get_sample_size(string)
|
16
|
+
case string
|
17
|
+
when ""
|
18
|
+
DEFAULT_SAMPLE_SIZE
|
19
|
+
when 'ALL'
|
20
|
+
nil
|
21
|
+
else
|
22
|
+
int_size = string.to_i
|
23
|
+
raise InvalidSampleSizeError.new(string) unless int_size.positive?
|
24
|
+
int_size
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/rbs/test/tester.rb
CHANGED
@@ -17,14 +17,14 @@ module RBS
|
|
17
17
|
@builder ||= DefinitionBuilder.new(env: env)
|
18
18
|
end
|
19
19
|
|
20
|
-
def install!(klass,
|
20
|
+
def install!(klass, sample_size:)
|
21
21
|
RBS.logger.info { "Installing runtime type checker in #{klass}..." }
|
22
22
|
|
23
23
|
type_name = factory.type_name(klass.name).absolute!
|
24
24
|
|
25
25
|
builder.build_instance(type_name).tap do |definition|
|
26
26
|
instance_key = new_key(type_name, "InstanceChecker")
|
27
|
-
Observer.register(instance_key, MethodCallTester.new(klass, builder, definition, kind: :instance,
|
27
|
+
Observer.register(instance_key, MethodCallTester.new(klass, builder, definition, kind: :instance, sample_size: sample_size))
|
28
28
|
|
29
29
|
definition.methods.each do |name, method|
|
30
30
|
if method.implemented_in == type_name
|
@@ -36,7 +36,7 @@ module RBS
|
|
36
36
|
|
37
37
|
builder.build_singleton(type_name).tap do |definition|
|
38
38
|
singleton_key = new_key(type_name, "SingletonChecker")
|
39
|
-
Observer.register(singleton_key, MethodCallTester.new(klass.singleton_class, builder, definition, kind: :singleton,
|
39
|
+
Observer.register(singleton_key, MethodCallTester.new(klass.singleton_class, builder, definition, kind: :singleton, sample_size: sample_size))
|
40
40
|
|
41
41
|
definition.methods.each do |name, method|
|
42
42
|
if method.implemented_in == type_name || name == :new
|
@@ -66,14 +66,14 @@ module RBS
|
|
66
66
|
attr_reader :definition
|
67
67
|
attr_reader :builder
|
68
68
|
attr_reader :kind
|
69
|
-
attr_reader :
|
69
|
+
attr_reader :sample_size
|
70
70
|
|
71
|
-
def initialize(self_class, builder, definition, kind:,
|
71
|
+
def initialize(self_class, builder, definition, kind:, sample_size:)
|
72
72
|
@self_class = self_class
|
73
73
|
@definition = definition
|
74
74
|
@builder = builder
|
75
75
|
@kind = kind
|
76
|
-
@
|
76
|
+
@sample_size = sample_size
|
77
77
|
end
|
78
78
|
|
79
79
|
def env
|
@@ -81,7 +81,7 @@ module RBS
|
|
81
81
|
end
|
82
82
|
|
83
83
|
def check
|
84
|
-
@check ||= TypeCheck.new(self_class: self_class, builder: builder,
|
84
|
+
@check ||= TypeCheck.new(self_class: self_class, builder: builder, sample_size: sample_size)
|
85
85
|
end
|
86
86
|
|
87
87
|
def format_method_name(name)
|
data/lib/rbs/test/type_check.rb
CHANGED
@@ -3,11 +3,14 @@ module RBS
|
|
3
3
|
class TypeCheck
|
4
4
|
attr_reader :self_class
|
5
5
|
attr_reader :builder
|
6
|
+
attr_reader :sample_size
|
6
7
|
|
7
|
-
|
8
|
+
DEFAULT_SAMPLE_SIZE = 100
|
9
|
+
|
10
|
+
def initialize(self_class:, builder:, sample_size:)
|
8
11
|
@self_class = self_class
|
9
12
|
@builder = builder
|
10
|
-
@
|
13
|
+
@sample_size = sample_size
|
11
14
|
end
|
12
15
|
|
13
16
|
def overloaded_call(method, method_name, call, errors:)
|
@@ -176,12 +179,8 @@ module RBS
|
|
176
179
|
end
|
177
180
|
end
|
178
181
|
|
179
|
-
def sampling?
|
180
|
-
!!@sampling
|
181
|
-
end
|
182
|
-
|
183
182
|
def sample(array)
|
184
|
-
array.size >
|
183
|
+
sample_size && (array.size > sample_size) ? array.sample(sample_size) : array
|
185
184
|
end
|
186
185
|
|
187
186
|
def value(val, type)
|
data/lib/rbs/version.rb
CHANGED
@@ -46,7 +46,7 @@ module Enumerable[unchecked out Elem, out Return]: _Each[Elem, Return]
|
|
46
46
|
| () { (Elem arg0) -> untyped } -> bool
|
47
47
|
|
48
48
|
def collect: [U] () { (Elem arg0) -> U } -> ::Array[U]
|
49
|
-
| () -> ::Enumerator[Elem,
|
49
|
+
| () -> ::Enumerator[Elem, ::Array[untyped]]
|
50
50
|
|
51
51
|
def collect_concat: [U] () { (Elem arg0) -> ::Enumerator[U, untyped] } -> ::Array[U]
|
52
52
|
|
@@ -317,7 +317,7 @@ module Enumerable[unchecked out Elem, out Return]: _Each[Elem, Return]
|
|
317
317
|
| () -> ::Enumerator[Elem, Return]
|
318
318
|
|
319
319
|
def map: [U] () { (Elem arg0) -> U } -> ::Array[U]
|
320
|
-
| () -> ::Enumerator[Elem,
|
320
|
+
| () -> ::Enumerator[Elem, ::Array[untyped]]
|
321
321
|
|
322
322
|
def member?: (untyped arg0) -> bool
|
323
323
|
|
data/stdlib/pty/pty.rbs
ADDED
@@ -0,0 +1,159 @@
|
|
1
|
+
# Creates and manages pseudo terminals (PTYs). See also
|
2
|
+
# http://en.wikipedia.org/wiki/Pseudo_terminal
|
3
|
+
#
|
4
|
+
# PTY allows you to allocate new terminals using ::open or ::spawn a new
|
5
|
+
# terminal with a specific command.
|
6
|
+
#
|
7
|
+
# ## Example
|
8
|
+
#
|
9
|
+
# In this example we will change the buffering type in the `factor` command,
|
10
|
+
# assuming that factor uses stdio for stdout buffering.
|
11
|
+
#
|
12
|
+
# If IO.pipe is used instead of PTY.open, this code deadlocks because factor's
|
13
|
+
# stdout is fully buffered.
|
14
|
+
#
|
15
|
+
# # start by requiring the standard library PTY
|
16
|
+
# require 'pty'
|
17
|
+
#
|
18
|
+
# master, slave = PTY.open
|
19
|
+
# read, write = IO.pipe
|
20
|
+
# pid = spawn("factor", :in=>read, :out=>slave)
|
21
|
+
# read.close # we dont need the read
|
22
|
+
# slave.close # or the slave
|
23
|
+
#
|
24
|
+
# # pipe "42" to the factor command
|
25
|
+
# write.puts "42"
|
26
|
+
# # output the response from factor
|
27
|
+
# p master.gets #=> "42: 2 3 7\n"
|
28
|
+
#
|
29
|
+
# # pipe "144" to factor and print out the response
|
30
|
+
# write.puts "144"
|
31
|
+
# p master.gets #=> "144: 2 2 2 2 3 3\n"
|
32
|
+
# write.close # close the pipe
|
33
|
+
#
|
34
|
+
# # The result of read operation when pty slave is closed is platform
|
35
|
+
# # dependent.
|
36
|
+
# ret = begin
|
37
|
+
# master.gets # FreeBSD returns nil.
|
38
|
+
# rescue Errno::EIO # GNU/Linux raises EIO.
|
39
|
+
# nil
|
40
|
+
# end
|
41
|
+
# p ret #=> nil
|
42
|
+
#
|
43
|
+
# ## License
|
44
|
+
#
|
45
|
+
# C) Copyright 1998 by Akinori Ito.
|
46
|
+
#
|
47
|
+
# This software may be redistributed freely for this purpose, in full
|
48
|
+
# or in part, provided that this entire copyright notice is included
|
49
|
+
# on any copies of this software and applications and derivations thereof.
|
50
|
+
#
|
51
|
+
# This software is provided on an "as is" basis, without warranty of any
|
52
|
+
# kind, either expressed or implied, as to any matter including, but not
|
53
|
+
# limited to warranty of fitness of purpose, or merchantability, or
|
54
|
+
# results obtained from use of this software.
|
55
|
+
#
|
56
|
+
module PTY
|
57
|
+
# Checks the status of the child process specified by `pid`. Returns `nil` if
|
58
|
+
# the process is still alive.
|
59
|
+
#
|
60
|
+
# If the process is not alive, and `raise` was true, a PTY::ChildExited
|
61
|
+
# exception will be raised. Otherwise it will return a Process::Status instance.
|
62
|
+
#
|
63
|
+
# `pid`
|
64
|
+
# : The process id of the process to check
|
65
|
+
# `raise`
|
66
|
+
# : If `true` and the process identified by `pid` is no longer alive a
|
67
|
+
# PTY::ChildExited is raised.
|
68
|
+
def self.check: (Integer pid) -> (Process::Status | nil)
|
69
|
+
| (Integer pid, FalseClass raise) -> (Process::Status | nil)
|
70
|
+
| (Integer pid, TrueClass raise) -> nil
|
71
|
+
|
72
|
+
# Spawns the specified command on a newly allocated pty. You can also use the
|
73
|
+
# alias ::getpty.
|
74
|
+
#
|
75
|
+
# The command's controlling tty is set to the slave device of the pty and its
|
76
|
+
# standard input/output/error is redirected to the slave device.
|
77
|
+
#
|
78
|
+
# `command` and `command_line` are the full commands to run, given a String. Any
|
79
|
+
# additional `arguments` will be passed to the command.
|
80
|
+
#
|
81
|
+
# ### Return values
|
82
|
+
#
|
83
|
+
# In the non-block form this returns an array of size three, `[r, w, pid]`.
|
84
|
+
#
|
85
|
+
# In the block form these same values will be yielded to the block:
|
86
|
+
#
|
87
|
+
# `r`
|
88
|
+
# : A readable IO that contains the command's standard output and standard
|
89
|
+
# error
|
90
|
+
# `w`
|
91
|
+
# : A writable IO that is the command's standard input
|
92
|
+
# `pid`
|
93
|
+
# : The process identifier for the command.
|
94
|
+
def self.getpty: (*String command) -> [ IO, IO, Integer ]
|
95
|
+
| (*String command) { ([ IO ,IO , Integer ]) -> untyped } -> untyped
|
96
|
+
|
97
|
+
# Allocates a pty (pseudo-terminal).
|
98
|
+
#
|
99
|
+
# In the block form, yields two arguments `master_io, slave_file` and the value
|
100
|
+
# of the block is returned from `open`.
|
101
|
+
#
|
102
|
+
# The IO and File are both closed after the block completes if they haven't been
|
103
|
+
# already closed.
|
104
|
+
#
|
105
|
+
# PTY.open {|master, slave|
|
106
|
+
# p master #=> #<IO:masterpty:/dev/pts/1>
|
107
|
+
# p slave #=> #<File:/dev/pts/1>
|
108
|
+
# p slave.path #=> "/dev/pts/1"
|
109
|
+
# }
|
110
|
+
#
|
111
|
+
# In the non-block form, returns a two element array, `[master_io, slave_file]`.
|
112
|
+
#
|
113
|
+
# master, slave = PTY.open
|
114
|
+
# # do something with master for IO, or the slave file
|
115
|
+
#
|
116
|
+
# The arguments in both forms are:
|
117
|
+
#
|
118
|
+
# `master_io`
|
119
|
+
# : the master of the pty, as an IO.
|
120
|
+
# `slave_file`
|
121
|
+
# : the slave of the pty, as a File. The path to the terminal device is
|
122
|
+
# available via `slave_file.path`
|
123
|
+
#
|
124
|
+
#
|
125
|
+
# IO#raw! is usable to disable newline conversions:
|
126
|
+
#
|
127
|
+
# require 'io/console'
|
128
|
+
# PTY.open {|m, s|
|
129
|
+
# s.raw!
|
130
|
+
# ...
|
131
|
+
# }
|
132
|
+
def self.open: () -> [ IO, File ]
|
133
|
+
| () { ([ IO , File ]) -> untyped } -> untyped
|
134
|
+
|
135
|
+
# Spawns the specified command on a newly allocated pty. You can also use the
|
136
|
+
# alias ::getpty.
|
137
|
+
#
|
138
|
+
# The command's controlling tty is set to the slave device of the pty and its
|
139
|
+
# standard input/output/error is redirected to the slave device.
|
140
|
+
#
|
141
|
+
# `command` and `command_line` are the full commands to run, given a String. Any
|
142
|
+
# additional `arguments` will be passed to the command.
|
143
|
+
#
|
144
|
+
# ### Return values
|
145
|
+
#
|
146
|
+
# In the non-block form this returns an array of size three, `[r, w, pid]`.
|
147
|
+
#
|
148
|
+
# In the block form these same values will be yielded to the block:
|
149
|
+
#
|
150
|
+
# `r`
|
151
|
+
# : A readable IO that contains the command's standard output and standard
|
152
|
+
# error
|
153
|
+
# `w`
|
154
|
+
# : A writable IO that is the command's standard input
|
155
|
+
# `pid`
|
156
|
+
# : The process identifier for the command.
|
157
|
+
def self.spawn: (*String command) -> [ IO, IO, Integer ]
|
158
|
+
| (*String command) {([ IO , IO , Integer ]) -> untyped } -> untyped
|
159
|
+
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: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Soutaro Matsumoto
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-08-01 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: RBS is the language for type signatures for Ruby and standard library
|
14
14
|
definitions.
|
@@ -73,6 +73,7 @@ files:
|
|
73
73
|
- lib/rbs/test/hook.rb
|
74
74
|
- lib/rbs/test/observer.rb
|
75
75
|
- lib/rbs/test/setup.rb
|
76
|
+
- lib/rbs/test/setup_helper.rb
|
76
77
|
- lib/rbs/test/spy.rb
|
77
78
|
- lib/rbs/test/tester.rb
|
78
79
|
- lib/rbs/test/type_check.rb
|
@@ -169,6 +170,7 @@ files:
|
|
169
170
|
- stdlib/pathname/pathname.rbs
|
170
171
|
- stdlib/prime/integer-extension.rbs
|
171
172
|
- stdlib/prime/prime.rbs
|
173
|
+
- stdlib/pty/pty.rbs
|
172
174
|
- stdlib/securerandom/securerandom.rbs
|
173
175
|
- stdlib/set/set.rbs
|
174
176
|
- stdlib/tmpdir/tmpdir.rbs
|