Skip to content

Releases: OpenHistoricalMap/edtf-java

v0.3.1 — dependency bumps + 5 locale bundles

25 Apr 19:33

Choose a tag to compare

Changelog

All notable changes to this project are documented here. The format is
loosely based on Keep a Changelog and
this project follows Semantic Versioning.

0.3.1 — unreleased

Dependency-and-tooling release. The five seeded locale bundles
(German, French, Spanish, Italian, Japanese) are the only
user-visible behaviour change. The publishing-plugin upgrade is
the headline reason this release exists separately rather than
being rolled into the next feature release: it isolates the
plugin upgrade so any release-time regression has a single
suspect.

Added

  • Five locale bundles under
    src/main/resources/io/github/openhistoricalmap/edtf/format/:
    messages_de, messages_es, messages_fr, messages_it,
    messages_ja. Bootstrap translations seeded for the next
    Transifex sync; future updates flow through tx pull /
    tx push rather than direct file edits.
  • README's Ant + Ivy section reframed as the canonical reference
    for any downstream Ant consumer (not JOSM-specific), with a
    pointer at smoke/ as a complete worked example.

Changed

  • actions/checkout 4 → 6 and actions/setup-java 4
    → 5
    in all three GitHub Actions workflows; both now
    natively use Node.js 24 so the redundant
    FORCE_JAVASCRIPT_ACTIONS_TO_NODE24 env var was removed.
  • junit-bom 5.11.4 → 6.0.3. All 367 tests still pass
    unchanged (verified locally before the merge).
  • central-publishing-maven-plugin 0.7.0 → 0.10.0. The
    primary motivation for cutting this release as a standalone
    patch — it isolates the publish-time plugin upgrade from
    any future feature work.
  • maven-source-plugin 3.3.1 → 3.4.0,
    maven-surefire-plugin 3.5.3 → 3.5.5,
    maven-gpg-plugin 3.2.7 → 3.2.8.
  • README dependency snippets updated from 0.2.0 to 0.3.0.

Fixed

  • Smoke test at smoke/src/Smoke.java was calling
    i.upper() on an EdtfTemporal-typed variable, which doesn't
    compile against the published artefact (upper() is on the
    permitted subtype EdtfInterval, not on the sealed interface).
    Replaced with i.type() so the smoke source stays on the
    stable-since-0.2.0 API surface and works against any future
    release without modification.

0.3.0 — 2026-04-23

Closes the three v0.2.0 follow-up issues. Adds locale-aware
formatting, a real Ant/Ivy consumption smoke test, and three
hand-curated test-vector TSVs.

Added

  • EdtfFormatter in the new
    io.github.openhistoricalmap.edtf.format package — a
    locale-aware human-readable formatter for every supported
    EdtfTemporal subtype. Default English bundle ships at
    messages.properties; translations are managed via Transifex.
    Examples:
    • EdtfFormatter.forLocale(Locale.US).format(Edtf.parse("2020-05"))
      "May 2020"
    • format(Edtf.parse("199"))"the 1990s"
    • format(Edtf.parse("2020/2021"))"2020 to 2021"
    • format(Edtf.parse("2020-21"))"Q1 2020"
  • Three new test-vector TSVs under src/test/resources/vectors/:
    • loc-spec.tsv — curated from the Library of Congress
      EDTF specification page (Levels 0-2).
    • iso8601-2.tsv — curated from the ISO 8601-2:2019
      standard's example callouts, restricted to the EDTF/LoC
      implicit-form profile.
    • edge-cases.tsv — hand-curated worst-case inputs with
      a 7th valid column, including INVALID rows that assert
      EdtfParseException.
  • Ant/Ivy consumption smoke test at smoke/ — a
    self-contained Ant + Ivy project that resolves the published
    artefact from Maven Central, compiles a small program that
    calls Edtf.parse and EdtfFormatter, and asserts on its
    output. Daily smoke.yml GitHub Actions workflow runs it
    against the latest release.
  • Module export: io.github.openhistoricalmap.edtf.format is
    now exported from the JPMS module descriptor.
  • 358 unit tests (up from 247 in 0.2.0).

Documented divergences

No new divergences from edtf.js. The four documented in 0.2.0 still
apply.

0.2.0 — 2026-04-23

First public release on Maven Central. Covers EDTF Levels 0, 1, and most
of Level 2.

