steep 0.15.0 → 0.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (164) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +0 -3
  3. data/CHANGELOG.md +25 -0
  4. data/Rakefile +0 -13
  5. data/bin/setup +0 -2
  6. data/bin/smoke_runner.rb +0 -1
  7. data/exe/steep +0 -1
  8. data/lib/steep.rb +12 -1
  9. data/lib/steep/cli.rb +16 -1
  10. data/lib/steep/drivers/annotations.rb +1 -1
  11. data/lib/steep/drivers/check.rb +1 -12
  12. data/lib/steep/drivers/langserver.rb +13 -462
  13. data/lib/steep/drivers/utils/driver_helper.rb +1 -1
  14. data/lib/steep/drivers/watch.rb +97 -85
  15. data/lib/steep/drivers/worker.rb +51 -0
  16. data/lib/steep/project.rb +9 -5
  17. data/lib/steep/project/completion_provider.rb +4 -2
  18. data/lib/steep/project/file.rb +2 -1
  19. data/lib/steep/project/hover_content.rb +6 -3
  20. data/lib/steep/project/options.rb +15 -0
  21. data/lib/steep/project/target.rb +30 -20
  22. data/lib/steep/server/base_worker.rb +56 -0
  23. data/lib/steep/server/code_worker.rb +151 -0
  24. data/lib/steep/server/interaction_worker.rb +281 -0
  25. data/lib/steep/server/master.rb +196 -0
  26. data/lib/steep/server/signature_worker.rb +148 -0
  27. data/lib/steep/server/utils.rb +36 -0
  28. data/lib/steep/server/worker_process.rb +62 -0
  29. data/lib/steep/signature/validator.rb +5 -5
  30. data/lib/steep/type_construction.rb +13 -19
  31. data/lib/steep/type_inference/constant_env.rb +2 -10
  32. data/lib/steep/type_inference/context.rb +1 -0
  33. data/lib/steep/version.rb +1 -1
  34. data/steep.gemspec +7 -8
  35. metadata +22 -142
  36. data/exe/rbs +0 -3
  37. data/vendor/ruby-signature/.github/workflows/ruby.yml +0 -27
  38. data/vendor/ruby-signature/.gitignore +0 -12
  39. data/vendor/ruby-signature/.rubocop.yml +0 -15
  40. data/vendor/ruby-signature/BSDL +0 -22
  41. data/vendor/ruby-signature/COPYING +0 -56
  42. data/vendor/ruby-signature/Gemfile +0 -6
  43. data/vendor/ruby-signature/README.md +0 -93
  44. data/vendor/ruby-signature/Rakefile +0 -67
  45. data/vendor/ruby-signature/bin/annotate-with-rdoc +0 -157
  46. data/vendor/ruby-signature/bin/console +0 -14
  47. data/vendor/ruby-signature/bin/query-rdoc +0 -103
  48. data/vendor/ruby-signature/bin/setup +0 -10
  49. data/vendor/ruby-signature/bin/sort +0 -89
  50. data/vendor/ruby-signature/bin/test_runner.rb +0 -16
  51. data/vendor/ruby-signature/docs/CONTRIBUTING.md +0 -97
  52. data/vendor/ruby-signature/docs/sigs.md +0 -148
  53. data/vendor/ruby-signature/docs/stdlib.md +0 -152
  54. data/vendor/ruby-signature/docs/syntax.md +0 -528
  55. data/vendor/ruby-signature/exe/rbs +0 -7
  56. data/vendor/ruby-signature/lib/rbs.rb +0 -64
  57. data/vendor/ruby-signature/lib/rbs/ast/annotation.rb +0 -27
  58. data/vendor/ruby-signature/lib/rbs/ast/comment.rb +0 -27
  59. data/vendor/ruby-signature/lib/rbs/ast/declarations.rb +0 -395
  60. data/vendor/ruby-signature/lib/rbs/ast/members.rb +0 -362
  61. data/vendor/ruby-signature/lib/rbs/buffer.rb +0 -50
  62. data/vendor/ruby-signature/lib/rbs/builtin_names.rb +0 -55
  63. data/vendor/ruby-signature/lib/rbs/cli.rb +0 -558
  64. data/vendor/ruby-signature/lib/rbs/constant.rb +0 -26
  65. data/vendor/ruby-signature/lib/rbs/constant_table.rb +0 -150
  66. data/vendor/ruby-signature/lib/rbs/definition.rb +0 -170
  67. data/vendor/ruby-signature/lib/rbs/definition_builder.rb +0 -919
  68. data/vendor/ruby-signature/lib/rbs/environment.rb +0 -281
  69. data/vendor/ruby-signature/lib/rbs/environment_loader.rb +0 -136
  70. data/vendor/ruby-signature/lib/rbs/environment_walker.rb +0 -124
  71. data/vendor/ruby-signature/lib/rbs/errors.rb +0 -187
  72. data/vendor/ruby-signature/lib/rbs/location.rb +0 -102
  73. data/vendor/ruby-signature/lib/rbs/method_type.rb +0 -123
  74. data/vendor/ruby-signature/lib/rbs/namespace.rb +0 -91
  75. data/vendor/ruby-signature/lib/rbs/parser.y +0 -1344
  76. data/vendor/ruby-signature/lib/rbs/prototype/rb.rb +0 -553
  77. data/vendor/ruby-signature/lib/rbs/prototype/rbi.rb +0 -587
  78. data/vendor/ruby-signature/lib/rbs/prototype/runtime.rb +0 -381
  79. data/vendor/ruby-signature/lib/rbs/substitution.rb +0 -46
  80. data/vendor/ruby-signature/lib/rbs/test.rb +0 -26
  81. data/vendor/ruby-signature/lib/rbs/test/errors.rb +0 -61
  82. data/vendor/ruby-signature/lib/rbs/test/hook.rb +0 -294
  83. data/vendor/ruby-signature/lib/rbs/test/setup.rb +0 -58
  84. data/vendor/ruby-signature/lib/rbs/test/spy.rb +0 -325
  85. data/vendor/ruby-signature/lib/rbs/test/test_helper.rb +0 -183
  86. data/vendor/ruby-signature/lib/rbs/test/type_check.rb +0 -254
  87. data/vendor/ruby-signature/lib/rbs/type_name.rb +0 -70
  88. data/vendor/ruby-signature/lib/rbs/types.rb +0 -936
  89. data/vendor/ruby-signature/lib/rbs/variance_calculator.rb +0 -138
  90. data/vendor/ruby-signature/lib/rbs/vendorer.rb +0 -47
  91. data/vendor/ruby-signature/lib/rbs/version.rb +0 -3
  92. data/vendor/ruby-signature/lib/rbs/writer.rb +0 -269
  93. data/vendor/ruby-signature/lib/ruby/signature.rb +0 -7
  94. data/vendor/ruby-signature/rbs.gemspec +0 -45
  95. data/vendor/ruby-signature/stdlib/abbrev/abbrev.rbs +0 -60
  96. data/vendor/ruby-signature/stdlib/base64/base64.rbs +0 -71
  97. data/vendor/ruby-signature/stdlib/benchmark/benchmark.rbs +0 -372
  98. data/vendor/ruby-signature/stdlib/builtin/array.rbs +0 -1997
  99. data/vendor/ruby-signature/stdlib/builtin/basic_object.rbs +0 -280
  100. data/vendor/ruby-signature/stdlib/builtin/binding.rbs +0 -177
  101. data/vendor/ruby-signature/stdlib/builtin/builtin.rbs +0 -44
  102. data/vendor/ruby-signature/stdlib/builtin/class.rbs +0 -145
  103. data/vendor/ruby-signature/stdlib/builtin/comparable.rbs +0 -116
  104. data/vendor/ruby-signature/stdlib/builtin/complex.rbs +0 -400
  105. data/vendor/ruby-signature/stdlib/builtin/constants.rbs +0 -37
  106. data/vendor/ruby-signature/stdlib/builtin/data.rbs +0 -5
  107. data/vendor/ruby-signature/stdlib/builtin/deprecated.rbs +0 -2
  108. data/vendor/ruby-signature/stdlib/builtin/dir.rbs +0 -413
  109. data/vendor/ruby-signature/stdlib/builtin/encoding.rbs +0 -607
  110. data/vendor/ruby-signature/stdlib/builtin/enumerable.rbs +0 -404
  111. data/vendor/ruby-signature/stdlib/builtin/enumerator.rbs +0 -260
  112. data/vendor/ruby-signature/stdlib/builtin/errno.rbs +0 -781
  113. data/vendor/ruby-signature/stdlib/builtin/errors.rbs +0 -582
  114. data/vendor/ruby-signature/stdlib/builtin/exception.rbs +0 -194
  115. data/vendor/ruby-signature/stdlib/builtin/false_class.rbs +0 -40
  116. data/vendor/ruby-signature/stdlib/builtin/fiber.rbs +0 -68
  117. data/vendor/ruby-signature/stdlib/builtin/fiber_error.rbs +0 -12
  118. data/vendor/ruby-signature/stdlib/builtin/file.rbs +0 -1076
  119. data/vendor/ruby-signature/stdlib/builtin/file_test.rbs +0 -59
  120. data/vendor/ruby-signature/stdlib/builtin/float.rbs +0 -696
  121. data/vendor/ruby-signature/stdlib/builtin/gc.rbs +0 -243
  122. data/vendor/ruby-signature/stdlib/builtin/hash.rbs +0 -1029
  123. data/vendor/ruby-signature/stdlib/builtin/integer.rbs +0 -707
  124. data/vendor/ruby-signature/stdlib/builtin/io.rbs +0 -683
  125. data/vendor/ruby-signature/stdlib/builtin/kernel.rbs +0 -576
  126. data/vendor/ruby-signature/stdlib/builtin/marshal.rbs +0 -161
  127. data/vendor/ruby-signature/stdlib/builtin/match_data.rbs +0 -271
  128. data/vendor/ruby-signature/stdlib/builtin/math.rbs +0 -369
  129. data/vendor/ruby-signature/stdlib/builtin/method.rbs +0 -185
  130. data/vendor/ruby-signature/stdlib/builtin/module.rbs +0 -1104
  131. data/vendor/ruby-signature/stdlib/builtin/nil_class.rbs +0 -82
  132. data/vendor/ruby-signature/stdlib/builtin/numeric.rbs +0 -409
  133. data/vendor/ruby-signature/stdlib/builtin/object.rbs +0 -824
  134. data/vendor/ruby-signature/stdlib/builtin/proc.rbs +0 -429
  135. data/vendor/ruby-signature/stdlib/builtin/process.rbs +0 -1227
  136. data/vendor/ruby-signature/stdlib/builtin/random.rbs +0 -267
  137. data/vendor/ruby-signature/stdlib/builtin/range.rbs +0 -226
  138. data/vendor/ruby-signature/stdlib/builtin/rational.rbs +0 -424
  139. data/vendor/ruby-signature/stdlib/builtin/rb_config.rbs +0 -57
  140. data/vendor/ruby-signature/stdlib/builtin/regexp.rbs +0 -1083
  141. data/vendor/ruby-signature/stdlib/builtin/ruby_vm.rbs +0 -14
  142. data/vendor/ruby-signature/stdlib/builtin/signal.rbs +0 -55
  143. data/vendor/ruby-signature/stdlib/builtin/string.rbs +0 -1901
  144. data/vendor/ruby-signature/stdlib/builtin/string_io.rbs +0 -284
  145. data/vendor/ruby-signature/stdlib/builtin/struct.rbs +0 -40
  146. data/vendor/ruby-signature/stdlib/builtin/symbol.rbs +0 -228
  147. data/vendor/ruby-signature/stdlib/builtin/thread.rbs +0 -1108
  148. data/vendor/ruby-signature/stdlib/builtin/thread_group.rbs +0 -23
  149. data/vendor/ruby-signature/stdlib/builtin/time.rbs +0 -1047
  150. data/vendor/ruby-signature/stdlib/builtin/trace_point.rbs +0 -290
  151. data/vendor/ruby-signature/stdlib/builtin/true_class.rbs +0 -46
  152. data/vendor/ruby-signature/stdlib/builtin/unbound_method.rbs +0 -153
  153. data/vendor/ruby-signature/stdlib/builtin/warning.rbs +0 -17
  154. data/vendor/ruby-signature/stdlib/coverage/coverage.rbs +0 -62
  155. data/vendor/ruby-signature/stdlib/csv/csv.rbs +0 -773
  156. data/vendor/ruby-signature/stdlib/erb/erb.rbs +0 -392
  157. data/vendor/ruby-signature/stdlib/find/find.rbs +0 -40
  158. data/vendor/ruby-signature/stdlib/ipaddr/ipaddr.rbs +0 -247
  159. data/vendor/ruby-signature/stdlib/pathname/pathname.rbs +0 -1093
  160. data/vendor/ruby-signature/stdlib/prime/integer-extension.rbs +0 -23
  161. data/vendor/ruby-signature/stdlib/prime/prime.rbs +0 -188
  162. data/vendor/ruby-signature/stdlib/securerandom/securerandom.rbs +0 -9
  163. data/vendor/ruby-signature/stdlib/set/set.rbs +0 -301
  164. data/vendor/ruby-signature/stdlib/tmpdir/tmpdir.rbs +0 -53
@@ -1,17 +0,0 @@
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
@@ -1,62 +0,0 @@
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
@@ -1,773 +0,0 @@
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