diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..9c64d0b --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,47 @@ +name: Build + +on: + push: + branches: + - main + pull_request: + +permissions: + contents: read + +jobs: + build-and-test: + runs-on: ubuntu-latest + + steps: + - name: Check out ReadOnlyDom + uses: actions/checkout@v7.0.1 + with: + path: AngleSharp.ReadOnlyDom + + - name: Check out the matching AngleSharp source + uses: actions/checkout@v7.0.1 + with: + repository: dv00d00/AngleSharp + ref: devel + path: AngleSharp + + - name: Set up .NET + uses: actions/setup-dotnet@v6.0.0 + with: + dotnet-version: 10.0.x + + - name: Restore + run: dotnet restore AngleSharp.ReadOnlyDom.slnx --force --no-cache + working-directory: AngleSharp.ReadOnlyDom + + - name: Build + run: dotnet build AngleSharp.ReadOnlyDom.slnx -c Release --no-restore -m:1 + working-directory: AngleSharp.ReadOnlyDom + + - name: Test + run: >- + dotnet test tests/AngleSharp.ReadOnlyDom.Tests/AngleSharp.ReadOnlyDom.Tests.csproj + -c Release -f net10.0 --no-build --no-restore -- + --minimum-expected-tests 1 --progress off + working-directory: AngleSharp.ReadOnlyDom diff --git a/docs/UPSTREAM_ANGLESHARP_NOTES.md b/docs/UPSTREAM_ANGLESHARP_NOTES.md index 61b32f8..0c4dc32 100644 --- a/docs/UPSTREAM_ANGLESHARP_NOTES.md +++ b/docs/UPSTREAM_ANGLESHARP_NOTES.md @@ -1,4 +1,23 @@ -# AngleSharp generic construction notes +# AngleSharp upstream dependencies + +The object and compact DOM projects exercise generic construction and byte-source APIs that are not in a released +AngleSharp package yet. Until they ship, `Directory.Build.targets` replaces the AngleSharp package reference with a +source checkout. The standalone streaming project does not use that override. + +## Upstream tracking + +Status snapshot: 2026-08-20. All three pull requests are open and mergeable; their Linux and Windows jobs compile the +changes and then hit the same Fallout/.NET SDK infrastructure failure described in the PR comments. + +| Pull request | Relationship to this repository | +| --- | --- | +| [AngleSharp/AngleSharp#1285](https://github.com/AngleSharp/AngleSharp/pull/1285) | Handle-oriented HTML tree construction used by the compact arena | +| [AngleSharp/AngleSharp#1286](https://github.com/AngleSharp/AngleSharp/pull/1286) | Direct `ReadOnlyMemory` parsing in the retained DOM lanes | +| [AngleSharp/AngleSharp#1287](https://github.com/AngleSharp/AngleSharp/pull/1287) | Related opt-in custom-DOM whitespace contract; not enabled by default here | + +Do not publish the retained DOM packages against the temporary source contract. After #1285 and #1286 land in an +AngleSharp release, remove the source override, update the central package version, and run the full multi-target suite +against the package before making either project packable. #1287 can land independently. ## Handle-oriented tree construction @@ -8,19 +27,13 @@ FsCheck differential testing against AngleSharp 1.5.2 reduced a mismatch to malf
`. Targets `net11.0` with platform async, so it needs a -.NET 11 SDK: +on scroll, abandoning each linked page's download at ``. It builds on the default .NET 10 lane: ```powershell dotnet run --project samples/AngleSharp.ReadOnlyDom.HackerNews -c Release ``` +With a .NET 11 SDK, pass `-p:Net11Lane=true -p:Net11Async=true` to opt the sample and streaming library into the +platform-async experiment. + Opinionated text/Markdown projections and safe local Markdown navigation remain runnable examples rather than library surface: @@ -360,10 +362,11 @@ dotnet run --project samples/AngleSharp.ReadOnlyDom.ExtractionExamples -c Releas dotnet run --project samples/AngleSharp.ReadOnlyDom.MarkdownNavigation -c Release ``` -Run the test suite from the repository root: +Run the test suite from the repository root. The minimum count guard prevents a broken test-host configuration from +reporting success after discovering no tests: ```powershell -dotnet test AngleSharp.ReadOnlyDom.slnx -c Release +dotnet test tests/AngleSharp.ReadOnlyDom.Tests/AngleSharp.ReadOnlyDom.Tests.csproj -c Release -f net10.0 -- --minimum-expected-tests 1 ``` ## Repository layout diff --git a/samples/AngleSharp.ReadOnlyDom.HackerNews/AngleSharp.ReadOnlyDom.HackerNews.csproj b/samples/AngleSharp.ReadOnlyDom.HackerNews/AngleSharp.ReadOnlyDom.HackerNews.csproj index 0ff38df..62eefdc 100644 --- a/samples/AngleSharp.ReadOnlyDom.HackerNews/AngleSharp.ReadOnlyDom.HackerNews.csproj +++ b/samples/AngleSharp.ReadOnlyDom.HackerNews/AngleSharp.ReadOnlyDom.HackerNews.csproj @@ -1,10 +1,12 @@ - net11.0 + net10.0 + net11.0 enable enable - preview - $(Features);runtime-async=on + true + preview + $(Features);runtime-async=on diff --git a/samples/AngleSharp.ReadOnlyDom.HackerNews/README.md b/samples/AngleSharp.ReadOnlyDom.HackerNews/README.md index 74bcf96..4f7dc48 100644 --- a/samples/AngleSharp.ReadOnlyDom.HackerNews/README.md +++ b/samples/AngleSharp.ReadOnlyDom.HackerNews/README.md @@ -3,12 +3,13 @@ A Hacker News front end built on two streaming query plans. Nothing is buffered: list HTML is folded into NDJSON one story per line, and each row unfurls a link-preview card as it scrolls into view. -Needs a .NET 11 SDK (`net11.0`, platform async on). +The default lane targets `net10.0`. A .NET 11 SDK can opt into the platform-async experiment without making the +repository's normal build depend on a preview SDK. ```powershell dotnet run --project samples/AngleSharp.ReadOnlyDom.HackerNews -c Release -# with the library on the same async lane +# Optional: target net11.0 and put both the app and library on the platform-async lane. dotnet run --project samples/AngleSharp.ReadOnlyDom.HackerNews -c Release -p:Net11Lane=true -p:Net11Async=true ``` @@ -52,12 +53,10 @@ socket goes through a `ConnectCallback` that refuses private, loopback, link-loc time, not parse time. Card images are re-served from this origin. Feeds cache 15 s, cards 10 min. Cards load three at a time. -**Platform async.** `Features=runtime-async=on` is the switch; `UseRuntimeAsync` alone is a no-op and SDK -11.0.100-preview.7 has no property for it. Restore does not flow `AdditionalProperties` across a project reference, -so `Net11Lane`/`Net11Async` must be global `-p:` properties or restore fails NETSDK1005. Emitted state machines: 0 -vs 3 for this app (43,008 B vs 52,224 B), 0 vs 14 for the library (293,376 B vs 309,760 B). Whether it is *faster* -is unmeasured here — earlier preview-6 runs gained 1–4% on stream shapes while the preview JIT lost 8–12% on the -synchronous tokenizer loop. +**Platform async.** The checked-in default is the supported `net10.0` lane. Passing both `Net11Lane=true` and +`Net11Async=true` targets `net11.0` and adds `Features=runtime-async=on`; the properties must be global `-p:` values so +restore also applies them to the streaming project reference. The experiment previously emitted 0 compiler-generated +state machines versus 3 for this app, and 0 versus 14 for the library. Whether it is *faster* remains unmeasured here. **Limits.** Lexical start/end-tag topology, not corrected tree topology: omitted end tags and foster parenting can differ from a DOM converter. A page that declares card metadata below the head, or only from script, gets no card. diff --git a/src/AngleSharp.ReadOnlyDom.Streaming/AngleSharp.ReadOnlyDom.Streaming.csproj b/src/AngleSharp.ReadOnlyDom.Streaming/AngleSharp.ReadOnlyDom.Streaming.csproj index c3f8e2d..e6a9375 100644 --- a/src/AngleSharp.ReadOnlyDom.Streaming/AngleSharp.ReadOnlyDom.Streaming.csproj +++ b/src/AngleSharp.ReadOnlyDom.Streaming/AngleSharp.ReadOnlyDom.Streaming.csproj @@ -2,16 +2,16 @@ net8.0;net10.0 net8.0;net10.0;net11.0 - true - $(Features);runtime-async=on - preview + true + $(Features);runtime-async=on + preview enable enable false - + diff --git a/tests/AngleSharp.ReadOnlyDom.Tests/AngleSharp.ReadOnlyDom.Tests.csproj b/tests/AngleSharp.ReadOnlyDom.Tests/AngleSharp.ReadOnlyDom.Tests.csproj index 2b80da0..a51fc2e 100644 --- a/tests/AngleSharp.ReadOnlyDom.Tests/AngleSharp.ReadOnlyDom.Tests.csproj +++ b/tests/AngleSharp.ReadOnlyDom.Tests/AngleSharp.ReadOnlyDom.Tests.csproj @@ -1,4 +1,4 @@ - + Exe net10.0;net472 @@ -28,149 +28,7 @@ - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - + +