rbs 1.0.6 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +2 -2
- data/CHANGELOG.md +37 -0
- data/Rakefile +3 -2
- data/Steepfile +2 -0
- data/bin/rbs-prof +1 -1
- data/core/array.rbs +8 -4
- data/core/thread.rbs +14 -1
- data/lib/rbs.rb +3 -0
- data/lib/rbs/ancestor_graph.rb +90 -0
- data/lib/rbs/char_scanner.rb +20 -0
- data/lib/rbs/definition_builder.rb +38 -20
- data/lib/rbs/definition_builder/method_builder.rb +14 -0
- data/lib/rbs/environment.rb +42 -5
- data/lib/rbs/environment_walker.rb +4 -4
- data/lib/rbs/errors.rb +32 -17
- data/lib/rbs/parser.rb +437 -416
- data/lib/rbs/parser.y +29 -16
- data/lib/rbs/test/type_check.rb +7 -3
- data/lib/rbs/version.rb +1 -1
- data/sig/ancestor_graph.rbs +40 -0
- data/sig/char_scanner.rbs +9 -0
- data/sig/definition_builder.rbs +5 -1
- data/sig/environment.rbs +22 -2
- data/sig/environment_walker.rbs +39 -0
- data/sig/errors.rbs +42 -17
- data/sig/method_builder.rbs +2 -0
- data/sig/parser.rbs +11 -4
- data/sig/polyfill.rbs +0 -14
- data/stdlib/cgi/0/core.rbs +595 -0
- data/stdlib/rubygems/0/basic_specification.rbs +3 -0
- data/stdlib/rubygems/0/config_file.rbs +3 -0
- data/stdlib/rubygems/0/dependency_installer.rbs +5 -0
- data/stdlib/rubygems/0/installer.rbs +3 -0
- data/stdlib/rubygems/0/path_support.rbs +3 -0
- data/stdlib/rubygems/0/platform.rbs +3 -0
- data/stdlib/rubygems/0/request_set.rbs +7 -0
- data/stdlib/rubygems/0/requirement.rbs +3 -0
- data/stdlib/rubygems/0/rubygems.rbs +710 -0
- data/stdlib/rubygems/0/source_list.rbs +2 -0
- data/stdlib/rubygems/0/specification.rbs +3 -0
- data/stdlib/rubygems/0/stream_ui.rbs +3 -0
- data/stdlib/rubygems/0/uninstaller.rbs +3 -0
- data/stdlib/rubygems/0/version.rbs +228 -0
- data/stdlib/strscan/0/string_scanner.rbs +582 -0
- metadata +23 -2
@@ -0,0 +1,228 @@
|
|
1
|
+
module Gem
|
2
|
+
# The Version class processes string versions into comparable values. A version
|
3
|
+
# string should normally be a series of numbers separated by periods. Each part
|
4
|
+
# (digits separated by periods) is considered its own number, and these are used
|
5
|
+
# for sorting. So for instance, 3.10 sorts higher than 3.2 because ten is
|
6
|
+
# greater than two.
|
7
|
+
#
|
8
|
+
# If any part contains letters (currently only a-z are supported) then that
|
9
|
+
# version is considered prerelease. Versions with a prerelease part in the Nth
|
10
|
+
# part sort less than versions with N-1 parts. Prerelease parts are sorted
|
11
|
+
# alphabetically using the normal Ruby string sorting rules. If a prerelease
|
12
|
+
# part contains both letters and numbers, it will be broken into multiple parts
|
13
|
+
# to provide expected sort behavior (1.0.a10 becomes 1.0.a.10, and is greater
|
14
|
+
# than 1.0.a9).
|
15
|
+
#
|
16
|
+
# Prereleases sort between real releases (newest to oldest):
|
17
|
+
#
|
18
|
+
# 1. 1.0
|
19
|
+
# 2. 1.0.b1
|
20
|
+
# 3. 1.0.a.2
|
21
|
+
# 4. 0.9
|
22
|
+
#
|
23
|
+
#
|
24
|
+
# If you want to specify a version restriction that includes both prereleases
|
25
|
+
# and regular releases of the 1.x series this is the best way:
|
26
|
+
#
|
27
|
+
# s.add_dependency 'example', '>= 1.0.0.a', '< 2.0.0'
|
28
|
+
#
|
29
|
+
# ## How Software Changes
|
30
|
+
#
|
31
|
+
# Users expect to be able to specify a version constraint that gives them some
|
32
|
+
# reasonable expectation that new versions of a library will work with their
|
33
|
+
# software if the version constraint is true, and not work with their software
|
34
|
+
# if the version constraint is false. In other words, the perfect system will
|
35
|
+
# accept all compatible versions of the library and reject all incompatible
|
36
|
+
# versions.
|
37
|
+
#
|
38
|
+
# Libraries change in 3 ways (well, more than 3, but stay focused here!).
|
39
|
+
#
|
40
|
+
# 1. The change may be an implementation detail only and have no effect on the
|
41
|
+
# client software.
|
42
|
+
# 2. The change may add new features, but do so in a way that client software
|
43
|
+
# written to an earlier version is still compatible.
|
44
|
+
# 3. The change may change the public interface of the library in such a way
|
45
|
+
# that old software is no longer compatible.
|
46
|
+
#
|
47
|
+
#
|
48
|
+
# Some examples are appropriate at this point. Suppose I have a Stack class
|
49
|
+
# that supports a `push` and a `pop` method.
|
50
|
+
#
|
51
|
+
# ### Examples of Category 1 changes:
|
52
|
+
#
|
53
|
+
# * Switch from an array based implementation to a linked-list based
|
54
|
+
# implementation.
|
55
|
+
# * Provide an automatic (and transparent) backing store for large stacks.
|
56
|
+
#
|
57
|
+
#
|
58
|
+
# ### Examples of Category 2 changes might be:
|
59
|
+
#
|
60
|
+
# * Add a `depth` method to return the current depth of the stack.
|
61
|
+
# * Add a `top` method that returns the current top of stack (without changing
|
62
|
+
# the stack).
|
63
|
+
# * Change `push` so that it returns the item pushed (previously it had no
|
64
|
+
# usable return value).
|
65
|
+
#
|
66
|
+
#
|
67
|
+
# ### Examples of Category 3 changes might be:
|
68
|
+
#
|
69
|
+
# * Changes `pop` so that it no longer returns a value (you must use `top` to
|
70
|
+
# get the top of the stack).
|
71
|
+
# * Rename the methods to `push_item` and `pop_item`.
|
72
|
+
#
|
73
|
+
#
|
74
|
+
# ## RubyGems Rational Versioning
|
75
|
+
#
|
76
|
+
# * Versions shall be represented by three non-negative integers, separated by
|
77
|
+
# periods (e.g. 3.1.4). The first integers is the "major" version number,
|
78
|
+
# the second integer is the "minor" version number, and the third integer is
|
79
|
+
# the "build" number.
|
80
|
+
#
|
81
|
+
# * A category 1 change (implementation detail) will increment the build
|
82
|
+
# number.
|
83
|
+
#
|
84
|
+
# * A category 2 change (backwards compatible) will increment the minor
|
85
|
+
# version number and reset the build number.
|
86
|
+
#
|
87
|
+
# * A category 3 change (incompatible) will increment the major build number
|
88
|
+
# and reset the minor and build numbers.
|
89
|
+
#
|
90
|
+
# * Any "public" release of a gem should have a different version. Normally
|
91
|
+
# that means incrementing the build number. This means a developer can
|
92
|
+
# generate builds all day long, but as soon as they make a public release,
|
93
|
+
# the version must be updated.
|
94
|
+
#
|
95
|
+
#
|
96
|
+
# ### Examples
|
97
|
+
#
|
98
|
+
# Let's work through a project lifecycle using our Stack example from above.
|
99
|
+
#
|
100
|
+
# Version 0.0.1
|
101
|
+
# : The initial Stack class is release.
|
102
|
+
# Version 0.0.2
|
103
|
+
# : Switched to a linked=list implementation because it is cooler.
|
104
|
+
# Version 0.1.0
|
105
|
+
# : Added a `depth` method.
|
106
|
+
# Version 1.0.0
|
107
|
+
# : Added `top` and made `pop` return nil (`pop` used to return the old top
|
108
|
+
# item).
|
109
|
+
# Version 1.1.0
|
110
|
+
# : `push` now returns the value pushed (it used it return nil).
|
111
|
+
# Version 1.1.1
|
112
|
+
# : Fixed a bug in the linked list implementation.
|
113
|
+
# Version 1.1.2
|
114
|
+
# : Fixed a bug introduced in the last fix.
|
115
|
+
#
|
116
|
+
#
|
117
|
+
# Client A needs a stack with basic push/pop capability. They write to the
|
118
|
+
# original interface (no `top`), so their version constraint looks like:
|
119
|
+
#
|
120
|
+
# gem 'stack', '>= 0.0'
|
121
|
+
#
|
122
|
+
# Essentially, any version is OK with Client A. An incompatible change to the
|
123
|
+
# library will cause them grief, but they are willing to take the chance (we
|
124
|
+
# call Client A optimistic).
|
125
|
+
#
|
126
|
+
# Client B is just like Client A except for two things: (1) They use the `depth`
|
127
|
+
# method and (2) they are worried about future incompatibilities, so they write
|
128
|
+
# their version constraint like this:
|
129
|
+
#
|
130
|
+
# gem 'stack', '~> 0.1'
|
131
|
+
#
|
132
|
+
# The `depth` method was introduced in version 0.1.0, so that version or
|
133
|
+
# anything later is fine, as long as the version stays below version 1.0 where
|
134
|
+
# incompatibilities are introduced. We call Client B pessimistic because they
|
135
|
+
# are worried about incompatible future changes (it is OK to be pessimistic!).
|
136
|
+
#
|
137
|
+
# ## Preventing Version Catastrophe:
|
138
|
+
#
|
139
|
+
# From: http://blog.zenspider.com/2008/10/rubygems-howto-preventing-cata.html
|
140
|
+
#
|
141
|
+
# Let's say you're depending on the fnord gem version 2.y.z. If you specify your
|
142
|
+
# dependency as ">= 2.0.0" then, you're good, right? What happens if fnord 3.0
|
143
|
+
# comes out and it isn't backwards compatible with 2.y.z? Your stuff will break
|
144
|
+
# as a result of using ">=". The better route is to specify your dependency with
|
145
|
+
# an "approximate" version specifier ("~>"). They're a tad confusing, so here is
|
146
|
+
# how the dependency specifiers work:
|
147
|
+
#
|
148
|
+
# Specification From ... To (exclusive)
|
149
|
+
# ">= 3.0" 3.0 ... ∞
|
150
|
+
# "~> 3.0" 3.0 ... 4.0
|
151
|
+
# "~> 3.0.0" 3.0.0 ... 3.1
|
152
|
+
# "~> 3.5" 3.5 ... 4.0
|
153
|
+
# "~> 3.5.0" 3.5.0 ... 3.6
|
154
|
+
# "~> 3" 3.0 ... 4.0
|
155
|
+
#
|
156
|
+
# For the last example, single-digit versions are automatically extended with a
|
157
|
+
# zero to give a sensible result.
|
158
|
+
#
|
159
|
+
class Version
|
160
|
+
include Comparable
|
161
|
+
|
162
|
+
# True if the `version` string matches RubyGems' requirements.
|
163
|
+
#
|
164
|
+
def self.correct?: (_ToS version) -> bool
|
165
|
+
|
166
|
+
# Factory method to create a Version object. Input may be a Version or a String.
|
167
|
+
# Intended to simplify client code.
|
168
|
+
#
|
169
|
+
# ver1 = Version.create('1.3.17') # -> (Version object)
|
170
|
+
# ver2 = Version.create(ver1) # -> (ver1)
|
171
|
+
# ver3 = Version.create(nil) # -> nil
|
172
|
+
#
|
173
|
+
def self.create: (_ToS | Version | nil input) -> instance?
|
174
|
+
|
175
|
+
# Constructs a Version from the `version` string. A version string is a series
|
176
|
+
# of digits or ASCII letters separated by dots.
|
177
|
+
#
|
178
|
+
def initialize: (_ToS version) -> void
|
179
|
+
|
180
|
+
# is larger, the same, or smaller than this one. Attempts to compare to
|
181
|
+
# something that's not a `Gem::Version` return `nil`.
|
182
|
+
#
|
183
|
+
def <=>: (untyped other) -> Integer?
|
184
|
+
|
185
|
+
# A recommended version for use with a ~> Requirement.
|
186
|
+
#
|
187
|
+
def approximate_recommendation: () -> String
|
188
|
+
|
189
|
+
# Return a new version object where the next to the last revision number is one
|
190
|
+
# greater (e.g., 5.3.1 => 5.4).
|
191
|
+
#
|
192
|
+
# Pre-release (alpha) parts, e.g, 5.3.1.b.2 => 5.4, are ignored.
|
193
|
+
#
|
194
|
+
def bump: () -> instance
|
195
|
+
|
196
|
+
def canonical_segments: () -> Array[Integer | String]
|
197
|
+
|
198
|
+
# A Version is only eql? to another version if it's specified to the same
|
199
|
+
# precision. Version "1.0" is not the same as version "1".
|
200
|
+
#
|
201
|
+
def eql?: (untyped other) -> bool
|
202
|
+
|
203
|
+
# Dump only the raw version string, not the complete object. It's a string for
|
204
|
+
# backwards (RubyGems 1.3.5 and earlier) compatibility.
|
205
|
+
#
|
206
|
+
def marshal_dump: () -> Array[String]
|
207
|
+
|
208
|
+
# Load custom marshal format. It's a string for backwards (RubyGems 1.3.5 and
|
209
|
+
# earlier) compatibility.
|
210
|
+
#
|
211
|
+
def marshal_load: (Array[String] array) -> void
|
212
|
+
|
213
|
+
# A version is considered a prerelease if it contains a letter.
|
214
|
+
#
|
215
|
+
def prerelease?: () -> bool
|
216
|
+
|
217
|
+
# The release for this version (e.g. 1.2.0.a -> 1.2.0). Non-prerelease versions
|
218
|
+
# return themselves.
|
219
|
+
#
|
220
|
+
def release: () -> instance
|
221
|
+
|
222
|
+
# A string representation of this Version.
|
223
|
+
#
|
224
|
+
def version: () -> String
|
225
|
+
|
226
|
+
alias to_s version
|
227
|
+
end
|
228
|
+
end
|
@@ -0,0 +1,582 @@
|
|
1
|
+
# StringScanner provides for lexical scanning operations on a String. Here is
|
2
|
+
# an example of its usage:
|
3
|
+
#
|
4
|
+
# s = StringScanner.new('This is an example string')
|
5
|
+
# s.eos? # -> false
|
6
|
+
#
|
7
|
+
# p s.scan(/\w+/) # -> "This"
|
8
|
+
# p s.scan(/\w+/) # -> nil
|
9
|
+
# p s.scan(/\s+/) # -> " "
|
10
|
+
# p s.scan(/\s+/) # -> nil
|
11
|
+
# p s.scan(/\w+/) # -> "is"
|
12
|
+
# s.eos? # -> false
|
13
|
+
#
|
14
|
+
# p s.scan(/\s+/) # -> " "
|
15
|
+
# p s.scan(/\w+/) # -> "an"
|
16
|
+
# p s.scan(/\s+/) # -> " "
|
17
|
+
# p s.scan(/\w+/) # -> "example"
|
18
|
+
# p s.scan(/\s+/) # -> " "
|
19
|
+
# p s.scan(/\w+/) # -> "string"
|
20
|
+
# s.eos? # -> true
|
21
|
+
#
|
22
|
+
# p s.scan(/\s+/) # -> nil
|
23
|
+
# p s.scan(/\w+/) # -> nil
|
24
|
+
#
|
25
|
+
# Scanning a string means remembering the position of a *scan pointer*, which is
|
26
|
+
# just an index. The point of scanning is to move forward a bit at a time, so
|
27
|
+
# matches are sought after the scan pointer; usually immediately after it.
|
28
|
+
#
|
29
|
+
# Given the string "test string", here are the pertinent scan pointer positions:
|
30
|
+
#
|
31
|
+
# t e s t s t r i n g
|
32
|
+
# 0 1 2 ... 1
|
33
|
+
# 0
|
34
|
+
#
|
35
|
+
# When you #scan for a pattern (a regular expression), the match must occur at
|
36
|
+
# the character after the scan pointer. If you use #scan_until, then the match
|
37
|
+
# can occur anywhere after the scan pointer. In both cases, the scan pointer
|
38
|
+
# moves *just beyond* the last character of the match, ready to scan again from
|
39
|
+
# the next character onwards. This is demonstrated by the example above.
|
40
|
+
#
|
41
|
+
# ## Method Categories
|
42
|
+
#
|
43
|
+
# There are other methods besides the plain scanners. You can look ahead in the
|
44
|
+
# string without actually scanning. You can access the most recent match. You
|
45
|
+
# can modify the string being scanned, reset or terminate the scanner, find out
|
46
|
+
# or change the position of the scan pointer, skip ahead, and so on.
|
47
|
+
#
|
48
|
+
# ### Advancing the Scan Pointer
|
49
|
+
#
|
50
|
+
# * #getch
|
51
|
+
# * #get_byte
|
52
|
+
# * #scan
|
53
|
+
# * #scan_until
|
54
|
+
# * #skip
|
55
|
+
# * #skip_until
|
56
|
+
#
|
57
|
+
#
|
58
|
+
# ### Looking Ahead
|
59
|
+
#
|
60
|
+
# * #check
|
61
|
+
# * #check_until
|
62
|
+
# * #exist?
|
63
|
+
# * #match?
|
64
|
+
# * #peek
|
65
|
+
#
|
66
|
+
#
|
67
|
+
# ### Finding Where we Are
|
68
|
+
#
|
69
|
+
# * #beginning_of_line? (#bol?)
|
70
|
+
# * #eos?
|
71
|
+
# * #rest?
|
72
|
+
# * #rest_size
|
73
|
+
# * #pos
|
74
|
+
#
|
75
|
+
#
|
76
|
+
# ### Setting Where we Are
|
77
|
+
#
|
78
|
+
# * #reset
|
79
|
+
# * #terminate
|
80
|
+
# * #pos=
|
81
|
+
#
|
82
|
+
#
|
83
|
+
# ### Match Data
|
84
|
+
#
|
85
|
+
# * #matched
|
86
|
+
# * #matched?
|
87
|
+
# * #matched_size
|
88
|
+
#
|
89
|
+
#
|
90
|
+
# :
|
91
|
+
# * #pre_match
|
92
|
+
# * #post_match
|
93
|
+
#
|
94
|
+
#
|
95
|
+
# ### Miscellaneous
|
96
|
+
#
|
97
|
+
# * <<
|
98
|
+
# * #concat
|
99
|
+
# * #string
|
100
|
+
# * #string=
|
101
|
+
# * #unscan
|
102
|
+
#
|
103
|
+
#
|
104
|
+
# There are aliases to several of the methods.
|
105
|
+
class StringScanner
|
106
|
+
# This method is defined for backward compatibility.
|
107
|
+
#
|
108
|
+
def self.must_C_version: () -> self
|
109
|
+
|
110
|
+
public
|
111
|
+
|
112
|
+
# Appends `str` to the string being scanned. This method does not affect scan
|
113
|
+
# pointer.
|
114
|
+
#
|
115
|
+
# s = StringScanner.new("Fri Dec 12 1975 14:39")
|
116
|
+
# s.scan(/Fri /)
|
117
|
+
# s << " +1000 GMT"
|
118
|
+
# s.string # -> "Fri Dec 12 1975 14:39 +1000 GMT"
|
119
|
+
# s.scan(/Dec/) # -> "Dec"
|
120
|
+
#
|
121
|
+
def <<: (String) -> self
|
122
|
+
|
123
|
+
# Returns the n-th subgroup in the most recent match.
|
124
|
+
#
|
125
|
+
# s = StringScanner.new("Fri Dec 12 1975 14:39")
|
126
|
+
# s.scan(/(\w+) (\w+) (\d+) /) # -> "Fri Dec 12 "
|
127
|
+
# s[0] # -> "Fri Dec 12 "
|
128
|
+
# s[1] # -> "Fri"
|
129
|
+
# s[2] # -> "Dec"
|
130
|
+
# s[3] # -> "12"
|
131
|
+
# s.post_match # -> "1975 14:39"
|
132
|
+
# s.pre_match # -> ""
|
133
|
+
#
|
134
|
+
# s.reset
|
135
|
+
# s.scan(/(?<wday>\w+) (?<month>\w+) (?<day>\d+) /) # -> "Fri Dec 12 "
|
136
|
+
# s[0] # -> "Fri Dec 12 "
|
137
|
+
# s[1] # -> "Fri"
|
138
|
+
# s[2] # -> "Dec"
|
139
|
+
# s[3] # -> "12"
|
140
|
+
# s[:wday] # -> "Fri"
|
141
|
+
# s[:month] # -> "Dec"
|
142
|
+
# s[:day] # -> "12"
|
143
|
+
# s.post_match # -> "1975 14:39"
|
144
|
+
# s.pre_match # -> ""
|
145
|
+
#
|
146
|
+
def []: (Integer) -> String?
|
147
|
+
|
148
|
+
# Returns `true` iff the scan pointer is at the beginning of the line.
|
149
|
+
#
|
150
|
+
# s = StringScanner.new("test\ntest\n")
|
151
|
+
# s.bol? # => true
|
152
|
+
# s.scan(/te/)
|
153
|
+
# s.bol? # => false
|
154
|
+
# s.scan(/st\n/)
|
155
|
+
# s.bol? # => true
|
156
|
+
# s.terminate
|
157
|
+
# s.bol? # => true
|
158
|
+
#
|
159
|
+
def beginning_of_line?: () -> bool
|
160
|
+
|
161
|
+
alias bol? beginning_of_line?
|
162
|
+
|
163
|
+
# Returns the subgroups in the most recent match (not including the full match).
|
164
|
+
# If nothing was priorly matched, it returns nil.
|
165
|
+
#
|
166
|
+
# s = StringScanner.new("Fri Dec 12 1975 14:39")
|
167
|
+
# s.scan(/(\w+) (\w+) (\d+) /) # -> "Fri Dec 12 "
|
168
|
+
# s.captures # -> ["Fri", "Dec", "12"]
|
169
|
+
# s.scan(/(\w+) (\w+) (\d+) /) # -> nil
|
170
|
+
# s.captures # -> nil
|
171
|
+
#
|
172
|
+
def captures: () -> Array[String]?
|
173
|
+
|
174
|
+
# Returns the character position of the scan pointer. In the 'reset' position,
|
175
|
+
# this value is zero. In the 'terminated' position (i.e. the string is
|
176
|
+
# exhausted), this value is the size of the string.
|
177
|
+
#
|
178
|
+
# In short, it's a 0-based index into the string.
|
179
|
+
#
|
180
|
+
# s = StringScanner.new("abcädeföghi")
|
181
|
+
# s.charpos # -> 0
|
182
|
+
# s.scan_until(/ä/) # -> "abcä"
|
183
|
+
# s.pos # -> 5
|
184
|
+
# s.charpos # -> 4
|
185
|
+
#
|
186
|
+
def charpos: () -> Integer
|
187
|
+
|
188
|
+
# This returns the value that #scan would return, without advancing the scan
|
189
|
+
# pointer. The match register is affected, though.
|
190
|
+
#
|
191
|
+
# s = StringScanner.new("Fri Dec 12 1975 14:39")
|
192
|
+
# s.check /Fri/ # -> "Fri"
|
193
|
+
# s.pos # -> 0
|
194
|
+
# s.matched # -> "Fri"
|
195
|
+
# s.check /12/ # -> nil
|
196
|
+
# s.matched # -> nil
|
197
|
+
#
|
198
|
+
# Mnemonic: it "checks" to see whether a #scan will return a value.
|
199
|
+
#
|
200
|
+
def check: (Regexp) -> String?
|
201
|
+
|
202
|
+
# This returns the value that #scan_until would return, without advancing the
|
203
|
+
# scan pointer. The match register is affected, though.
|
204
|
+
#
|
205
|
+
# s = StringScanner.new("Fri Dec 12 1975 14:39")
|
206
|
+
# s.check_until /12/ # -> "Fri Dec 12"
|
207
|
+
# s.pos # -> 0
|
208
|
+
# s.matched # -> 12
|
209
|
+
#
|
210
|
+
# Mnemonic: it "checks" to see whether a #scan_until will return a value.
|
211
|
+
#
|
212
|
+
def check_until: (Regexp) -> String
|
213
|
+
|
214
|
+
# Equivalent to #terminate. This method is obsolete; use #terminate instead.
|
215
|
+
#
|
216
|
+
def clear: () -> void
|
217
|
+
|
218
|
+
alias concat <<
|
219
|
+
|
220
|
+
# Equivalent to #eos?. This method is obsolete, use #eos? instead.
|
221
|
+
#
|
222
|
+
def empty?: () -> bool
|
223
|
+
|
224
|
+
# Returns `true` if the scan pointer is at the end of the string.
|
225
|
+
#
|
226
|
+
# s = StringScanner.new('test string')
|
227
|
+
# p s.eos? # => false
|
228
|
+
# s.scan(/test/)
|
229
|
+
# p s.eos? # => false
|
230
|
+
# s.terminate
|
231
|
+
# p s.eos? # => true
|
232
|
+
#
|
233
|
+
def eos?: () -> bool
|
234
|
+
|
235
|
+
# Looks *ahead* to see if the `pattern` exists *anywhere* in the string, without
|
236
|
+
# advancing the scan pointer. This predicates whether a #scan_until will return
|
237
|
+
# a value.
|
238
|
+
#
|
239
|
+
# s = StringScanner.new('test string')
|
240
|
+
# s.exist? /s/ # -> 3
|
241
|
+
# s.scan /test/ # -> "test"
|
242
|
+
# s.exist? /s/ # -> 2
|
243
|
+
# s.exist? /e/ # -> nil
|
244
|
+
#
|
245
|
+
def exist?: (Regexp) -> Integer?
|
246
|
+
|
247
|
+
# Whether `scanner` uses fixed anchor mode or not.
|
248
|
+
#
|
249
|
+
# If fixed anchor mode is used, `\A` always matches the beginning of the string.
|
250
|
+
# Otherwise, `\A` always matches the current position.
|
251
|
+
#
|
252
|
+
def fixed_anchor?: () -> bool
|
253
|
+
|
254
|
+
# Scans one byte and returns it. This method is not multibyte character
|
255
|
+
# sensitive. See also: #getch.
|
256
|
+
#
|
257
|
+
# s = StringScanner.new('ab')
|
258
|
+
# s.get_byte # => "a"
|
259
|
+
# s.get_byte # => "b"
|
260
|
+
# s.get_byte # => nil
|
261
|
+
#
|
262
|
+
# s = StringScanner.new("\244\242".force_encoding("euc-jp"))
|
263
|
+
# s.get_byte # => "\xA4"
|
264
|
+
# s.get_byte # => "\xA2"
|
265
|
+
# s.get_byte # => nil
|
266
|
+
#
|
267
|
+
def get_byte: () -> String?
|
268
|
+
|
269
|
+
# Equivalent to #get_byte. This method is obsolete; use #get_byte instead.
|
270
|
+
#
|
271
|
+
def getbyte: () -> String?
|
272
|
+
|
273
|
+
# Scans one character and returns it. This method is multibyte character
|
274
|
+
# sensitive.
|
275
|
+
#
|
276
|
+
# s = StringScanner.new("ab")
|
277
|
+
# s.getch # => "a"
|
278
|
+
# s.getch # => "b"
|
279
|
+
# s.getch # => nil
|
280
|
+
#
|
281
|
+
# s = StringScanner.new("\244\242".force_encoding("euc-jp"))
|
282
|
+
# s.getch # => "\x{A4A2}" # Japanese hira-kana "A" in EUC-JP
|
283
|
+
# s.getch # => nil
|
284
|
+
#
|
285
|
+
def getch: () -> String?
|
286
|
+
|
287
|
+
# Returns a string that represents the StringScanner object, showing:
|
288
|
+
# * the current position
|
289
|
+
# * the size of the string
|
290
|
+
# * the characters surrounding the scan pointer
|
291
|
+
#
|
292
|
+
# s = StringScanner.new("Fri Dec 12 1975 14:39") s.inspect # ->
|
293
|
+
# '#<StringScanner 0/21 @ "Fri D...">' s.scan_until /12/ # -> "Fri Dec
|
294
|
+
# 12" s.inspect # -> '#<StringScanner 10/21 "...ec 12" @ "
|
295
|
+
# 1975...">'
|
296
|
+
#
|
297
|
+
def inspect: () -> String
|
298
|
+
|
299
|
+
# Tests whether the given `pattern` is matched from the current scan pointer.
|
300
|
+
# Returns the length of the match, or `nil`. The scan pointer is not advanced.
|
301
|
+
#
|
302
|
+
# s = StringScanner.new('test string')
|
303
|
+
# p s.match?(/\w+/) # -> 4
|
304
|
+
# p s.match?(/\w+/) # -> 4
|
305
|
+
# p s.match?("test") # -> 4
|
306
|
+
# p s.match?(/\s+/) # -> nil
|
307
|
+
#
|
308
|
+
def match?: (Regexp) -> Integer?
|
309
|
+
|
310
|
+
# Returns the last matched string.
|
311
|
+
#
|
312
|
+
# s = StringScanner.new('test string')
|
313
|
+
# s.match?(/\w+/) # -> 4
|
314
|
+
# s.matched # -> "test"
|
315
|
+
#
|
316
|
+
def matched: () -> String?
|
317
|
+
|
318
|
+
# Returns `true` iff the last match was successful.
|
319
|
+
#
|
320
|
+
# s = StringScanner.new('test string')
|
321
|
+
# s.match?(/\w+/) # => 4
|
322
|
+
# s.matched? # => true
|
323
|
+
# s.match?(/\d+/) # => nil
|
324
|
+
# s.matched? # => false
|
325
|
+
#
|
326
|
+
def matched?: () -> bool
|
327
|
+
|
328
|
+
# Returns the size of the most recent match in bytes, or `nil` if there was no
|
329
|
+
# recent match. This is different than `matched.size`, which will return the
|
330
|
+
# size in characters.
|
331
|
+
#
|
332
|
+
# s = StringScanner.new('test string')
|
333
|
+
# s.check /\w+/ # -> "test"
|
334
|
+
# s.matched_size # -> 4
|
335
|
+
# s.check /\d+/ # -> nil
|
336
|
+
# s.matched_size # -> nil
|
337
|
+
#
|
338
|
+
def matched_size: () -> Integer?
|
339
|
+
|
340
|
+
# Extracts a string corresponding to `string[pos,len]`, without advancing the
|
341
|
+
# scan pointer.
|
342
|
+
#
|
343
|
+
# s = StringScanner.new('test string')
|
344
|
+
# s.peek(7) # => "test st"
|
345
|
+
# s.peek(7) # => "test st"
|
346
|
+
#
|
347
|
+
def peek: (Integer) -> String
|
348
|
+
|
349
|
+
# Equivalent to #peek. This method is obsolete; use #peek instead.
|
350
|
+
#
|
351
|
+
def peep: (Integer) -> String
|
352
|
+
|
353
|
+
# Returns the byte position of the scan pointer. In the 'reset' position, this
|
354
|
+
# value is zero. In the 'terminated' position (i.e. the string is exhausted),
|
355
|
+
# this value is the bytesize of the string.
|
356
|
+
#
|
357
|
+
# In short, it's a 0-based index into bytes of the string.
|
358
|
+
#
|
359
|
+
# s = StringScanner.new('test string')
|
360
|
+
# s.pos # -> 0
|
361
|
+
# s.scan_until /str/ # -> "test str"
|
362
|
+
# s.pos # -> 8
|
363
|
+
# s.terminate # -> #<StringScanner fin>
|
364
|
+
# s.pos # -> 11
|
365
|
+
#
|
366
|
+
def pointer: () -> Integer
|
367
|
+
|
368
|
+
# Sets the byte position of the scan pointer.
|
369
|
+
#
|
370
|
+
# s = StringScanner.new('test string')
|
371
|
+
# s.pos = 7 # -> 7
|
372
|
+
# s.rest # -> "ring"
|
373
|
+
#
|
374
|
+
def pointer=: (Integer) -> Integer
|
375
|
+
|
376
|
+
# Returns the byte position of the scan pointer. In the 'reset' position, this
|
377
|
+
# value is zero. In the 'terminated' position (i.e. the string is exhausted),
|
378
|
+
# this value is the bytesize of the string.
|
379
|
+
#
|
380
|
+
# In short, it's a 0-based index into bytes of the string.
|
381
|
+
#
|
382
|
+
# s = StringScanner.new('test string')
|
383
|
+
# s.pos # -> 0
|
384
|
+
# s.scan_until /str/ # -> "test str"
|
385
|
+
# s.pos # -> 8
|
386
|
+
# s.terminate # -> #<StringScanner fin>
|
387
|
+
# s.pos # -> 11
|
388
|
+
#
|
389
|
+
def pos: () -> Integer
|
390
|
+
|
391
|
+
# Sets the byte position of the scan pointer.
|
392
|
+
#
|
393
|
+
# s = StringScanner.new('test string')
|
394
|
+
# s.pos = 7 # -> 7
|
395
|
+
# s.rest # -> "ring"
|
396
|
+
#
|
397
|
+
def pos=: (Integer) -> Integer
|
398
|
+
|
399
|
+
# Returns the ***post**-match* (in the regular expression sense) of the last
|
400
|
+
# scan.
|
401
|
+
#
|
402
|
+
# s = StringScanner.new('test string')
|
403
|
+
# s.scan(/\w+/) # -> "test"
|
404
|
+
# s.scan(/\s+/) # -> " "
|
405
|
+
# s.pre_match # -> "test"
|
406
|
+
# s.post_match # -> "string"
|
407
|
+
#
|
408
|
+
def post_match: () -> String
|
409
|
+
|
410
|
+
# Returns the ***pre**-match* (in the regular expression sense) of the last
|
411
|
+
# scan.
|
412
|
+
#
|
413
|
+
# s = StringScanner.new('test string')
|
414
|
+
# s.scan(/\w+/) # -> "test"
|
415
|
+
# s.scan(/\s+/) # -> " "
|
416
|
+
# s.pre_match # -> "test"
|
417
|
+
# s.post_match # -> "string"
|
418
|
+
#
|
419
|
+
def pre_match: () -> String
|
420
|
+
|
421
|
+
# Reset the scan pointer (index 0) and clear matching data.
|
422
|
+
#
|
423
|
+
def reset: () -> void
|
424
|
+
|
425
|
+
# Returns the "rest" of the string (i.e. everything after the scan pointer). If
|
426
|
+
# there is no more data (eos? = true), it returns `""`.
|
427
|
+
#
|
428
|
+
def rest: () -> String
|
429
|
+
|
430
|
+
# Returns true iff there is more data in the string. See #eos?. This method is
|
431
|
+
# obsolete; use #eos? instead.
|
432
|
+
#
|
433
|
+
# s = StringScanner.new('test string')
|
434
|
+
# s.eos? # These two
|
435
|
+
# s.rest? # are opposites.
|
436
|
+
#
|
437
|
+
def rest?: () -> bool
|
438
|
+
|
439
|
+
# `s.rest_size` is equivalent to `s.rest.size`.
|
440
|
+
#
|
441
|
+
def rest_size: () -> Integer
|
442
|
+
|
443
|
+
# `s.restsize` is equivalent to `s.rest_size`. This method is obsolete; use
|
444
|
+
# #rest_size instead.
|
445
|
+
#
|
446
|
+
def restsize: () -> Integer
|
447
|
+
|
448
|
+
# Tries to match with `pattern` at the current position. If there's a match, the
|
449
|
+
# scanner advances the "scan pointer" and returns the matched string. Otherwise,
|
450
|
+
# the scanner returns `nil`.
|
451
|
+
#
|
452
|
+
# s = StringScanner.new('test string')
|
453
|
+
# p s.scan(/\w+/) # -> "test"
|
454
|
+
# p s.scan(/\w+/) # -> nil
|
455
|
+
# p s.scan(/\s+/) # -> " "
|
456
|
+
# p s.scan("str") # -> "str"
|
457
|
+
# p s.scan(/\w+/) # -> "ing"
|
458
|
+
# p s.scan(/./) # -> nil
|
459
|
+
#
|
460
|
+
def scan: (Regexp) -> String?
|
461
|
+
|
462
|
+
# Tests whether the given `pattern` is matched from the current scan pointer.
|
463
|
+
# Advances the scan pointer if `advance_pointer_p` is true. Returns the matched
|
464
|
+
# string if `return_string_p` is true. The match register is affected.
|
465
|
+
#
|
466
|
+
# "full" means "#scan with full parameters".
|
467
|
+
#
|
468
|
+
def scan_full: (Regexp pattern, bool advance_pointer_p, bool return_string_p) -> untyped
|
469
|
+
|
470
|
+
# Scans the string *until* the `pattern` is matched. Returns the substring up
|
471
|
+
# to and including the end of the match, advancing the scan pointer to that
|
472
|
+
# location. If there is no match, `nil` is returned.
|
473
|
+
#
|
474
|
+
# s = StringScanner.new("Fri Dec 12 1975 14:39")
|
475
|
+
# s.scan_until(/1/) # -> "Fri Dec 1"
|
476
|
+
# s.pre_match # -> "Fri Dec "
|
477
|
+
# s.scan_until(/XYZ/) # -> nil
|
478
|
+
#
|
479
|
+
def scan_until: (Regexp) -> String?
|
480
|
+
|
481
|
+
# Scans the string *until* the `pattern` is matched. Advances the scan pointer
|
482
|
+
# if `advance_pointer_p`, otherwise not. Returns the matched string if
|
483
|
+
# `return_string_p` is true, otherwise returns the number of bytes advanced.
|
484
|
+
# This method does affect the match register.
|
485
|
+
#
|
486
|
+
def search_full: (Regexp pattern, bool advance_pointer_p, bool return_string_p) -> untyped
|
487
|
+
|
488
|
+
# Returns the amount of subgroups in the most recent match. The full match
|
489
|
+
# counts as a subgroup.
|
490
|
+
#
|
491
|
+
# s = StringScanner.new("Fri Dec 12 1975 14:39")
|
492
|
+
# s.scan(/(\w+) (\w+) (\d+) /) # -> "Fri Dec 12 "
|
493
|
+
# s.size # -> 4
|
494
|
+
#
|
495
|
+
def size: () -> Integer
|
496
|
+
|
497
|
+
# Attempts to skip over the given `pattern` beginning with the scan pointer. If
|
498
|
+
# it matches, the scan pointer is advanced to the end of the match, and the
|
499
|
+
# length of the match is returned. Otherwise, `nil` is returned.
|
500
|
+
#
|
501
|
+
# It's similar to #scan, but without returning the matched string.
|
502
|
+
#
|
503
|
+
# s = StringScanner.new('test string')
|
504
|
+
# p s.skip(/\w+/) # -> 4
|
505
|
+
# p s.skip(/\w+/) # -> nil
|
506
|
+
# p s.skip(/\s+/) # -> 1
|
507
|
+
# p s.skip("st") # -> 2
|
508
|
+
# p s.skip(/\w+/) # -> 4
|
509
|
+
# p s.skip(/./) # -> nil
|
510
|
+
#
|
511
|
+
def skip: (Regexp) -> Integer?
|
512
|
+
|
513
|
+
# Advances the scan pointer until `pattern` is matched and consumed. Returns
|
514
|
+
# the number of bytes advanced, or `nil` if no match was found.
|
515
|
+
#
|
516
|
+
# Look ahead to match `pattern`, and advance the scan pointer to the *end* of
|
517
|
+
# the match. Return the number of characters advanced, or `nil` if the match
|
518
|
+
# was unsuccessful.
|
519
|
+
#
|
520
|
+
# It's similar to #scan_until, but without returning the intervening string.
|
521
|
+
#
|
522
|
+
# s = StringScanner.new("Fri Dec 12 1975 14:39")
|
523
|
+
# s.skip_until /12/ # -> 10
|
524
|
+
# s #
|
525
|
+
#
|
526
|
+
def skip_until: (Regexp) -> Integer?
|
527
|
+
|
528
|
+
# Returns the string being scanned.
|
529
|
+
#
|
530
|
+
def string: () -> String
|
531
|
+
|
532
|
+
# Changes the string being scanned to `str` and resets the scanner. Returns
|
533
|
+
# `str`.
|
534
|
+
#
|
535
|
+
def string=: (String) -> String
|
536
|
+
|
537
|
+
# Sets the scan pointer to the end of the string and clear matching data.
|
538
|
+
#
|
539
|
+
def terminate: () -> void
|
540
|
+
|
541
|
+
# Sets the scan pointer to the previous position. Only one previous position is
|
542
|
+
# remembered, and it changes with each scanning operation.
|
543
|
+
#
|
544
|
+
# s = StringScanner.new('test string')
|
545
|
+
# s.scan(/\w+/) # => "test"
|
546
|
+
# s.unscan
|
547
|
+
# s.scan(/../) # => "te"
|
548
|
+
# s.scan(/\d/) # => nil
|
549
|
+
# s.unscan # ScanError: unscan failed: previous match record not exist
|
550
|
+
#
|
551
|
+
def unscan: () -> void
|
552
|
+
|
553
|
+
# Returns the subgroups in the most recent match at the given indices. If
|
554
|
+
# nothing was priorly matched, it returns nil.
|
555
|
+
#
|
556
|
+
# s = StringScanner.new("Fri Dec 12 1975 14:39")
|
557
|
+
# s.scan(/(\w+) (\w+) (\d+) /) # -> "Fri Dec 12 "
|
558
|
+
# s.values_at 0, -1, 5, 2 # -> ["Fri Dec 12 ", "12", nil, "Dec"]
|
559
|
+
# s.scan(/(\w+) (\w+) (\d+) /) # -> nil
|
560
|
+
# s.values_at 0, -1, 5, 2 # -> nil
|
561
|
+
#
|
562
|
+
def values_at: (*Integer) -> Array[String]?
|
563
|
+
|
564
|
+
private
|
565
|
+
|
566
|
+
# Creates a new StringScanner object to scan over the given `string`.
|
567
|
+
#
|
568
|
+
# If `fixed_anchor` is `true`, `\A` always matches the beginning of the string.
|
569
|
+
# Otherwise, `\A` always matches the current position.
|
570
|
+
#
|
571
|
+
# `dup` argument is obsolete and not used now.
|
572
|
+
#
|
573
|
+
def initialize: (String, ?bool dup, ?fixed_anchor: bool) -> untyped
|
574
|
+
|
575
|
+
# Duplicates a StringScanner object.
|
576
|
+
#
|
577
|
+
def initialize_copy: (StringScanner) -> void
|
578
|
+
end
|
579
|
+
|
580
|
+
StringScanner::Id: String
|
581
|
+
|
582
|
+
StringScanner::Version: String
|