 class CSV8b7c:f320:99b9:690f:4595:cd17:293a:c069Writer 

Parent:
Object
  Note: Don't use this class directly. This is an internal class.     Attributes    headers[R]     lineno[R]   A CSV8b7c:f320:99b9:690f:4595:cd17:293a:c069Writer receives an output, prepares the header, format and output. It allows us to write new rows in the object and rewind it.      Public Class Methods    new(output, options) Show source  
 # File lib/csv/writer.rb, line 18
def initialize(output, options)
  @output = output
  @options = options
  @lineno = 0
  @fields_converter = nil
  prepare
  if @options[:write_headers] and @headers
    self << @headers
  end
  @fields_converter = @options[:fields_converter]
end       Public Instance Methods    <<(row) Show source  
 # File lib/csv/writer.rb, line 33
def <<(row)
  case row
  when Row
    row = row.fields
  when Hash
    row = @headers.collect {|header| row[header]}
  end

  @headers ||= row if @use_headers
  @lineno += 1

  row = @fields_converter.convert(row, nil, lineno) if @fields_converter

  i = -1
  converted_row = row.collect do |field|
    i += 1
    quote(field, i)
  end
  line = converted_row.join(@column_separator) + @row_separator
  if @output_encoding
    line = line.encode(@output_encoding)
  end
  @output << line

  self
end  Adds a new row     rewind() Show source  
 # File lib/csv/writer.rb, line 63
def rewind
  @lineno = 0
  @headers = nil if @options[:headers].nil?
end  Winds back to the beginning      Private Instance Methods    prepare() Show source  
 # File lib/csv/writer.rb, line 69
def prepare
  @encoding = @options[:encoding]

  prepare_header
  prepare_format
  prepare_output
end      prepare_force_quotes_fields(force_quotes) Show source  
 # File lib/csv/writer.rb, line 105
def prepare_force_quotes_fields(force_quotes)
  @force_quotes_fields = {}
  force_quotes.each do |name_or_index|
    case name_or_index
    when Integer
      index = name_or_index
      @force_quotes_fields[index] = true
    when String, Symbol
      name = name_or_index.to_s
      if @headers.nil?
        message = ":headers is required when you use field name " +
                  "in :force_quotes: " +
                  "#{name_or_index.inspect}: #{force_quotes.inspect}"
        raise ArgumentError, message
      end
      index = @headers.index(name)
      next if index.nil?
      @force_quotes_fields[index] = true
    else
      message = ":force_quotes element must be " +
                "field index or field name: " +
                "#{name_or_index.inspect}: #{force_quotes.inspect}"
      raise ArgumentError, message
    end
  end
end      prepare_format() Show source  
 # File lib/csv/writer.rb, line 132
def prepare_format
  @column_separator = @options[:column_separator].to_s.encode(@encoding)
  row_separator = @options[:row_separator]
  if row_separator == :auto
    @row_separator = $INPUT_RECORD_SEPARATOR.encode(@encoding)
  else
    @row_separator = row_separator.to_s.encode(@encoding)
  end
  @quote_character = @options[:quote_character]
  force_quotes = @options[:force_quotes]
  if force_quotes.is_a?(Array)
    prepare_force_quotes_fields(force_quotes)
    @force_quotes = false
  elsif force_quotes
    @force_quotes_fields = nil
    @force_quotes = true
  else
    @force_quotes_fields = nil
    @force_quotes = false
  end
  unless @force_quotes
    @quotable_pattern =
      Regexp.new("[\r\n".encode(@encoding) +
                 Regexp.escape(@column_separator) +
                 Regexp.escape(@quote_character.encode(@encoding)) +
                 "]".encode(@encoding))
  end
  @quote_empty = @options.fetch(:quote_empty, true)
end      prepare_header() Show source  
 # File lib/csv/writer.rb, line 77
def prepare_header
  headers = @options[:headers]
  case headers
  when Array
    @headers = headers
    @use_headers = true
  when String
    @headers = CSV.parse_line(headers,
                              col_sep: @options[:column_separator],
                              row_sep: @options[:row_separator],
                              quote_char: @options[:quote_character])
    @use_headers = true
  when true
    @headers = nil
    @use_headers = true
  else
    @headers = nil
    @use_headers = false
  end
  return unless @headers

  converter = @options[:header_fields_converter]
  @headers = converter.convert(@headers, nil, 0)
  @headers.each do |header|
    header.freeze if header.is_a?(String)
  end
end      prepare_output() Show source  
 # File lib/csv/writer.rb, line 162
def prepare_output
  @output_encoding = nil
  return unless @output.is_a?(StringIO)

  output_encoding = @output.internal_encoding || @output.external_encoding
  if @encoding != output_encoding
    if @options[:force_encoding]
      @output_encoding = output_encoding
    else
      compatible_encoding = Encoding.compatible?(@encoding, output_encoding)
      if compatible_encoding
        @output.set_encoding(compatible_encoding)
        @output.seek(0, IO8b7c:f320:99b9:690f:4595:cd17:293a:c069SEEK_END)
      end
    end
  end
end      quote(field, i) Show source  
 # File lib/csv/writer.rb, line 189
def quote(field, i)
  if @force_quotes
    quote_field(field)
  elsif @force_quotes_fields and @force_quotes_fields[i]
    quote_field(field)
  else
    if field.nil?  # represent +nil+ fields as empty unquoted fields
      ""
    else
      field = String(field)  # Stringify fields
      # represent empty fields as empty quoted fields
      if (@quote_empty and field.empty?) or (field.valid_encoding? and @quotable_pattern.match?(field))
        quote_field(field)
      else
        field  # unquoted field
      end
    end
  end
end      quote_field(field) Show source  
 # File lib/csv/writer.rb, line 180
def quote_field(field)
  field = String(field)
  encoded_quote_character = @quote_character.encode(field.encoding)
  encoded_quote_character +
    field.gsub(encoded_quote_character,
               encoded_quote_character * 2) +
    encoded_quote_character
end     

    Ruby Core © 1993–2020 Yukihiro MatsumotoLicensed under the Ruby License.Ruby Standard Library 
{'path': 'public/docs/ruby~3/csv/writer.html', 'source': 'DevDocs.IO'}