Changelog

View Source

0.4.2 (2026-05-15)

Bug Fixes

  • Fix read_options and write_options typespecs: the option was declared as :header (singular) but every code path reads :headers (plural). Callers passing headers: true | false were breaking the type contract, which Dialyzer propagated through the macro-generated stream/2 and read/2, poisoning analysis in consumer projects with cascades of no_return and unused_fun warnings. Renames :header to :headers in both types and docstrings.

0.4.1 (2026-04-28)

Bug Fixes

  • stream/2 was silently dropping the first data row in headerless files. The streaming path called NimbleCSV.parse_stream/1 without forwarding the :headers option, so NimbleCSV's default skip_headers: true ate the first line. Now headers: false (or unset) preserves every row, and headers: true skips the first row — matching read_string/2.

0.4.0 (2026-04-28)

Features

  • Add formats: option for :date and :datetime fields. Tries each format in order on read; the first to parse successfully wins. Useful for files that mix date formats (e.g. mostly M/D/YYYY with occasional YYYY-MM-DD). Mutually exclusive with format:. Writing uses the first entry in the list.
  • Add Module.canonical_string/2 (and Delimit.Schema.canonical_string/3): generate a stable, deterministic string encoding of a struct based on its schema. Uses ASCII Unit Separator as the default delimiter.
  • Add Module.row_hash/2 (and Delimit.Schema.row_hash/3): compute a cryptographic hash of a struct's canonical encoding. Defaults to SHA-256 truncated to 16 bytes.
  • Add :row_hash derived field type. Declared in the layout, populated automatically on read with the hash of the row's non-derived fields. Skipped on write. Supports algorithm: and truncate: options.
  • Add :raw_row derived field type. Captures the row as a list of strings before type coercion. Useful for debugging and audit trails. Skipped on write.

0.3.0 (2026-03-03)

Features

  • Add fixed-width format support (:fixed_width)

0.2.0 (2025-05-21)

Fixes

  • Do not double skip headers

Other

  • Simplified code to eliminate pre-processing
  • More appropriate empty row/value detection
  • Rely on layout for field mapping, not layout AND header content

0.1.0 (2025-05-12)

  • Initial release