A2 followup: .properties / .ini structured-config format
Summary
Adds PropertiesConfigFormat to the PR-3 (#373) format dispatch. Java-stack operators (Spring Boot application.properties) + INI users get leaf replacement on the same Squid.Action.JsonConfigVariables toggle, routed by file extension.
Zero new NuGet deps. Zero wire-literal changes.
Path computation
| File | Path rule |
|---|---|
.properties |
key IS the dot-path: logging.level.root=INFO → logging.level.root. Both = and : delimiters |
.ini |
[section] prefixes the key: [database] url= → database.url
|
Format preservation (line-oriented, no DOM round-trip)
Rewrites ONLY the matched value span:
- Comments (
#/!/;), blank lines, key order, unmatched keys → byte-preserved - Delimiter + spacing (
key = value) → preserved - CRLF vs LF → round-tripped per-line
-
Line-continuation values (
key=part1\) → SKIPPED (left intact) to avoid corrupting Java multi-line values — documented + pinned
Shares ConfigVariableLookup with JSON/YAML/XML → identical Squid.* self-namespace guard + dot/colon dual-form lookup.
Test plan
-
Squid.Calamari.Tests: 504/504 (was 481; +23) -
Squid.UnitTests: 5625/5625 (unchanged) -
Build: 0 errors -
21 PropertiesConfigFormat tests: dotted/colon keys, INI sections + same-key disambiguation, comment/order/spacing/CRLF preservation, Squid.* guard, line-continuation skip -
Registry dispatch + SupportedExtensions pin updated -
Staging: real Spring Boot application.propertiesdeploy
Non-breaking guarantee
| Surface | Status |
|---|---|
| Wire literals | Unchanged — same toggle, extension dispatch |
| Existing JSON/YAML/XML config deploys | Unchanged |
.config (XDT) files |
Still not handled here (G1.2 owns them) |
| SquidWeb | Untouched |