64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
# File 'lib/smarter_csv/writer.rb', line 64
def initialize(file_path_or_io, given_options = {})
opts = Options::DEFAULT_OPTIONS.merge(given_options)
@options = opts
@row_sep = opts[:row_sep]
@col_sep = opts[:col_sep]
@quote_char = opts[:quote_char]
@escaped_quote_char = @quote_char * 2
@force_quotes = opts[:force_quotes] == true
@quote_headers = opts[:quote_headers] == true
@disable_auto_quoting = opts[:disable_auto_quoting] == true
@value_converters = opts[:value_converters] || {}
@encoding = opts[:encoding]
@write_nil_value = opts[:write_nil_value]
@write_empty_value = opts[:write_empty_value]
@write_bom = opts[:write_bom] == true
@write_headers = opts[:write_headers] == true
@map_all_keys = @value_converters.has_key?(:_all)
@mapped_keys = Set.new(@value_converters.keys - [:_all])
@header_converter = opts[:header_converter]
if given_options.has_key?(:discover_headers)
@discover_headers = given_options[:discover_headers] == true
else
@discover_headers = !(given_options.has_key?(:map_headers) || given_options.has_key?(:headers))
end
@headers = opts[:headers].dup
@headers = given_options[:map_headers].keys if given_options.has_key?(:map_headers) && !given_options.has_key?(:headers)
@map_headers = opts[:map_headers]
if file_path_or_io.respond_to?(:write)
@output_file = file_path_or_io
@file_opened_by_us = false
else
path =
if file_path_or_io.respond_to?(:to_path)
file_path_or_io.to_path
elsif file_path_or_io.is_a?(String)
file_path_or_io
else
raise ArgumentError,
"SmarterCSV::Writer expects an IO-like object (responding to #write) " \
"or a path-like object (responding to #to_path or being a String), " \
"but got #{file_path_or_io.class}"
end
mode = @encoding ? "w+:#{@encoding}" : 'w+'
@output_file = File.open(path, mode)
@file_opened_by_us = true
end
@quote_regex = Regexp.union(@col_sep, @row_sep, @quote_char)
if !@discover_headers && !@headers.empty?
@temp_file = nil
@output_file.write("\xEF\xBB\xBF") if @write_bom
if @write_headers
else
@temp_file = Tempfile.new('smarter_csv')
end
end
|