You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Recursive listStream() is now actually O(1) (#198) — ARO-0051's streaming directory listing was advertised as constant-memory but used an AsyncThrowingStream { continuation in Task { ... } } producer with the default unbounded buffering policy. On large recursive scans the producer ran far ahead of the consumer and accumulated hundreds of thousands of entry dictionaries in memory. Scanning /Users/kris pushed RSS to ~1.7 GB before it settled back. Switched to the pull-based AsyncThrowingStream(unfolding:) initializer backed by the existing LazyDirectoryList wrapper (already used by compiled mode), which invokes the producer closure exactly once per consumer next(). The same 100 000-file tree now peaks at ~77 MB RSS.
Read/Write raw qualifier opt-out for format-aware I/O (#197) — ARO-0040 auto-detects serialisation format from the file extension, but silently misparses files whose extension matches a known format while the content does not (e.g. a .txt file containing plain integers was being run through the key=value parser). You can now opt out explicitly:
(* Bypass format handling entirely — read/write the raw string *)
Read the <text: raw> from "notes.txt".
Write <text: raw> to "notes.txt".
(* Or force a specific format regardless of extension *)
Read the <data: json> from "data.txt".
Resolution order on Read/Write is now: raw → explicit format qualifier (json, csv, yaml, …) → file extension.
REPL terminal object reports real dimensions (#172) — aro repl never registered TerminalService, so <terminal> always returned the hardcoded 80×24 / no-color fallback. REPLSession now registers the service with the same isatty() / WT_SESSION gating as Application.registerDefaultServices().
Native compiler handles PipelineStatement — the LLVM code generator had no case for ARO-0067 pipelines, so each stage silently fell through to the default error branch and its result variable was never bound. PipelineDemo passed in the interpreter but produced empty values in compiled mode. Each stage is now emitted as a regular AROStatement, and the bound-variable / string-constant collectors recurse into pipeline stages.
CSV deserializer handles CRLF and lone-CR line endings — the deserializer split on \n only, so Windows-saved CSVs parsed as a single malformed row and ReadAction fell through to returning the raw file content. Line endings are now normalized before splitting, so a CSV round-trips to JSON identically regardless of how it was saved.
Testing & CI
HTTPClient / WeatherClient examples run fully offline (!232) — both examples called api.open-meteo.com directly, so any upstream 502 broke integration:linux and blocked unrelated MRs. Added a self-contained Python HTTP stub (stub.py) per example that mirrors the Open-Meteo response shape; the examples now point at 127.0.0.1. In CI the stubs are started once in integration:linux's before_script (outside the Perl test harness), so they survive for the whole job. The example main.aro files keep a comment showing the real Open-Meteo URL for users who want to call the live API.
HTTP test flakiness fixes — disabled HTTP::Tiny keep-alive in test-examples.pl, retry once on 599 transport errors, and wait 1.5 s (was 0.5 s) for async observer output to drain. Eliminates intermittent failures in RepositoryObserver / SystemMonitor / HTTPClient.
Repo hygiene — added the four untracked example binaries (CountingStyles, ParameterRefs, RepositoryLimits, StreamExample) to .gitignore and removed stale WIKI_UPDATE_NOTES*.md scratch files.
IntelliJ Plugin
v1.4.0 — TextMate grammar sync with the runtime: 47 missing action verb aliases, raw string literals, numeric underscores, the pipeline operator |>, missing prepositions (at/via/by), and the Conflict status code. Updated spell-check dictionary. Extended IDE compatibility to 2025.2.
v1.4.1 — support for IDE build 261.*.
v0.4.2 — run configurations bundled with the plugin, and PipelineDemo updated to use |>.
GitHub Actions workflow for building the plugin ZIP and (manually-triggered) publishing to the JetBrains Marketplace. Plugin tests are non-blocking and upload the HTML test report as an artifact. Removed the hardcoded macOS Java home from gradle.properties (the toolchain is declared in build.gradle.kts and provided by setup-java in CI).
Documentation
Construction Studies Chapter 12 — "Streaming Wasn't Streaming" — the listStream() buffering mistake (Publish IntelliJ ARO plugin to JetBrains Marketplace #198) and the AsyncThrowingStream(unfolding:) fix documented as the concrete counter-example: "streaming is a promise about memory, not about API shape."
Appendix source map — cross-reference rows for the three fixes above so readers can jump straight to listStream(), the raw qualifier helpers, and the REPL TerminalService registration.
Upgrade
# From source
git pull && swift build -c release
# Verify
aro --version # 0.8.2
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
ARO 0.8.2
Released: 2026-04-09
Tag:
0.8.2Full diff:
0.8.1...0.8.2Bug Fixes
listStream()is now actually O(1) (#198) — ARO-0051's streaming directory listing was advertised as constant-memory but used anAsyncThrowingStream { continuation in Task { ... } }producer with the default unbounded buffering policy. On large recursive scans the producer ran far ahead of the consumer and accumulated hundreds of thousands of entry dictionaries in memory. Scanning/Users/krispushed RSS to ~1.7 GB before it settled back. Switched to the pull-basedAsyncThrowingStream(unfolding:)initializer backed by the existingLazyDirectoryListwrapper (already used by compiled mode), which invokes the producer closure exactly once per consumernext(). The same 100 000-file tree now peaks at ~77 MB RSS.rawqualifier opt-out for format-aware I/O (#197) — ARO-0040 auto-detects serialisation format from the file extension, but silently misparses files whose extension matches a known format while the content does not (e.g. a.txtfile containing plain integers was being run through the key=value parser). You can now opt out explicitly:Read/Writeis now:raw→ explicit format qualifier (json,csv,yaml, …) → file extension.aro replnever registeredTerminalService, so<terminal>always returned the hardcoded 80×24 / no-color fallback.REPLSessionnow registers the service with the sameisatty()/WT_SESSIONgating asApplication.registerDefaultServices().PipelineStatement— the LLVM code generator had no case for ARO-0067 pipelines, so each stage silently fell through to the default error branch and its result variable was never bound.PipelineDemopassed in the interpreter but produced empty values in compiled mode. Each stage is now emitted as a regularAROStatement, and the bound-variable / string-constant collectors recurse into pipeline stages.\nonly, so Windows-saved CSVs parsed as a single malformed row andReadActionfell through to returning the raw file content. Line endings are now normalized before splitting, so a CSV round-trips to JSON identically regardless of how it was saved.Testing & CI
api.open-meteo.comdirectly, so any upstream 502 brokeintegration:linuxand blocked unrelated MRs. Added a self-contained Python HTTP stub (stub.py) per example that mirrors the Open-Meteo response shape; the examples now point at127.0.0.1. In CI the stubs are started once inintegration:linux'sbefore_script(outside the Perl test harness), so they survive for the whole job. The examplemain.arofiles keep a comment showing the real Open-Meteo URL for users who want to call the live API.HTTP::Tinykeep-alive intest-examples.pl, retry once on 599 transport errors, and wait 1.5 s (was 0.5 s) for async observer output to drain. Eliminates intermittent failures inRepositoryObserver/SystemMonitor/HTTPClient.CountingStyles,ParameterRefs,RepositoryLimits,StreamExample) to.gitignoreand removed staleWIKI_UPDATE_NOTES*.mdscratch files.IntelliJ Plugin
|>, missing prepositions (at/via/by), and theConflictstatus code. Updated spell-check dictionary. Extended IDE compatibility to 2025.2.261.*.PipelineDemoupdated to use|>.gradle.properties(the toolchain is declared inbuild.gradle.ktsand provided bysetup-javain CI).Documentation
listStream()buffering mistake (Publish IntelliJ ARO plugin to JetBrains Marketplace #198) and theAsyncThrowingStream(unfolding:)fix documented as the concrete counter-example: "streaming is a promise about memory, not about API shape."listStream(), therawqualifier helpers, and the REPLTerminalServiceregistration.Upgrade
Beta Was this translation helpful? Give feedback.
All reactions