Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,14 @@

What changed for someone using zig-hocon: the Zig package, the `hocon` command line tool, libhocon for C and the `zig-hocon` Python package, which are released together under one version. The technical detail is in the commits each release links to.

## [Unreleased]

The conformance suite has no open question left: the spec settles the last one, `url()` without a scheme, as an error ([lightbend/config#887](https://github.com/lightbend/config/pull/887)), and zig-hocon passes all 446 tests.

### Added

- A conformance case for a value that begins with a digit but is no number, `a = 1.2.3`: an error by the spec. `python/MIGRATING.md` says what it means for a pyhocon user: an IP address needs quotes.

## [0.5.1] - 2026-10-19

The conformance suite settles two of its three open questions: 444 of the 445 tests pass, up from 442. The last one, `url()` without a scheme, waits for the spec ([lightbend/config#887](https://github.com/lightbend/config/pull/887)).
Expand Down
21 changes: 10 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,14 @@ The rest of this page reads these two files.

## Why zig-hocon

- **Correct.** Passes 445 of the 446 tests in the [conformance suite](https://htmlpreview.github.io/?https://github.com/lejmr/zig-hocon/blob/main/conformance/report.html), one test for each sentence of the spec.\*
- **Correct.** Passes all 446 tests in the [conformance suite](https://htmlpreview.github.io/?https://github.com/lejmr/zig-hocon/blob/main/conformance/report.html), one test for each sentence of the spec.
- **Your schema is a Zig struct.** HOCON is only what sits on disk; the struct says what it holds, with defaults, optionals, enums, durations and sizes.
- **Fast.** A 10 MB config in a quarter of a second.\*\*
- **Fast.** A 10 MB config in a quarter of a second.\*
- **Clear errors.** File, line, column and a caret, also for a value of the wrong type.
- **One file to deploy.** Includes and overrides worked out ahead of time, the environment variables left for the server.
- **No dependencies.** The standard library and nothing else.

\* The other one is `include url("x.conf")`: the spec does not say what a URL without a scheme does, and [lightbend/config#887](https://github.com/lightbend/config/pull/887) proposes the error zig-hocon gives.
\*\* Read and written out as JSON by the command line tool, on an Apple M4 Pro.
\* Read and written out as JSON by the command line tool, on an Apple M4 Pro.

## Install

Expand Down Expand Up @@ -211,13 +210,13 @@ b.step("check-config", "Check the config against Config").dependOn(&check.step);

| implementation | against the spec | against typesafe/config 1.4.9 |
|---|---|---|
| Java <sub>typesafe/config 1.4.9</sub> | 89.9% (401/446) | 99.8% (445/446) |
| hocon2 <sub>hocon2 0.6.3</sub> | 86.5% (386/446) | 80.5% (359/446) |
| pulse-pyhocon <sub>pulse-pyhocon 0.2.1</sub> | 70.9% (316/446) | 68.4% (305/446) |
| py.hocon <sub>hocon-parser 1.14.2 (Python)</sub> | 89.0% (397/446) | 88.3% (394/446) |
| pyhocon <sub>pyhocon 0.3.63</sub> | 70.4% (314/446) | 66.8% (298/446) |
| rs.hocon <sub>hocon-parser 1.14.2 (Rust)</sub> | 89.0% (397/446) | 86.3% (385/446) |
| zig-hocon <sub>zig-hocon code@031f68c</sub> | 99.8% (445/446) | 89.9% (401/446) |
| Java <sub>typesafe/config 1.4.9</sub> | 90.1% (402/446) | 100% (446/446) |
| hocon2 <sub>hocon2 0.6.3</sub> | 86.8% (387/446) | 80.7% (360/446) |
| pulse-pyhocon <sub>pulse-pyhocon 0.2.1</sub> | 71.1% (317/446) | 68.6% (306/446) |
| py.hocon <sub>hocon-parser 1.14.2 (Python)</sub> | 89.2% (398/446) | 88.6% (395/446) |
| pyhocon <sub>pyhocon 0.3.63</sub> | 70.6% (315/446) | 67.0% (299/446) |
| rs.hocon <sub>hocon-parser 1.14.2 (Rust)</sub> | 89.2% (398/446) | 86.5% (386/446) |
| zig-hocon <sub>zig-hocon code@96d9b8a</sub> | 100% (446/446) | 90.1% (402/446) |

The table keeps the best parsers; the others measured, and why they are not in it: [conformance/README.md](conformance/README.md#not-in-the-table).

Expand Down
173 changes: 88 additions & 85 deletions conformance/maintaining/COVERAGE.html

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions conformance/maintaining/COVERAGE.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Rule coverage

272 of 287 rules in `RULES.md` have at least one case (95%).
273 of 288 rules in `RULES.md` have at least one case (95%).

Generated by `report.py`. A rule listed here is a sentence of the spec the
suite does not check — not a rule an implementation fails. `COVERAGE.html` is the
Expand All @@ -22,7 +22,7 @@ spec itself with every rule marked: green has a case, red has none.
- `include-semantics-locating-resources.1` L1111 A quoted string not surrounded by `url()`, `file()`, `classpath()` must be interpreted heuristically.
- `include-semantics-locating-resources.6` L1156 The current working directory of the process parsing a file must NOT be used when interpreting included paths.
- `include-semantics-locating-resources.8` L1181 Relative-to-including-file paths only work with the heuristic `include "foo.conf"`.
- `conversion-of-numerically-indexed-objects-to-arrays.1` L1187 To provide some mechanism for this, implementations should support converting objects with numeric keys into arrays.
- `conversion-of-numerically-indexed-objects-to-arrays.1` L1191 To provide some mechanism for this, implementations should support converting objects with numeric keys into arrays.

## Cases pointing at a rule that is not in RULES.md

Expand Down
Loading
Loading