rbs 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (132) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ruby.yml +28 -0
  3. data/.gitignore +12 -0
  4. data/.rubocop.yml +15 -0
  5. data/BSDL +22 -0
  6. data/CHANGELOG.md +9 -0
  7. data/COPYING +56 -0
  8. data/Gemfile +6 -0
  9. data/README.md +93 -0
  10. data/Rakefile +142 -0
  11. data/bin/annotate-with-rdoc +157 -0
  12. data/bin/console +14 -0
  13. data/bin/query-rdoc +103 -0
  14. data/bin/setup +10 -0
  15. data/bin/sort +89 -0
  16. data/bin/test_runner.rb +16 -0
  17. data/docs/CONTRIBUTING.md +97 -0
  18. data/docs/sigs.md +148 -0
  19. data/docs/stdlib.md +152 -0
  20. data/docs/syntax.md +528 -0
  21. data/exe/rbs +7 -0
  22. data/lib/rbs.rb +64 -0
  23. data/lib/rbs/ast/annotation.rb +27 -0
  24. data/lib/rbs/ast/comment.rb +27 -0
  25. data/lib/rbs/ast/declarations.rb +395 -0
  26. data/lib/rbs/ast/members.rb +362 -0
  27. data/lib/rbs/buffer.rb +50 -0
  28. data/lib/rbs/builtin_names.rb +55 -0
  29. data/lib/rbs/cli.rb +558 -0
  30. data/lib/rbs/constant.rb +26 -0
  31. data/lib/rbs/constant_table.rb +150 -0
  32. data/lib/rbs/definition.rb +170 -0
  33. data/lib/rbs/definition_builder.rb +919 -0
  34. data/lib/rbs/environment.rb +281 -0
  35. data/lib/rbs/environment_loader.rb +136 -0
  36. data/lib/rbs/environment_walker.rb +124 -0
  37. data/lib/rbs/errors.rb +187 -0
  38. data/lib/rbs/location.rb +102 -0
  39. data/lib/rbs/method_type.rb +123 -0
  40. data/lib/rbs/namespace.rb +91 -0
  41. data/lib/rbs/parser.y +1344 -0
  42. data/lib/rbs/prototype/rb.rb +553 -0
  43. data/lib/rbs/prototype/rbi.rb +587 -0
  44. data/lib/rbs/prototype/runtime.rb +381 -0
  45. data/lib/rbs/substitution.rb +46 -0
  46. data/lib/rbs/test.rb +26 -0
  47. data/lib/rbs/test/errors.rb +61 -0
  48. data/lib/rbs/test/hook.rb +294 -0
  49. data/lib/rbs/test/setup.rb +58 -0
  50. data/lib/rbs/test/spy.rb +325 -0
  51. data/lib/rbs/test/test_helper.rb +183 -0
  52. data/lib/rbs/test/type_check.rb +254 -0
  53. data/lib/rbs/type_name.rb +70 -0
  54. data/lib/rbs/types.rb +936 -0
  55. data/lib/rbs/variance_calculator.rb +138 -0
  56. data/lib/rbs/vendorer.rb +47 -0
  57. data/lib/rbs/version.rb +3 -0
  58. data/lib/rbs/writer.rb +269 -0
  59. data/lib/ruby/signature.rb +7 -0
  60. data/rbs.gemspec +46 -0
  61. data/stdlib/abbrev/abbrev.rbs +60 -0
  62. data/stdlib/base64/base64.rbs +71 -0
  63. data/stdlib/benchmark/benchmark.rbs +372 -0
  64. data/stdlib/builtin/array.rbs +1997 -0
  65. data/stdlib/builtin/basic_object.rbs +280 -0
  66. data/stdlib/builtin/binding.rbs +177 -0
  67. data/stdlib/builtin/builtin.rbs +45 -0
  68. data/stdlib/builtin/class.rbs +145 -0
  69. data/stdlib/builtin/comparable.rbs +116 -0
  70. data/stdlib/builtin/complex.rbs +400 -0
  71. data/stdlib/builtin/constants.rbs +37 -0
  72. data/stdlib/builtin/data.rbs +5 -0
  73. data/stdlib/builtin/deprecated.rbs +2 -0
  74. data/stdlib/builtin/dir.rbs +413 -0
  75. data/stdlib/builtin/encoding.rbs +607 -0
  76. data/stdlib/builtin/enumerable.rbs +404 -0
  77. data/stdlib/builtin/enumerator.rbs +260 -0
  78. data/stdlib/builtin/errno.rbs +781 -0
  79. data/stdlib/builtin/errors.rbs +582 -0
  80. data/stdlib/builtin/exception.rbs +194 -0
  81. data/stdlib/builtin/false_class.rbs +40 -0
  82. data/stdlib/builtin/fiber.rbs +68 -0
  83. data/stdlib/builtin/fiber_error.rbs +12 -0
  84. data/stdlib/builtin/file.rbs +1076 -0
  85. data/stdlib/builtin/file_test.rbs +59 -0
  86. data/stdlib/builtin/float.rbs +696 -0
  87. data/stdlib/builtin/gc.rbs +243 -0
  88. data/stdlib/builtin/hash.rbs +1029 -0
  89. data/stdlib/builtin/integer.rbs +707 -0
  90. data/stdlib/builtin/io.rbs +683 -0
  91. data/stdlib/builtin/kernel.rbs +576 -0
  92. data/stdlib/builtin/marshal.rbs +161 -0
  93. data/stdlib/builtin/match_data.rbs +271 -0
  94. data/stdlib/builtin/math.rbs +369 -0
  95. data/stdlib/builtin/method.rbs +185 -0
  96. data/stdlib/builtin/module.rbs +1104 -0
  97. data/stdlib/builtin/nil_class.rbs +82 -0
  98. data/stdlib/builtin/numeric.rbs +409 -0
  99. data/stdlib/builtin/object.rbs +824 -0
  100. data/stdlib/builtin/proc.rbs +429 -0
  101. data/stdlib/builtin/process.rbs +1227 -0
  102. data/stdlib/builtin/random.rbs +267 -0
  103. data/stdlib/builtin/range.rbs +226 -0
  104. data/stdlib/builtin/rational.rbs +424 -0
  105. data/stdlib/builtin/rb_config.rbs +57 -0
  106. data/stdlib/builtin/regexp.rbs +1083 -0
  107. data/stdlib/builtin/ruby_vm.rbs +14 -0
  108. data/stdlib/builtin/signal.rbs +55 -0
  109. data/stdlib/builtin/string.rbs +1901 -0
  110. data/stdlib/builtin/string_io.rbs +284 -0
  111. data/stdlib/builtin/struct.rbs +40 -0
  112. data/stdlib/builtin/symbol.rbs +228 -0
  113. data/stdlib/builtin/thread.rbs +1108 -0
  114. data/stdlib/builtin/thread_group.rbs +23 -0
  115. data/stdlib/builtin/time.rbs +1047 -0
  116. data/stdlib/builtin/trace_point.rbs +290 -0
  117. data/stdlib/builtin/true_class.rbs +46 -0
  118. data/stdlib/builtin/unbound_method.rbs +153 -0
  119. data/stdlib/builtin/warning.rbs +17 -0
  120. data/stdlib/coverage/coverage.rbs +62 -0
  121. data/stdlib/csv/csv.rbs +773 -0
  122. data/stdlib/erb/erb.rbs +392 -0
  123. data/stdlib/find/find.rbs +40 -0
  124. data/stdlib/ipaddr/ipaddr.rbs +247 -0
  125. data/stdlib/json/json.rbs +335 -0
  126. data/stdlib/pathname/pathname.rbs +1093 -0
  127. data/stdlib/prime/integer-extension.rbs +23 -0
  128. data/stdlib/prime/prime.rbs +188 -0
  129. data/stdlib/securerandom/securerandom.rbs +9 -0
  130. data/stdlib/set/set.rbs +301 -0
  131. data/stdlib/tmpdir/tmpdir.rbs +53 -0
  132. metadata +292 -0