Added

  • Level 0 parsing: ISO 8601-1 dates, datetimes (minute, second, and
    millisecond precision), centuries.
  • Level 1 parsing: uncertain (?), approximate (~), and combined
    (%) markers; Y-notation for five-or-more-digit years; seasons
    (codes 21–24); intervals with bounded, open (..), and unknown
    endpoints; EdtfYear, EdtfSeason, Endpoint sealed type, and
    EdtfInterval types.
  • Level 2 parsing: non-progressive partial X-mask patterns in any
    YYYY/MM/DD position; sets ([2020,2021]) and lists
    ({2019..2021}) including consecutive start..end members and
    earlier/later markers; extended season codes 25–41
    (hemispheric variants, quadrimesters, half-year divisions);
    three-digit decade notation (199, 199?); Y-notation
    exponential (Y1E5) and significant-digits (Y12345S3) forms;
    positional UA markers on individual date components
    (2020?-05~, ?2020-%05).
  • Comparison and bounds: EdtfTemporal#compareTo,
    EdtfTemporal#covers, and long-millisecond min / max for every
    supported type.
  • Canonical serialization: every type implements toEdtfString()
    in a form that round-trips with edtf.js for the supported subset.
  • Build and CI: Maven build targeting Java 17 bytecode, JPMS
    module descriptor, GitHub Actions CI matrix (Java 17 + 21), release
    workflow that signs with GPG and publishes via Sonatype Central
    Portal, Dependabot, issue and PR templates, Contributor Covenant
    code of conduct, AI-assisted-development disclosure in
    ATTRIBUTION.md.
  • Test coverage: 247 unit tests including a generated
    parity-vector harness comparing against edtf.js v4.11.0 output.

Known deviations from edtf.js

Documented in code on the affected types. Summary:

  • Datetime canonical form is normalised to UTC and full
    millisecond precision (matching edtf.js's toISOString output);
    the original timezone offset is preserved on the in-memory value
    via EdtfDate#timeZone() but not emitted by toEdtfString().
  • Datetime atomicity: minute, second, and millisecond precision
    values report min == max (atomic instants), matching edtf.js.
  • Season codes 21–24 use calendar-quarter bounds
    (Q1=Jan–Mar, etc.) rather than meteorological seasons,
    matching the upstream reference.
  • Consecutive list members report bounds spanning
    start.min..end.max (semantically the full range). edtf.js
    reports start.max for the upper bound, which we consider an
    upstream bug and diverge from.

Deferred to a future release

  • Locale-aware formatting via ResourceBundle (canonical EDTF
    rendering only at this release).
  • Ant/Ivy consumption smoke test against a real JOSM plugin
    scaffold.

v0.3.0 — EdtfFormatter, smoke test, spec vectors

25 Apr 15:14

Choose a tag to compare

Closes the three v0.2.0 follow-up issues. See
CHANGELOG.md for the full record.

Highlights

  • Locale-aware formatting: new EdtfFormatter.
  • Three spec / edge-case test-vector TSVs.
  • Ant + Ivy smoke test at smoke/.

Maven Central: https://central.sonatype.com/artifact/io.github.openhistoricalmap/edtf/0.3.0

v0.2.0 — L0 + L1 + L2 EDTF parsing

25 Apr 14:53

Choose a tag to compare

First public release on Maven Central. Covers EDTF Levels 0, 1, and
most of Level 2.

Maven Central: https://central.sonatype.com/artifact/io.github.openhistoricalmap/edtf/0.2.0
Javadoc: https://javadoc.io/doc/io.github.openhistoricalmap/edtf/0.2.0

See CHANGELOG.md
for the full record, including the four documented divergences from
edtf.js.

What's included

  • Level 0: ISO 8601-1 dates, datetimes, centuries.
  • Level 1: uncertain / approximate / mixed markers, Y-notation,
    seasons (codes 21-24), open / unknown intervals.
  • Level 2: non-progressive partial X-masks, sets and lists with
    consecutive start..end members, extended seasons (25-41),
    three-digit decade notation, Y exponential and significant-digits
    forms, positional UA markers on individual date components.
  • 247 unit tests, including a generated parity-vector harness
    against edtf.js v4.11.0.
  • Java 17 bytecode target, zero runtime dependencies, JPMS module
    descriptor.

Documented divergences from edtf.js

  1. Datetime canonical form normalised to UTC.
  2. Datetime atomicity: minute/second/millisecond precision report min == max.
  3. Season codes 21-24 use calendar-quarter bounds.
  4. Consecutive list members report start.min..end.max.