= Change Log

Below is a complete listing of changes for each revision of FasterCSV.

== 1.5.0

* The main parser has been rewritten by Timothy Elliott to avoid big input
  issues with Ruby 1.8's regex engine.  This makes FasterCSV handle more inputs
  gracefully.
* FasterCSV will now exit with a notice to upgrade if required in Ruby 1.9.
* Included a missing file so the tests will run in source packages.

== 1.4.0

* Added encoding support patch from Michael Reinsch.
* Improved inspect() messages for better IRb support.
* Fixed header writing bug reported by Dov Murik.
* Use custom separators in parsing header Strings as suggested by Shmulik Regev.
* Added a <tt>:write_headers</tt> option for outputting headers.
* Handle open() calls in binary mode whenever we can to workaround a Windows
  issue where line-ending translation can cause an off-by-one error in seeking
  back to a non-zero starting position after auto-discovery for
  <tt>:row_sep</tt> as suggested by Robert Battle.
* Improved the parser to fail faster when fed some forms of invalid CSV that can
  be detected without reading ahead.
* Added a <tt>:field_size_limit</tt> option to control FasterCSV's lookahead and
  prevent the parser from biting off more data than it can chew.
  
== 1.2.3

* Default to the system line ending when passed a GzipWriter object to wrap.
  
== 1.2.2

* Worked around GzipReader's lack of a seek() method so we could still use
  automatic row separator detection with them.
  
== 1.2.1

* Worked around an odd incompatibility with the Regexps used to remove line
  endings in some (seemingly rare) Ruby environments.
* Made FasterCSV::lineno() writer aware.
* Support Hashes in FasterCSV#<<(), by detecting headers when writing.
* Added limited support for switching the quote character.
* Refining Data and DateTime matching for built-in convertors.

== 1.2.0

* Added the FasterCSV::table() shortcut.

== 1.1.1

* Added a <tt>:force_quotes</tt> output option.

== 1.1.0

* Added empty?(), length(), and size() methods to FasterCSV::Row and
  FasterCSV::Table.
* Cleaned up bug fix regression tests.
* Fixed bug causing Arrays to be returned for blank rows when header processing
  is active.
* Added a <tt>:skip_blanks</tt> option for ignoring empty rows.

== 1.0.0

* Fixed FasterCSV.rewind() to reset the FasterCSV.lineno() counter.
* Fixed FasterCSV.rewind() to reset the header processing.
* Fixed documentation typos.
* Switched STDOUT and STDERR usage to $stdout and $stderr where appropriate.
* Added FasterCSV::Row.==().
* Enhanced FasterCSV::Row.fields() to support Ranges, even for headers.
* The slurping methods now return the new FasterCSV::Table objects.
* Fixed parser so multibyte <tt>:col_sep</tt> works now.
* Added a few examples for usage.

== 0.2.1

* Removed autorequire from GemSpec.
* Made Rakefile VERSION aware.
* General Rakefile cleanup.

== 0.2.0

* Added VERSION constant.
* Significantly improved test speed.
* Worked around Date::parse() bug so tests will pass on Windows.
* Documented test procedure.
* Made FasterCSV.lineno() CSV aware.
* Added line numbers to MalformedCSVError messages.
* <tt>:headers</tt> can now be set to an Array of headers to use.
* <tt>:headers</tt> can now be set to an external CSV String of headers to use.
* Added an <tt>:unconverted_fields</tt> options, so those can be returned
  when needed.
* Provided support for the serialization of custom Ruby objects using CSV.
* Added CSV drop-in interface.
* Added header information to FieldInfo Struct for conversions by header.
* Added an alias to support <tt>require "fastercsv"</tt>.
* Added FCSV alias for FasterCSV.
* Added FasterCSV::instance() and FasterCSV()/FCSV() shortcuts for easy output.

== 0.1.9

* Fixing the require "English" bug.

== 0.1.8

* Converted FasterCSV.filter() to use ARGF for input.
* Made FasterCSV.<<() aware of FasterCSV::Row objects.
* Switched header rows to include the unconverted headers as fields.
* Rescued IOError when trying to auto detect a line-ending on an output stream
  and used the default system line-ending.
* Added FasterCSV::Row.header_row?() and FasterCSV::Row.field_row?().

== 0.1.6

* Began using a forked development/stable versioning system.
* Reorganized initialization code for easier additions and maintenance.
* Added a check for unknown options.  Exceptions will now be thrown for them.
* Added built-in and custom data converters.  Built-in handle numbers and dates.
* Added Array#to_csv and String#parse_csv.  Both accept normal options.
* Project moved to RubyForge Subversion.
* Added auto-discovery for <tt>:row_sep</tt> (now the default).
* Added FasterCSV::filter() for easy Unix-like CSV filters.
* Added support for accessing fields by headers.
  * Headers can have their own converters.
  * Headers can be skipped or returned as needed.
  * FasterCSV::Row allows index or header access while retaining order and
    allowing for duplicate headers.

== 0.1.4

* Fixed <tt>:col_sep</tt> escaping bug (reported by Kev Jackson).
* Switched to the use of named parsers internally.

== 0.1.3

* Fixed typo in gem spec causing a require bug.

== 0.1.2

* Built gem with Ruby 1.8.2, to bypass YAML/RubyGems issue.

== 0.1.1

* Built gem with Ruby 1.8.4 Preview 1, to _try_ and bypass YAML/RubyGems issue.
* Added missing test file to released packages.
* Clarified call-seq documentation for open() and parse().
* Clarified passed String positions for new(), in documentation.
* Expanded generate() to handle appending to an existing String.

== 0.1.0

* Initial public release.
