Releases: OpenHistoricalMap/edtf-java
v0.3.1 — dependency bumps + 5 locale bundles
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 throughtx pull/
tx pushrather 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 atsmoke/as a complete worked example.
Changed
actions/checkout4 → 6 andactions/setup-java4
→ 5 in all three GitHub Actions workflows; both now
natively use Node.js 24 so the redundant
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24env var was removed.junit-bom5.11.4 → 6.0.3. All 367 tests still pass
unchanged (verified locally before the merge).central-publishing-maven-plugin0.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-plugin3.3.1 → 3.4.0,
maven-surefire-plugin3.5.3 → 3.5.5,
maven-gpg-plugin3.2.7 → 3.2.8.- README dependency snippets updated from
0.2.0to0.3.0.
Fixed
- Smoke test at
smoke/src/Smoke.javawas calling
i.upper()on anEdtfTemporal-typed variable, which doesn't
compile against the published artefact (upper()is on the
permitted subtypeEdtfInterval, not on the sealed interface).
Replaced withi.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
EdtfFormatterin the new
io.github.openhistoricalmap.edtf.formatpackage — a
locale-aware human-readable formatter for every supported
EdtfTemporalsubtype. 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 7thvalidcolumn, 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
callsEdtf.parseandEdtfFormatter, and asserts on its
output. Dailysmoke.ymlGitHub Actions workflow runs it
against the latest release. - Module export:
io.github.openhistoricalmap.edtf.formatis
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,Endpointsealed type, and
EdtfIntervaltypes. - Level 2 parsing: non-progressive partial X-mask patterns in any
YYYY/MM/DD position; sets ([2020,2021]) and lists
({2019..2021}) including consecutivestart..endmembers and
earlier/latermarkers; 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, andlong-millisecondmin/maxfor 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 againstedtf.jsv4.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'stoISOStringoutput);
the original timezone offset is preserved on the in-memory value
viaEdtfDate#timeZone()but not emitted bytoEdtfString(). - Datetime atomicity: minute, second, and millisecond precision
values reportmin == 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
reportsstart.maxfor 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
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
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
consecutivestart..endmembers, 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
againstedtf.jsv4.11.0. - Java 17 bytecode target, zero runtime dependencies, JPMS module
descriptor.
Documented divergences from edtf.js
- Datetime canonical form normalised to UTC.
- Datetime atomicity: minute/second/millisecond precision report
min == max. - Season codes 21-24 use calendar-quarter bounds.
- Consecutive list members report
start.min..end.max.