@@ -0,0 +1,17 @@
1
+ # The [Warning](Warning) module contains a single
2
+ # method named [warn](Warning#method-i-warn), and the
3
+ # module extends itself, making `Warning.warn` available.
4
+ # [\#warn](Warning#method-i-warn) is called for all
5
+ # warnings issued by Ruby. By default, warnings are printed to $stderr.
6
+ #
7
+ # By overriding [\#warn](Warning#method-i-warn), you
8
+ # can change how warnings are handled by Ruby, either filtering some
9
+ # warnings, and/or outputting warnings somewhere other than $stderr. When
10
+ # [\#warn](Warning#method-i-warn) is overridden, super
11
+ # can be called to get the default behavior of printing the warning to
12
+ # $stderr.
13
+ module Warning
14
+ # Writes warning message msg to $stderr, followed by a newline if the message does not end in a newline.
15
+ # This method is called by Ruby for all emitted warnings.
16
+ def warn: (String) -> nil
17
+ end
@@ -0,0 +1,62 @@
1
+ # Coverage provides coverage measurement feature for Ruby. This feature is
2
+ # experimental, so these APIs may be changed in future.
3
+ #
4
+ # # Usage
5
+ #
6
+ # 1. require "coverage"
7
+ # 2. do Coverage.start
8
+ # 3. require or load Ruby source file
9
+ # 4. Coverage.result will return a hash that contains filename as key and
10
+ # coverage array as value. A coverage array gives, for each line, the number
11
+ # of line execution by the interpreter. A `nil` value means coverage is
12
+ # disabled for this line (lines like `else` and `end`).
13
+ #
14
+ #
15
+ # # Example
16
+ #
17
+ # [foo.rb]
18
+ # s = 0
19
+ # 10.times do |x|
20
+ # s += x
21
+ # end
22
+ #
23
+ # if s == 45
24
+ # p :ok
25
+ # else
26
+ # p :ng
27
+ # end
28
+ # [EOF]
29
+ #
30
+ # require "coverage"
31
+ # Coverage.start
32
+ # require "foo.rb"
33
+ # p Coverage.result #=> {"foo.rb"=>[1, 1, 10, nil, nil, 1, 1, nil, 0, nil]}
34
+ #
35
+ module Coverage
36
+ def self.line_stub: () -> Array[Integer?]
37
+
38
+ # Returns a hash that contains filename as key and coverage array as value. This
39
+ # is the same as `Coverage.result(stop: false, clear: false)`.
40
+ #
41
+ # {
42
+ # "file.rb" => [1, 2, nil],
43
+ # ...
44
+ # }
45
+ #
46
+ def self.peek_result: () -> Hash[String, untyped]
47
+
48
+ # Returns a hash that contains filename as key and coverage array as value. If
49
+ # `clear` is true, it clears the counters to zero. If `stop` is true, it
50
+ # disables coverage measurement.
51
+ #
52
+ def self.result: (?stop: bool, ?clear: bool) -> Hash[String, untyped]
53
+
54
+ # Returns true if coverage stats are currently being collected (after
55
+ # Coverage.start call, but before Coverage.result call)
56
+ #
57
+ def self.running?: () -> bool
58
+
59
+ # Enables coverage measurement.
60
+ #
61
+ def self.start: (?lines: bool, ?branches: bool, ?methods: bool, ?oneshot_lines: bool) -> nil
62
+ end
@@ -0,0 +1,773 @@
1
+ # This class provides a complete interface to CSV files and data. It offers
2
+ # tools to enable you to read and write to and from Strings or IO objects, as
3
+ # needed.
4
+ #
5
+ # The most generic interface of the library is:
6
+ #
7
+ # csv = CSV.new(string_or_io, **options)
8
+ #
9
+ # # Reading: IO object should be open for read
10
+ # csv.read # => array of rows
11
+ # # or
12
+ # csv.each do |row|
13
+ # # ...
14
+ # end
15
+ # # or
16
+ # row = csv.shift
17
+ #
18
+ # # Writing: IO object should be open for write
19
+ # csv << row
20
+ #
21
+ # There are several specialized class methods for one-statement reading or
22
+ # writing, described in the Specialized Methods section.
23
+ #
24
+ # If a String is passed into ::new, it is internally wrapped into a StringIO
25
+ # object.
26
+ #
27
+ # `options` can be used for specifying the particular CSV flavor (column
28
+ # separators, row separators, value quoting and so on), and for data conversion,
29
+ # see Data Conversion section for the description of the latter.
30
+ #
31
+ # ## Specialized Methods
32
+ #
33
+ # ### Reading
34
+ #
35
+ # # From a file: all at once
36
+ # arr_of_rows = CSV.read("path/to/file.csv", **options)
37
+ # # iterator-style:
38
+ # CSV.foreach("path/to/file.csv", **options) do |row|
39
+ # # ...
40
+ # end
41
+ #
42
+ # # From a string
43
+ # arr_of_rows = CSV.parse("CSV,data,String", **options)
44
+ # # or
45
+ # CSV.parse("CSV,data,String", **options) do |row|
46
+ # # ...
47
+ # end
48
+ #
49
+ # ### Writing
50
+ #
51
+ # # To a file
52
+ # CSV.open("path/to/file.csv", "wb") do |csv|
53
+ # csv << ["row", "of", "CSV", "data"]
54
+ # csv << ["another", "row"]
55
+ # # ...
56
+ # end
57
+ #
58
+ # # To a String
59
+ # csv_string = CSV.generate do |csv|
60
+ # csv << ["row", "of", "CSV", "data"]
61
+ # csv << ["another", "row"]
62
+ # # ...
63
+ # end
64
+ #
65
+ # ### Shortcuts
66
+ #
67
+ # # Core extensions for converting one line
68
+ # csv_string = ["CSV", "data"].to_csv # to CSV
69
+ # csv_array = "CSV,String".parse_csv # from CSV
70
+ #
71
+ # # CSV() method
72
+ # CSV { |csv_out| csv_out << %w{my data here} } # to $stdout
73
+ # CSV(csv = "") { |csv_str| csv_str << %w{my data here} } # to a String
74
+ # CSV($stderr) { |csv_err| csv_err << %w{my data here} } # to $stderr
75
+ # CSV($stdin) { |csv_in| csv_in.each { |row| p row } } # from $stdin
76
+ #
77
+ # ## Data Conversion
78
+ #
79
+ # ### CSV with headers
80
+ #
81
+ # CSV allows to specify column names of CSV file, whether they are in data, or
82
+ # provided separately. If headers are specified, reading methods return an
83
+ # instance of CSV::Table, consisting of CSV::Row.
84
+ #
85
+ # # Headers are part of data
86
+ # data = CSV.parse(<<~ROWS, headers: true)
87
+ # Name,Department,Salary
88
+ # Bob,Engineering,1000
89
+ # Jane,Sales,2000
90
+ # John,Management,5000
91
+ # ROWS
92
+ #
93
+ # data.class #=> CSV::Table
94
+ # data.first #=> #<CSV::Row "Name":"Bob" "Department":"Engineering" "Salary":"1000">
95
+ # data.first.to_h #=> {"Name"=>"Bob", "Department"=>"Engineering", "Salary"=>"1000"}
96
+ #
97
+ # # Headers provided by developer
98
+ # data = CSV.parse('Bob,Engineering,1000', headers: %i[name department salary])
99
+ # data.first #=> #<CSV::Row name:"Bob" department:"Engineering" salary:"1000">
100
+ #
101
+ # ### Typed data reading
102
+ #
103
+ # CSV allows to provide a set of data *converters* e.g. transformations to try
104
+ # on input data. Converter could be a symbol from CSV::Converters constant's
105
+ # keys, or lambda.
106
+ #
107
+ # # Without any converters:
108
+ # CSV.parse('Bob,2018-03-01,100')
109
+ # #=> [["Bob", "2018-03-01", "100"]]
110
+ #
111
+ # # With built-in converters:
112
+ # CSV.parse('Bob,2018-03-01,100', converters: %i[numeric date])
113
+ # #=> [["Bob", #<Date: 2018-03-01>, 100]]
114
+ #
115
+ # # With custom converters:
116
+ # CSV.parse('Bob,2018-03-01,100', converters: [->(v) { Time.parse(v) rescue v }])
117
+ # #=> [["Bob", 2018-03-01 00:00:00 +0200, "100"]]
118
+ #
119
+ # ## CSV and Character Encodings (M17n or Multilingualization)
120
+ #
121
+ # This new CSV parser is m17n savvy. The parser works in the Encoding of the IO
122
+ # or String object being read from or written to. Your data is never transcoded
123
+ # (unless you ask Ruby to transcode it for you) and will literally be parsed in
124
+ # the Encoding it is in. Thus CSV will return Arrays or Rows of Strings in the
125
+ # Encoding of your data. This is accomplished by transcoding the parser itself
126
+ # into your Encoding.
127
+ #
128
+ # Some transcoding must take place, of course, to accomplish this multiencoding
129
+ # support. For example, `:col_sep`, `:row_sep`, and `:quote_char` must be
130
+ # transcoded to match your data. Hopefully this makes the entire process feel
131
+ # transparent, since CSV's defaults should just magically work for your data.
132
+ # However, you can set these values manually in the target Encoding to avoid the
133
+ # translation.
134
+ #
135
+ # It's also important to note that while all of CSV's core parser is now
136
+ # Encoding agnostic, some features are not. For example, the built-in converters
137
+ # will try to transcode data to UTF-8 before making conversions. Again, you can
138
+ # provide custom converters that are aware of your Encodings to avoid this
139
+ # translation. It's just too hard for me to support native conversions in all of
140
+ # Ruby's Encodings.
141
+ #
142
+ # Anyway, the practical side of this is simple: make sure IO and String objects
143
+ # passed into CSV have the proper Encoding set and everything should just work.
144
+ # CSV methods that allow you to open IO objects (CSV::foreach(), CSV::open(),
145
+ # CSV::read(), and CSV::readlines()) do allow you to specify the Encoding.
146
+ #
147
+ # One minor exception comes when generating CSV into a String with an Encoding
148
+ # that is not ASCII compatible. There's no existing data for CSV to use to
149
+ # prepare itself and thus you will probably need to manually specify the desired
150
+ # Encoding for most of those cases. It will try to guess using the fields in a
151
+ # row of output though, when using CSV::generate_line() or Array#to_csv().
152
+ #
153
+ # I try to point out any other Encoding issues in the documentation of methods
154
+ # as they come up.
155
+ #
156
+ # This has been tested to the best of my ability with all non-"dummy" Encodings
157
+ # Ruby ships with. However, it is brave new code and may have some bugs. Please
158
+ # feel free to [report](mailto:james@grayproductions.net) any issues you find
159
+ # with it.
160
+ #
161
+ class CSV < Object
162
+ include Enumerable
163
+
164
+ # This method is intended as the primary interface for reading CSV files. You
165
+ # pass a `path` and any `options` you wish to set for the read. Each row of file
166
+ # will be passed to the provided `block` in turn.
167
+ #
168
+ # The `options` parameter can be anything CSV::new() understands. This method
169
+ # also understands an additional `:encoding` parameter that you can use to
170
+ # specify the Encoding of the data in the file to be read. You must provide this
171
+ # unless your data is in Encoding::default_external(). CSV will use this to
172
+ # determine how to parse the data. You may provide a second Encoding to have the
173
+ # data transcoded as it is read. For example, `encoding: "UTF-32BE:UTF-8"` would
174
+ # read UTF-32BE data from the file but transcode it to UTF-8 before CSV parses
175
+ # it.
176
+ #
177
+ def self.foreach: [U] (String | IO | StringIO path, ?::Hash[Symbol, U] options) { (::Array[String?] arg0) -> void } -> void
178
+
179
+ # This constructor will wrap either a String or IO object passed in `data` for
180
+ # reading and/or writing. In addition to the CSV instance methods, several IO
181
+ # methods are delegated. (See CSV::open() for a complete list.) If you pass a
182
+ # String for `data`, you can later retrieve it (after writing to it, for
183
+ # example) with CSV.string().
184
+ #
185
+ # Note that a wrapped String will be positioned at the beginning (for reading).
186
+ # If you want it at the end (for writing), use CSV::generate(). If you want any
187
+ # other positioning, pass a preset StringIO object instead.
188
+ #
189
+ # You may set any reading and/or writing preferences in the `options` Hash.
190
+ # Available options are:
191
+ #
192
+ # **`:col_sep`**
193
+ # : The String placed between each field. This String will be transcoded into
194
+ # the data's Encoding before parsing.
195
+ # **`:row_sep`**
196
+ # : The String appended to the end of each row. This can be set to the special
197
+ # `:auto` setting, which requests that CSV automatically discover this from
198
+ # the data. Auto-discovery reads ahead in the data looking for the next
199
+ # `"\r\n"`, `"\n"`, or `"\r"` sequence. A sequence will be selected even if
200
+ # it occurs in a quoted field, assuming that you would have the same line
201
+ # endings there. If none of those sequences is found, `data` is `ARGF`,
202
+ # `STDIN`, `STDOUT`, or `STDERR`, or the stream is only available for
203
+ # output, the default `$INPUT_RECORD_SEPARATOR` (`$/`) is used. Obviously,
204
+ # discovery takes a little time. Set manually if speed is important. Also
205
+ # note that IO objects should be opened in binary mode on Windows if this
206
+ # feature will be used as the line-ending translation can cause problems
207
+ # with resetting the document position to where it was before the read
208
+ # ahead. This String will be transcoded into the data's Encoding before
209
+ # parsing.
210
+ # **`:quote_char`**
211
+ # : The character used to quote fields. This has to be a single character
212
+ # String. This is useful for application that incorrectly use `'` as the
213
+ # quote character instead of the correct `"`. CSV will always consider a
214
+ # double sequence of this character to be an escaped quote. This String will
215
+ # be transcoded into the data's Encoding before parsing.
216
+ # **`:field_size_limit`**
217
+ # : This is a maximum size CSV will read ahead looking for the closing quote
218
+ # for a field. (In truth, it reads to the first line ending beyond this
219
+ # size.) If a quote cannot be found within the limit CSV will raise a
220
+ # MalformedCSVError, assuming the data is faulty. You can use this limit to
221
+ # prevent what are effectively DoS attacks on the parser. However, this
222
+ # limit can cause a legitimate parse to fail and thus is set to `nil`, or
223
+ # off, by default.
224
+ # **`:converters`**
225
+ # : An Array of names from the Converters Hash and/or lambdas that handle
226
+ # custom conversion. A single converter doesn't have to be in an Array. All
227
+ # built-in converters try to transcode fields to UTF-8 before converting.
228
+ # The conversion will fail if the data cannot be transcoded, leaving the
229
+ # field unchanged.
230
+ # **`:unconverted_fields`**
231
+ # : If set to `true`, an unconverted_fields() method will be added to all
232
+ # returned rows (Array or CSV::Row) that will return the fields as they were
233
+ # before conversion. Note that `:headers` supplied by Array or String were
234
+ # not fields of the document and thus will have an empty Array attached.
235
+ # **`:headers`**
236
+ # : If set to `:first_row` or `true`, the initial row of the CSV file will be
237
+ # treated as a row of headers. If set to an Array, the contents will be used
238
+ # as the headers. If set to a String, the String is run through a call of
239
+ # CSV::parse_line() with the same `:col_sep`, `:row_sep`, and `:quote_char`
240
+ # as this instance to produce an Array of headers. This setting causes
241
+ # CSV#shift() to return rows as CSV::Row objects instead of Arrays and
242
+ # CSV#read() to return CSV::Table objects instead of an Array of Arrays.
243
+ # **`:return_headers`**
244
+ # : When `false`, header rows are silently swallowed. If set to `true`, header
245
+ # rows are returned in a CSV::Row object with identical headers and fields
246
+ # (save that the fields do not go through the converters).
247
+ # **`:write_headers`**
248
+ # : When `true` and `:headers` is set, a header row will be added to the
249
+ # output.
250
+ # **`:header_converters`**
251
+ # : Identical in functionality to `:converters` save that the conversions are
252
+ # only made to header rows. All built-in converters try to transcode headers
253
+ # to UTF-8 before converting. The conversion will fail if the data cannot be
254
+ # transcoded, leaving the header unchanged.
255
+ # **`:skip_blanks`**
256
+ # : When setting a `true` value, CSV will skip over any empty rows. Note that
257
+ # this setting will not skip rows that contain column separators, even if
258
+ # the rows contain no actual data. If you want to skip rows that contain
259
+ # separators but no content, consider using `:skip_lines`, or inspecting
260
+ # fields.compact.empty? on each row.
261
+ # **`:force_quotes`**
262
+ # : When setting a `true` value, CSV will quote all CSV fields it creates.
263
+ # **`:skip_lines`**
264
+ # : When setting an object responding to `match`, every line matching it is
265
+ # considered a comment and ignored during parsing. When set to a String, it
266
+ # is first converted to a Regexp. When set to `nil` no line is considered a
267
+ # comment. If the passed object does not respond to `match`, `ArgumentError`
268
+ # is thrown.
269
+ # **`:liberal_parsing`**
270
+ # : When setting a `true` value, CSV will attempt to parse input not
271
+ # conformant with RFC 4180, such as double quotes in unquoted fields.
272
+ # **`:nil_value`**
273
+ # : When set an object, any values of an empty field is replaced by the set
274
+ # object, not nil.
275
+ # **`:empty_value`**
276
+ # : When setting an object, any values of a blank string field is replaced by
277
+ # the set object.
278
+ # **`:quote_empty`**
279
+ # : When setting a `true` value, CSV will quote empty values with double
280
+ # quotes. When `false`, CSV will emit an empty string for an empty field
281
+ # value.
282
+ # **`:write_converters`**
283
+ # : Converts values on each line with the specified `Proc` object(s), which
284
+ # receive a `String` value and return a `String` or `nil` value. When an
285
+ # array is specified, each converter will be applied in order.
286
+ # **`:write_nil_value`**
287
+ # : When a `String` value, `nil` value(s) on each line will be replaced with
288
+ # the specified value.
289
+ # **`:write_empty_value`**
290
+ # : When a `String` or `nil` value, empty value(s) on each line will be
291
+ # replaced with the specified value.
292
+ # **`:strip`**
293
+ # : When setting a `true` value, CSV will strip "t\r\n\f\v" around the values.
294
+ # If you specify a string instead of `true`, CSV will strip string. The
295
+ # length of the string must be 1.
296
+ #
297
+ #
298
+ # See CSV::DEFAULT_OPTIONS for the default settings.
299
+ #
300
+ # Options cannot be overridden in the instance methods for performance reasons,
301
+ # so be sure to set what you want here.
302
+ def initialize: (?String | IO | StringIO io, ?::Hash[Symbol, untyped] options) -> void
303
+
304
+ # This method can be used to easily parse CSV out of a String. You may either
305
+ # provide a `block` which will be called with each row of the String in turn, or
306
+ # just use the returned Array of Arrays (when no `block` is given).
307
+ #
308
+ # You pass your `str` to read from, and an optional `options` containing
309
+ # anything CSV::new() understands.
310
+ #
311
+ def self.parse: (String str, ?::Hash[Symbol, untyped] options) ?{ (::Array[String?] arg0) -> void } -> ::Array[::Array[String?]]?
312
+
313
+ # This method is a shortcut for converting a single line of a CSV String into an
314
+ # Array. Note that if `line` contains multiple rows, anything beyond the first
315
+ # row is ignored.
316
+ #
317
+ # The `options` parameter can be anything CSV::new() understands.
318
+ #
319
+ def self.parse_line: (String str, ?::Hash[Symbol, untyped] options) -> ::Array[String?]?
320
+
321
+ # Slurps the remaining rows and returns an Array of Arrays.
322
+ #
323
+ # The data source must be open for reading.
324
+ #
325
+ def read: () -> ::Array[::Array[String?]]
326
+
327
+ def readline: () -> ::Array[String?]?
328
+
329
+ # Use to slurp a CSV file into an Array of Arrays. Pass the `path` to the file
330
+ # and any `options` CSV::new() understands. This method also understands an
331
+ # additional `:encoding` parameter that you can use to specify the Encoding of
332
+ # the data in the file to be read. You must provide this unless your data is in
333
+ # Encoding::default_external(). CSV will use this to determine how to parse the
334
+ # data. You may provide a second Encoding to have the data transcoded as it is
335
+ # read. For example, `encoding: "UTF-32BE:UTF-8"` would read UTF-32BE data from
336
+ # the file but transcode it to UTF-8 before CSV parses it.
337
+ #
338
+ def self.read: (String path, ?::Hash[Symbol, untyped] options) -> ::Array[::Array[String?]]
339
+
340
+ # The primary write method for wrapped Strings and IOs, `row` (an Array or
341
+ # CSV::Row) is converted to CSV and appended to the data source. When a CSV::Row
342
+ # is passed, only the row's fields() are appended to the output.
343
+ #
344
+ # The data source must be open for writing.
345
+ #
346
+ def <<: (::Array[untyped] | CSV::Row row) -> void
347
+
348
+ # This method wraps a String you provide, or an empty default String, in a CSV
349
+ # object which is passed to the provided block. You can use the block to append
350
+ # CSV rows to the String and when the block exits, the final String will be
351
+ # returned.
352
+ #
353
+ # Note that a passed String **is** modified by this method. Call dup() before
354
+ # passing if you need a new String.
355
+ #
356
+ # The `options` parameter can be anything CSV::new() understands. This method
357
+ # understands an additional `:encoding` parameter when not passed a String to
358
+ # set the base Encoding for the output. CSV needs this hint if you plan to
359
+ # output non-ASCII compatible data.
360
+ #
361
+ def self.generate: (?String str, **untyped options) { (CSV csv) -> void } -> String
362
+ end
363
+
364
+ # The options used when no overrides are given by calling code. They are:
365
+ #
366
+ # **`:col_sep`**
367
+ # : `","`
368
+ # **`:row_sep`**
369
+ # : `:auto`
370
+ # **`:quote_char`**
371
+ # : `'"'`
372
+ # **`:field_size_limit`**
373
+ # : `nil`
374
+ # **`:converters`**
375
+ # : `nil`
376
+ # **`:unconverted_fields`**
377
+ # : `nil`
378
+ # **`:headers`**
379
+ # : `false`
380
+ # **`:return_headers`**
381
+ # : `false`
382
+ # **`:header_converters`**
383
+ # : `nil`
384
+ # **`:skip_blanks`**
385
+ # : `false`
386
+ # **`:force_quotes`**
387
+ # : `false`
388
+ # **`:skip_lines`**
389
+ # : `nil`
390
+ # **`:liberal_parsing`**
391
+ # : `false`
392
+ # **`:quote_empty`**
393
+ # : `true`
394
+ #
395
+ #
396
+ CSV::DEFAULT_OPTIONS: ::Hash[untyped, untyped]
397
+
398
+ # The version of the installed library.
399
+ #
400
+ CSV::VERSION: String
401
+
402
+ # A CSV::Row is part Array and part Hash. It retains an order for the fields and
403
+ # allows duplicates just as an Array would, but also allows you to access fields
404
+ # by name just as you could if they were in a Hash.
405
+ #
406
+ # All rows returned by CSV will be constructed from this class, if header row
407
+ # processing is activated.
408
+ #
409
+ class CSV::Row < Object
410
+ include Enumerable
411
+
412
+ # If a two-element Array is provided, it is assumed to be a header and field and
413
+ # the pair is appended. A Hash works the same way with the key being the header
414
+ # and the value being the field. Anything else is assumed to be a lone field
415
+ # which is appended with a `nil` header.
416
+ #
417
+ # This method returns the row for chaining.
418
+ #
419
+ def <<: (untyped arg) -> untyped
420
+
421
+ # Returns `true` if this row contains the same headers and fields in the same
422
+ # order as `other`.
423
+ #
424
+ def ==: (untyped other) -> bool
425
+
426
+ alias [] field
427
+
428
+ # Looks up the field by the semantics described in CSV::Row.field() and assigns
429
+ # the `value`.
430
+ #
431
+ # Assigning past the end of the row with an index will set all pairs between to
432
+ # `[nil, nil]`. Assigning to an unused header appends the new pair.
433
+ #
434
+ def []=: (*untyped args) -> untyped
435
+
436
+ # Removes a pair from the row by `header` or `index`. The pair is located as
437
+ # described in CSV::Row.field(). The deleted pair is returned, or `nil` if a
438
+ # pair could not be found.
439
+ #
440
+ def delete: (untyped header_or_index, ?untyped minimum_index) -> untyped
441
+
442
+ # The provided `block` is passed a header and field for each pair in the row and
443
+ # expected to return `true` or `false`, depending on whether the pair should be
444
+ # deleted.
445
+ #
446
+ # This method returns the row for chaining.
447
+ #
448
+ # If no block is given, an Enumerator is returned.
449
+ #
450
+ def delete_if: () { (*untyped) -> untyped } -> untyped
451
+
452
+ # Extracts the nested value specified by the sequence of `index` or `header`
453
+ # objects by calling dig at each step, returning nil if any intermediate step is
454
+ # nil.
455
+ #
456
+ def dig: (untyped index_or_header, *untyped indexes) -> untyped
457
+
458
+ # Yields each pair of the row as header and field tuples (much like iterating
459
+ # over a Hash). This method returns the row for chaining.
460
+ #
461
+ # If no block is given, an Enumerator is returned.
462
+ #
463
+ # Support for Enumerable.
464
+ #
465
+ def each: () { (*untyped) -> untyped } -> untyped
466
+
467
+ alias each_pair each
468
+
469
+ def empty?: (*untyped args) { (*untyped) -> untyped } -> bool
470
+
471
+ # This method will fetch the field value by `header`. It has the same behavior
472
+ # as Hash#fetch: if there is a field with the given `header`, its value is
473
+ # returned. Otherwise, if a block is given, it is yielded the `header` and its
474
+ # result is returned; if a `default` is given as the second argument, it is
475
+ # returned; otherwise a KeyError is raised.
476
+ #
477
+ def fetch: (untyped header, *untyped varargs) ?{ (*untyped) -> untyped } -> untyped
478
+
479
+ # This method will return the field value by `header` or `index`. If a field is
480
+ # not found, `nil` is returned.
481
+ #
482
+ # When provided, `offset` ensures that a header match occurs on or later than
483
+ # the `offset` index. You can use this to find duplicate headers, without
484
+ # resorting to hard-coding exact indices.
485
+ #
486
+ def field: (untyped header_or_index, ?untyped minimum_index) -> untyped
487
+
488
+ # Returns `true` if `data` matches a field in this row, and `false` otherwise.
489
+ #
490
+ def field?: (untyped data) -> bool
491
+
492
+ # Returns `true` if this is a field row.
493
+ #
494
+ def field_row?: () -> bool
495
+
496
+ # This method accepts any number of arguments which can be headers, indices,
497
+ # Ranges of either, or two-element Arrays containing a header and offset. Each
498
+ # argument will be replaced with a field lookup as described in
499
+ # CSV::Row.field().
500
+ #
501
+ # If called with no arguments, all fields are returned.
502
+ #
503
+ def fields: (*untyped headers_and_or_indices) -> untyped
504
+
505
+ # Returns `true` if there is a field with the given `header`.
506
+ #
507
+ def has_key?: (untyped header) -> bool
508
+
509
+ alias header? has_key?
510
+
511
+ # Returns `true` if this is a header row.
512
+ #
513
+ def header_row?: () -> bool
514
+
515
+ # Returns the headers of this row.
516
+ #
517
+ def headers: () -> untyped
518
+
519
+ alias include? has_key?
520
+
521
+ # This method will return the index of a field with the provided `header`. The
522
+ # `offset` can be used to locate duplicate header names, as described in
523
+ # CSV::Row.field().
524
+ #
525
+ def index: (untyped header, ?untyped minimum_index) -> untyped
526
+
527
+ # A summary of fields, by header, in an ASCII compatible String.
528
+ #
529
+ def inspect: () -> String
530
+
531
+ alias key? has_key?
532
+
533
+ def length: (*untyped args) { (*untyped) -> untyped } -> untyped
534
+
535
+ alias member? has_key?
536
+
537
+ # A shortcut for appending multiple fields. Equivalent to:
538
+ #
539
+ # args.each { |arg| csv_row << arg }
540
+ #
541
+ # This method returns the row for chaining.
542
+ #
543
+ def push: (*untyped args) -> untyped
544
+
545
+ def size: (*untyped args) { (*untyped) -> untyped } -> untyped
546
+
547
+ alias to_ary to_a
548
+
549
+ # Returns the row as a CSV String. Headers are not used. Equivalent to:
550
+ #
551
+ # csv_row.fields.to_csv( options )
552
+ #
553
+ def to_csv: (**untyped) -> untyped
554
+
555
+ # Collapses the row into a simple Hash. Be warned that this discards field order
556
+ # and clobbers duplicate fields.
557
+ #
558
+ def to_h: () -> untyped
559
+
560
+ alias to_hash to_h
561
+
562
+ alias to_s to_csv
563
+
564
+ alias values_at fields
565
+ end
566
+
567
+ class CSV::FieldInfo < Struct
568
+ end
569
+
570
+ # The error thrown when the parser encounters illegal CSV formatting.
571
+ #
572
+ class CSV::MalformedCSVError < RuntimeError
573
+ end
574
+
575
+ # A CSV::Table is a two-dimensional data structure for representing CSV
576
+ # documents. Tables allow you to work with the data by row or column, manipulate
577
+ # the data, and even convert the results back to CSV, if needed.
578
+ #
579
+ # All tables returned by CSV will be constructed from this class, if header row
580
+ # processing is activated.
581
+ #
582
+ class CSV::Table[out Elem] < Object
583
+ include Enumerable
584
+
585
+ # Constructs a new CSV::Table from `array_of_rows`, which are expected to be
586
+ # CSV::Row objects. All rows are assumed to have the same headers.
587
+ #
588
+ # The optional `headers` parameter can be set to Array of headers. If headers
589
+ # aren't set, headers are fetched from CSV::Row objects. Otherwise, headers()
590
+ # method will return headers being set in headers argument.
591
+ #
592
+ # A CSV::Table object supports the following Array methods through delegation:
593
+ #
594
+ # * empty?()
595
+ # * length()
596
+ # * size()
597
+ #
598
+ def initialize: (untyped array_of_rows, ?headers: untyped) -> untyped
599
+
600
+ # Adds a new row to the bottom end of this table. You can provide an Array,
601
+ # which will be converted to a CSV::Row (inheriting the table's headers()), or a
602
+ # CSV::Row.
603
+ #
604
+ # This method returns the table for chaining.
605
+ #
606
+ def <<: (untyped row_or_array) -> untyped
607
+
608
+ # Returns `true` if all rows of this table ==() `other`'s rows.
609
+ #
610
+ def ==: (untyped other) -> bool
611
+
612
+ # In the default mixed mode, this method returns rows for index access and
613
+ # columns for header access. You can force the index association by first
614
+ # calling by_col!() or by_row!().
615
+ #
616
+ # Columns are returned as an Array of values. Altering that Array has no effect
617
+ # on the table.
618
+ #
619
+ def []: (untyped index_or_header) -> untyped
620
+
621
+ # In the default mixed mode, this method assigns rows for index access and
622
+ # columns for header access. You can force the index association by first
623
+ # calling by_col!() or by_row!().
624
+ #
625
+ # Rows may be set to an Array of values (which will inherit the table's
626
+ # headers()) or a CSV::Row.
627
+ #
628
+ # Columns may be set to a single value, which is copied to each row of the
629
+ # column, or an Array of values. Arrays of values are assigned to rows top to
630
+ # bottom in row major order. Excess values are ignored and if the Array does not
631
+ # have a value for each row the extra rows will receive a `nil`.
632
+ #
633
+ # Assigning to an existing column or row clobbers the data. Assigning to new
634
+ # columns creates them at the right end of the table.
635
+ #
636
+ def []=: (untyped index_or_header, untyped value) -> untyped
637
+
638
+ # Returns a duplicate table object, in column mode. This is handy for chaining
639
+ # in a single call without changing the table mode, but be aware that this
640
+ # method can consume a fair amount of memory for bigger data sets.
641
+ #
642
+ # This method returns the duplicate table for chaining. Don't chain destructive
643
+ # methods (like []=()) this way though, since you are working with a duplicate.
644
+ #
645
+ def by_col: () -> untyped
646
+
647
+ # Switches the mode of this table to column mode. All calls to indexing and
648
+ # iteration methods will work with columns until the mode is changed again.
649
+ #
650
+ # This method returns the table and is safe to chain.
651
+ #
652
+ def by_col!: () -> untyped
653
+
654
+ # Returns a duplicate table object, in mixed mode. This is handy for chaining in
655
+ # a single call without changing the table mode, but be aware that this method
656
+ # can consume a fair amount of memory for bigger data sets.
657
+ #
658
+ # This method returns the duplicate table for chaining. Don't chain destructive
659
+ # methods (like []=()) this way though, since you are working with a duplicate.
660
+ #
661
+ def by_col_or_row: () -> untyped
662
+
663
+ # Switches the mode of this table to mixed mode. All calls to indexing and
664
+ # iteration methods will use the default intelligent indexing system until the
665
+ # mode is changed again. In mixed mode an index is assumed to be a row reference
666
+ # while anything else is assumed to be column access by headers.
667
+ #
668
+ # This method returns the table and is safe to chain.
669
+ #
670
+ def by_col_or_row!: () -> untyped
671
+
672
+ # Returns a duplicate table object, in row mode. This is handy for chaining in
673
+ # a single call without changing the table mode, but be aware that this method
674
+ # can consume a fair amount of memory for bigger data sets.
675
+ #
676
+ # This method returns the duplicate table for chaining. Don't chain destructive
677
+ # methods (like []=()) this way though, since you are working with a duplicate.
678
+ #
679
+ def by_row: () -> untyped
680
+
681
+ # Switches the mode of this table to row mode. All calls to indexing and
682
+ # iteration methods will work with rows until the mode is changed again.
683
+ #
684
+ # This method returns the table and is safe to chain.
685
+ #
686
+ def by_row!: () -> untyped
687
+
688
+ # Removes and returns the indicated columns or rows. In the default mixed mode
689
+ # indices refer to rows and everything else is assumed to be a column headers.
690
+ # Use by_col!() or by_row!() to force the lookup.
691
+ #
692
+ def delete: (*untyped indexes_or_headers) -> untyped
693
+
694
+ # Removes any column or row for which the block returns `true`. In the default
695
+ # mixed mode or row mode, iteration is the standard row major walking of rows.
696
+ # In column mode, iteration will `yield` two element tuples containing the
697
+ # column name and an Array of values for that column.
698
+ #
699
+ # This method returns the table for chaining.
700
+ #
701
+ # If no block is given, an Enumerator is returned.
702
+ #
703
+ def delete_if: () { (*untyped) -> untyped } -> untyped
704
+
705
+ # Extracts the nested value specified by the sequence of `index` or `header`
706
+ # objects by calling dig at each step, returning nil if any intermediate step is
707
+ # nil.
708
+ #
709
+ def dig: (untyped index_or_header, *untyped index_or_headers) -> untyped
710
+
711
+ # In the default mixed mode or row mode, iteration is the standard row major
712
+ # walking of rows. In column mode, iteration will `yield` two element tuples
713
+ # containing the column name and an Array of values for that column.
714
+ #
715
+ # This method returns the table for chaining.
716
+ #
717
+ # If no block is given, an Enumerator is returned.
718
+ #
719
+ def each: () { (*untyped) -> untyped } -> untyped
720
+
721
+ def empty?: (*untyped args) { (*untyped) -> untyped } -> untyped
722
+
723
+ # Returns the headers for the first row of this table (assumed to match all
724
+ # other rows). The headers Array passed to CSV::Table.new is returned for empty
725
+ # tables.
726
+ #
727
+ def headers: () -> untyped
728
+
729
+ # Shows the mode and size of this table in a US-ASCII String.
730
+ #
731
+ def inspect: () -> String
732
+
733
+ def length: (*untyped args) { (*untyped) -> untyped } -> untyped
734
+
735
+ # The current access mode for indexing and iteration.
736
+ #
737
+ def mode: () -> untyped
738
+
739
+ # A shortcut for appending multiple rows. Equivalent to:
740
+ #
741
+ # rows.each { |row| self << row }
742
+ #
743
+ # This method returns the table for chaining.
744
+ #
745
+ def push: (*untyped rows) -> untyped
746
+
747
+ def size: (*untyped args) { (*untyped) -> untyped } -> untyped
748
+
749
+ # Returns the table as an Array of Arrays. Headers will be the first row, then
750
+ # all of the field rows will follow.
751
+ #
752
+ def to_a: () -> untyped
753
+
754
+ # Returns the table as a complete CSV String. Headers will be listed first, then
755
+ # all of the field rows.
756
+ #
757
+ # This method assumes you want the Table.headers(), unless you explicitly pass
758
+ # `:write_headers => false`.
759
+ #
760
+ def to_csv: (?write_headers: bool, **untyped) -> untyped
761
+
762
+ alias to_s to_csv
763
+
764
+ # The mixed mode default is to treat a list of indices as row access, returning
765
+ # the rows indicated. Anything else is considered columnar access. For columnar
766
+ # access, the return set has an Array for each row with the values indicated by
767
+ # the headers in each Array. You can force column or row mode using by_col!() or
768
+ # by_row!().
769
+ #
770
+ # You cannot mix column and row access.
771
+ #
772
+ def values_at: (*untyped indices_or_headers) -> untyped
773
+ end