diff --git a/.editorconfig b/.editorconfig
index 380d16d..49a4fb8 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -8,8 +8,8 @@ indent_size = 4
insert_final_newline = false
trim_trailing_whitespace = true
-[*.sln]
-indent_style = tab
+[*.slnx]
+indent_size = 2
[*.{csproj,vbproj,vcxproj,vcxproj.filters}]
indent_size = 2
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 6db2219..b511f7d 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -14,21 +14,22 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v2
+ uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Cache packages
- uses: actions/cache@v2
+ uses: actions/cache@v5
with:
path: ${{ env.NUGET_PACKAGES }}
- key: ${{ runner.os }}-nuget-${{ hashFiles('.config/dotnet-tools.json', '**/packages.lock.json') }}
+ key: ${{ runner.os }}-nuget-${{ hashFiles('dotnet-tools.json', 'src/Directory.Packages.props') }}
restore-keys: ${{ runner.os }}-nuget-
- - name: Setup .NET 6.x
- uses: actions/setup-dotnet@v1
+ - name: Setup .NET SDK (global.json + .NET 8 for tests)
+ uses: actions/setup-dotnet@v5
with:
- dotnet-version: 6.0.300
+ global-json-file: global.json
+ dotnet-version: 8.0.x
- name: Integration Tests
shell: bash
@@ -55,21 +56,22 @@ jobs:
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
- uses: actions/checkout@v2
+ uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Cache packages
- uses: actions/cache@v2
+ uses: actions/cache@v5
with:
path: ${{ env.NUGET_PACKAGES }}
- key: ${{ runner.os }}-nuget-${{ hashFiles('.config/dotnet-tools.json', '**/packages.lock.json') }}
+ key: ${{ runner.os }}-nuget-${{ hashFiles('dotnet-tools.json', 'src/Directory.Packages.props') }}
restore-keys: ${{ runner.os }}-nuget-
- - name: Setup .NET 6.x
- uses: actions/setup-dotnet@v1
+ - name: Setup .NET SDK (global.json + .NET 8 for tests)
+ uses: actions/setup-dotnet@v5
with:
- dotnet-version: 6.0.300
+ global-json-file: global.json
+ dotnet-version: 8.0.x
- name: Integration Tests
shell: bash
diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml
index e6b2d78..144de40 100644
--- a/.github/workflows/publish.yaml
+++ b/.github/workflows/publish.yaml
@@ -21,21 +21,22 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v2
+ uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Cache packages
- uses: actions/cache@v2
+ uses: actions/cache@v5
with:
path: ${{ env.NUGET_PACKAGES }}
- key: ${{ runner.os }}-nuget-${{ hashFiles('.config/dotnet-tools.json', '**/packages.lock.json') }}
+ key: ${{ runner.os }}-nuget-${{ hashFiles('dotnet-tools.json', 'src/Directory.Packages.props') }}
restore-keys: ${{ runner.os }}-nuget-
- - name: Setup .NET 6.x
- uses: actions/setup-dotnet@v1
+ - name: Setup .NET SDK (global.json + .NET 8 for tests)
+ uses: actions/setup-dotnet@v5
with:
- dotnet-version: 6.0.300
+ global-json-file: global.json
+ dotnet-version: 8.0.x
- name: Publish
shell: bash
diff --git a/.gitignore b/.gitignore
index 286d5f7..4d0e373 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,7 +21,6 @@ dotnet-install.sh*
.vs/
.vscode/
launchSettings.json
-*.sln.ide/
# Rider
src/.idea/**/workspace.xml
@@ -41,7 +40,6 @@ src/.idea/**/uiDesigner.xml
# User-specific files
*.suo
*.user
-*.sln.docstates
*.userprefs
*.GhostDoc.xml
*StyleCop.Cache
diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 0000000..c64cba3
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,83 @@
+# AGENTS.md
+
+Guidance for AI coding agents and contributors working in this repository.
+
+## Overview
+
+Appy.Parsing is an open-source .NET library, published to nuget.org, that turns raw text into
+objects. A regex-based lexer splits text into tokens and a parser combines tokens into objects;
+fluent builders define the grammar. Usage lives in [README.md](README.md), design in
+[docs/Architecture.md](docs/Architecture.md).
+
+## Build Commands
+
+```bash
+dotnet tool restore # cake, minver-cli, gpr
+dotnet cake # Default target: clean, build, test, pack into .artifacts/
+dotnet test src/Appy.Parsing.slnx # tests only
+dotnet test src/Appy.Parsing.slnx --filter "FullyQualifiedName~CalculatorTest"
+```
+
+- The cake build treats warnings as errors.
+- `config.yml` lists the projects cake builds and their role (`Package` or `Test`). A new
+ project not listed there is skipped by the build.
+- Package versions live in `src/Directory.Packages.props` (central package management); a
+ `PackageReference` in a csproj carries no `Version`. The repo `nuget.config` restores from
+ nuget.org only.
+- Never run the `Publish` cake target or `dotnet nuget push` locally; CI publishes.
+
+## Structure
+
+| Path | Purpose |
+|------|---------|
+| `src/Appy.Parsing/` | The library (`net10.0;net8.0`): `Builder/`, `Lexers/`, `Parsers/` |
+| `src/Appy.Parsing.Tests/` | xUnit v3 tests (`net10.0;net8.0`, one run per library TFM) |
+| `src/Directory.Build.props` | Shared build settings, package metadata |
+| `src/Directory.Build.targets` | MinVer and package validation settings |
+| `src/Directory.Packages.props` | Package versions |
+| `global.json` | .NET 10 SDK version |
+| `build.cake`, `functions.cake`, `config.yml` | Cake build |
+| `.github/workflows/` | `ci.yaml` on pull requests, `publish.yaml` on push to `master` or a tag |
+| `docs/` | Architecture and plans |
+
+## Versioning and Publishing
+
+- [MinVer](https://github.com/adamralph/minver) derives the version from git tags
+ (`MAJOR.MINOR.PATCH`, no `v` prefix). Untagged commits get a `-preview.0.N` suffix.
+- The MinVer minimum major.minor (`2.0`) is set in both `src/Directory.Build.targets` and
+ `build.cake`; keep them in sync.
+- Pack runs package validation against the last release: `PackageValidationBaselineVersion` in
+ `src/Directory.Build.targets`, suppressions in `src/Appy.Parsing/CompatibilitySuppressions.xml`.
+ After each release, move the baseline to that version and drop suppressions that no longer
+ apply.
+- A push to `master` that touches `src/` publishes a preview package; a tag publishes that
+ version. Do not create tags or releases unless a maintainer asks.
+- Dropping a target framework or public API is a breaking change: call it out in the PR.
+
+## Tests
+
+- xUnit v3 (`xunit.v3` 3.2.2, `xunit.runner.visualstudio` 3.1.5, run through VSTest,
+ `GitHubActionsTestLogger` 2.4.1) with FluentAssertions 7. Stay on FluentAssertions 7: 8 has a
+ commercial licence.
+- Tests build real lexers and parsers through the builders; no mocks.
+- Add or update a test with every behaviour change, and write it first.
+
+## Code Style
+
+- `.editorconfig`: 4 spaces, CRLF; 2 spaces for XML, JSON and YAML.
+- Match the existing code: `_camelCase` private fields, lower camel case private methods
+ (`populateUnmatchedPart`), no explicit `private` modifier.
+- Public types and members carry XML doc comments.
+
+## Git Conventions
+
+- Branches: `feat/…`, `fix/…`, `docs/…`, `chore/…`, from `master`.
+- Commits: conventional commits, `type(scope): subject`, imperative, lower case, no trailing dot
+ ([CONTRIBUTING.md](CONTRIBUTING.md#commit)). Breaking changes go in a `BREAKING CHANGE:` footer.
+- No `Co-Authored-By` or tool attribution trailers.
+- Public repository: never commit secrets, private feeds or internal links.
+
+## Documentation
+
+- [docs/Architecture.md](docs/Architecture.md): start here
+- [docs/plans/](docs/plans/): implementation plans (`NNN-slug.md`)
diff --git a/CLAUDE.md b/CLAUDE.md
new file mode 100644
index 0000000..e7d9fe5
--- /dev/null
+++ b/CLAUDE.md
@@ -0,0 +1,15 @@
+# CLAUDE.md
+
+This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
+
+@./AGENTS.md
+
+## Build & Test
+
+```bash
+dotnet tool restore
+dotnet cake # clean, build, test, pack into .artifacts/
+dotnet test src/Appy.Parsing.slnx # tests only
+```
+
+Never run the `Publish` cake target or `dotnet nuget push`; publishing happens in CI only.
diff --git a/README.md b/README.md
index cd19b57..341d1b2 100644
--- a/README.md
+++ b/README.md
@@ -21,9 +21,16 @@ It also has a number of Builders that allow you to easily define a grammar and b
## Table of Contents
+- [Supported frameworks](#supported-frameworks)
- [Installing](#installing)
- [Usage](#usage)
+## Supported frameworks
+
+Appy.Parsing targets `net10.0` and `net8.0`.
+
+Version 2.0 drops `net6.0` and `netstandard2.0`, so it no longer runs on .NET Framework. Projects on those frameworks can stay on [1.1.0](https://www.nuget.org/packages/Appy.Parsing/1.1.0).
+
## Installing
Install using the [Appy.Parsing NuGet package](https://www.nuget.org/packages/Appy.Parsing):
diff --git a/build.cake b/build.cake
index 83e0e3c..b75657e 100644
--- a/build.cake
+++ b/build.cake
@@ -1,7 +1,7 @@
-#addin nuget:?package=YamlDotNet&version=8.1.2
+#addin nuget:?package=YamlDotNet&version=16.2.0
#addin nuget:?package=System.Xml.XDocument&version=4.3.0
-#addin nuget:?package=Cake.MinVer&version=2.0.0
-#addin nuget:?package=Cake.Yaml&version=3.1.1
+#addin nuget:?package=Cake.MinVer&version=4.0.0
+#addin nuget:?package=Cake.Yaml&version=6.0.0
#load "./functions.cake"
@@ -14,6 +14,7 @@ var configFilePath = "config.yml";
var taskConfigManager = new ProjectTaskConfigurationManager();
var projectDescriptors = ProjectLoader.Load(Context, configFilePath, basePath, configuration).Projects;
var version = MinVer(settings => settings
+ .WithMinimumMajorMinor("2.0")
.WithDefaultPreReleasePhase("preview")
.WithVerbosity(MinVerVerbosity.Info));
@@ -41,7 +42,7 @@ Task("Restore")
DotNetRestore(basePath,
new DotNetRestoreSettings
{
- Verbosity = DotNetCoreVerbosity.Minimal
+ Verbosity = DotNetVerbosity.Minimal
});
});
@@ -59,7 +60,7 @@ Task("Build-Project")
Configuration = configuration,
NoRestore = true,
NoIncremental = context.HasArgument("rebuild"),
- MSBuildSettings = new DotNetCoreMSBuildSettings()
+ MSBuildSettings = new DotNetMSBuildSettings()
.TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error)
});
}
@@ -104,7 +105,7 @@ Task("Package")
NoRestore = true,
NoBuild = true,
OutputDirectory = artifactsPath,
- MSBuildSettings = new DotNetCoreMSBuildSettings()
+ MSBuildSettings = new DotNetMSBuildSettings()
.TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error)
});
}
@@ -163,7 +164,7 @@ Task("Publish-Package-NuGet")
context.Information("Publishing {0} to Nuget", nugetPkgFilePath);
- DotNetCoreNuGetPush(nugetPkgFilePath, new DotNetCoreNuGetPushSettings
+ DotNetNuGetPush(nugetPkgFilePath, new DotNetNuGetPushSettings
{
Source = "https://api.nuget.org/v3/index.json",
ApiKey = apiKey,
diff --git a/docs/Architecture.md b/docs/Architecture.md
new file mode 100644
index 0000000..d86e5fe
--- /dev/null
+++ b/docs/Architecture.md
@@ -0,0 +1,44 @@
+# Appy.Parsing: Architecture
+
+## Overview
+
+Appy.Parsing converts raw text into objects in two stages. A `Lexer` runs one combined regular
+expression (one named group per `Tokenizer`) and turns each match into a token object; text that
+matches nothing is kept as a string unless the lexer ignores it. A `Parser` then applies its
+`TokenParser` rules in registration order. Each rule encodes the token sequence as a string of type
+identifiers, matches its pattern against it and replaces the matched run with the object it
+creates, repeating until the rule no longer matches.
+
+`LexerBuilder` and `ParserBuilder` are the public entry points: fluent builders that declare the
+grammar. Build and test guidance lives in [AGENTS.md](../AGENTS.md).
+
+## System Diagram
+
+```mermaid
+graph LR
+ Text["Input text"] --> Lexer
+ LexerBuilder -->|creates| Lexer
+ Lexer -->|tokens| Parser
+ ParserBuilder -->|creates| Parser
+ Parser -->|applies TokenParser rules in order| Result["object[] or T"]
+```
+
+## Key Patterns
+
+### Builders define the grammar
+
+`LexerBuilder.Match*` registers tokenizers (regex, enum values via `[Match]`, dictionaries).
+`ParserBuilder.Match*` registers token rules with `MatchOptions` (`AllInOrder`, `AnyOrder`,
+`AtLeastOne`) that expand into one rule per accepted token combination. Builders compose with
+`CombineWith`.
+
+### Cached tokenization
+
+`Lexer` caches the token array per input expression in a `ConcurrentDictionary`, so repeated
+expressions skip the regex pass.
+
+## Plans
+
+| Plan | Status | Summary |
+|------|--------|---------|
+| [001 .NET 10 Migration](plans/001-net10-migration.md) | In Progress | Target net10.0 and net8.0; align build and CI |
diff --git a/docs/plans/001-net10-migration.md b/docs/plans/001-net10-migration.md
new file mode 100644
index 0000000..eb91218
--- /dev/null
+++ b/docs/plans/001-net10-migration.md
@@ -0,0 +1,95 @@
+# .NET 10 Migration
+
+- **Status:** In Progress
+- **Branch:** `feat/net10`
+
+## Summary
+
+Move Appy.Parsing from `net6.0;netstandard2.0` to `net10.0;net8.0` on the .NET 10 SDK, with tests
+on `net10.0` and `net8.0`, and release it as 2.0.0. The build, packages, test stack and GitHub Actions line up
+with [Appy.Configuration](https://github.com/YellowLineParking/Appy.Configuration), which already
+made this move. No public API or behaviour change is intended; only the supported frameworks change.
+
+## Decisions
+
+| Decision | Context | Alternatives Considered |
+|----------|---------|------------------------|
+| Library `net10.0;net8.0`, tests `net10.0;net8.0` | net10.0 and net8.0 are the supported LTS releases. net6.0 is out of support; `netstandard2.0` only needed the `Nullable` polyfill. Tests run once per shipped library asset. | Also `net9.0`: a short-term release that net8.0 assets already cover. Keep `netstandard2.0`: .NET Framework users can stay on 1.x. |
+| Release 2.0.0 | Dropping `net6.0` and `netstandard2.0` breaks .NET Framework, net6 and net7 users: a SemVer major. | 1.2.0, as Appy.Configuration did for the same drop: undersells the break. |
+| MinVer as the reference (2.3.0, package and CLI), phase `preview`, minimum major.minor `2.0` | One versioning setup across both repos. With the minimum set, the preview published on merge reads `2.0.0-preview.0.N`, not `1.1.1-preview`. | MinVer 8: needs a workaround in `build.cake` because Cake.MinVer only exposes the phase option that MinVer 8 rejects. |
+| Repo `nuget.config` restores from nuget.org only | Central package management warns (NU1507) when a contributor's machine has more than one package source; a single cleared source avoids that without suppressing the warning. | Suppress NU1507: hides real source mix-ups. |
+| Central package management, `.slnx`, no Traversal build | `.slnx` is the SDK 10 solution format. Cake builds the projects listed in `config.yml`, as before. | Keep `.sln` as the reference. Traversal build as the reference: deferred. |
+| xUnit v3 3.2.2 with `xunit.runner.visualstudio` 3.1.5, FluentAssertions 7.2.2 | xUnit v2 is in maintenance mode; 3.2.2 matches the sibling repos. FluentAssertions 8 has a commercial licence; 7.x is the last Apache-2.0 line. | xUnit v3 4.x: newer, not yet used alongside. xUnit v2 as the reference: leaves a migration for later. |
+| CI installs the .NET 10 SDK (from `global.json`) plus .NET 8.0.x | The SDK builds both TFMs; 8.0.x provides the runtime for the net8.0 test run. | Install 8/9/10 as the reference: net9 is unused. |
+| Package validation against 1.1.0 | Guards the API from this release on. The only expected findings are the two dropped TFMs (PKV006), suppressed explicitly. | None (the reference has none): a TFM or API drop could ship silently. |
+| Drop `Microsoft.SourceLink.GitHub`, `Nullable`, unused `Moq` | Source Link ships in the .NET 8+ SDK; the polyfill and `Moq` are unused on net8+. | Keep them as the reference does: dead dependencies. |
+| Nullable reference types stay off | Annotating the public API is a separate change. | Enable now: widens a framework-only PR. |
+
+## Tasks
+
+Each task is one commit. The `!` marks the breaking change.
+
+- [x] 1. `feat(dotnet)!: target net10.0 and net8.0`: `global.json` SDK `10.0.103` with
+ `rollForward: latestFeature` (drop `projects`); library TFMs; test TFM `net10.0` (later net10.0;net8.0, from review); remove the
+ `Nullable` package, the `Microsoft.NETCore.App.Ref` download and the annotator properties;
+ `PackageTags` to `NET10;NET8;parsing;lexer`. Test: the existing 14 tests pass on net10.0.
+- [x] 2. `chore(deps): adopt central package management and upgrade packages`: add
+ `src/Directory.Packages.props`, move all versions out of `Directory.Build.props` and the csproj
+ files, drop `Moq` and `Microsoft.SourceLink.GitHub`. Versions: Microsoft.NET.Test.Sdk 18.10.1,
+ FluentAssertions 7.2.2, NodaTime 3.3.5, GitHubActionsTestLogger 3.0.5 (2.4.1 in task 3),
+ XunitXml.TestLogger 8.0.0 (dropped in task 3), MinVer 2.3.0. Test: build with `-warnaserror`,
+ 14 tests pass.
+- [x] 3. `test: migrate tests to xUnit v3`: `xunit` to `xunit.v3` 3.2.2,
+ `xunit.runner.visualstudio` 3.1.5, `OutputType` `Exe`, per the xUnit v3 migration guide. Test:
+ 14 tests discovered and passing (a count of 0 is a failure). GitHubActionsTestLogger goes to 2.4.1
+ and XunitXml.TestLogger is dropped: their newer versions need Microsoft.Testing.Platform 2, which
+ xunit.v3 3.2.2 does not use.
+- [x] 4. `chore(build): align cake build and versioning with .NET 10`: port `build.cake` from the
+ reference without the Docker tasks (Cake 6 `DotNet*` API; projects still come from `config.yml`,
+ no Traversal build); `dotnet-tools.json` cake.tool 6.3.0,
+ minver-cli 2.3.0, gpr 0.1.294; addins Cake.MinVer 4.0.0, Cake.Yaml 6.0.0, YamlDotNet 16.2.0 (as
+ the reference). `MinVerMinimumMajorMinor=2.0` in `Directory.Build.targets` and
+ `WithMinimumMajorMinor("2.0")` in `build.cake`. Test: `dotnet cake` prints the same version as the
+ `.nupkg` file name.
+- [x] 5. `feat(packages): enable package validation against 1.1.0`: `EnablePackageValidation`,
+ `PackageValidationBaselineVersion=1.1.0`, and a generated `CompatibilitySuppressions.xml` with only
+ PKV006 for `net6.0` and `netstandard2.0`. Test: pack fails before the suppression file (red) and
+ passes with it (green).
+- [x] 6. `ci: update GitHub Actions for .NET 10`: `ci.yaml` and `publish.yaml` as the reference:
+ `actions/checkout@v6`, `actions/cache@v5`, `actions/setup-dotnet@v5` reading `global.json` in
+ every job (later plus .NET 8.0.x for the net8.0 tests, from review). Triggers stay as they are; no Docker steps. Test: PR checks green on all three OSes.
+- [x] 7. `docs: update docs for .NET 10`: README supported frameworks (net8.0, net10.0; 1.x stays
+ available for `netstandard2.0` and `net6.0`), AGENTS.md (central package management, xUnit v3),
+ this plan's status. The README badge moves to 2.0.0 after the release, as a `docs(readme)` commit.
+
+## Verification
+
+- [x] `dotnet build src/Appy.Parsing.slnx -c Release -warnaserror`: 0 warnings, 0 errors.
+- [x] `dotnet test src/Appy.Parsing.slnx`: 14 passed on net10.0 and 14 on net8.0 (4 facts, 10 theory cases).
+- [x] `dotnet cake` (Default target) is green, and `.artifacts/Appy.Parsing.2.0.0-preview.0.N.nupkg`
+ holds `lib/net8.0` and `lib/net10.0` only.
+- [x] Package validation runs on pack; the suppression file lists only the two PKV006 entries.
+- [x] No `net6.0`, `net9.0` or `netstandard2.0` left outside the suppression file and the docs that
+ explain the change.
+- [x] No `.cs` change under `src/Appy.Parsing/`, so the public API is unchanged.
+- [x] Nothing is published or tagged from a local machine.
+- [ ] Done when: the PR is merged, a maintainer tags `2.0.0`, the publish workflow is green, and
+ nuget.org lists Appy.Parsing 2.0.0 for net8.0 and net10.0. Merging also publishes a
+ `2.0.0-preview.0.N` package first; that is expected.
+
+## Key Files
+
+```
+global.json # SDK 10
+nuget.config # (new) nuget.org as the only package source
+src/Directory.Build.props # package metadata
+src/Directory.Build.targets # MinVer and package validation settings
+src/Directory.Packages.props # (new) central package versions
+src/Appy.Parsing.slnx # (new) solution file (SDK 10 format)
+src/Appy.Parsing/Appy.Parsing.csproj # library TFMs
+src/Appy.Parsing/CompatibilitySuppressions.xml # (new) PKV006 for dropped TFMs
+src/Appy.Parsing.Tests/Appy.Parsing.Tests.csproj # test TFM, xUnit v3
+build.cake, dotnet-tools.json # Cake 6, MinVer
+.github/workflows/ci.yaml, publish.yaml # action versions, SDK setup
+README.md, AGENTS.md # supported frameworks, conventions
+```
diff --git a/dotnet-tools.json b/dotnet-tools.json
index d3de183..507eff5 100644
--- a/dotnet-tools.json
+++ b/dotnet-tools.json
@@ -3,19 +3,19 @@
"isRoot": true,
"tools": {
"cake.tool": {
- "version": "2.2.0",
+ "version": "6.3.0",
"commands": [
"dotnet-cake"
]
},
"minver-cli": {
- "version": "4.1.0",
+ "version": "2.3.0",
"commands": [
"minver"
]
},
"gpr": {
- "version": "0.1.281",
+ "version": "0.1.294",
"commands": [
"gpr"
]
diff --git a/global.json b/global.json
index 264dc52..d92a294 100644
--- a/global.json
+++ b/global.json
@@ -1,7 +1,6 @@
{
- "projects": [ "src" ],
"sdk": {
- "version": "6.0.300",
- "rollForward": "latestPatch"
+ "version": "10.0.103",
+ "rollForward": "latestFeature"
}
}
\ No newline at end of file
diff --git a/nuget.config b/nuget.config
new file mode 100644
index 0000000..4d736c1
--- /dev/null
+++ b/nuget.config
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/src/Appy.Parsing.Tests/Appy.Parsing.Tests.csproj b/src/Appy.Parsing.Tests/Appy.Parsing.Tests.csproj
index 4fbaf93..2359d81 100644
--- a/src/Appy.Parsing.Tests/Appy.Parsing.Tests.csproj
+++ b/src/Appy.Parsing.Tests/Appy.Parsing.Tests.csproj
@@ -1,23 +1,21 @@
- net6.0
+ net10.0;net8.0
+ Exe
false
- latest
-
-
-
-
-
-
+
+
+
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
+
diff --git a/src/Appy.Parsing.Tests/LexerTests.cs b/src/Appy.Parsing.Tests/LexerTests.cs
index 45b51da..1dbfc77 100644
--- a/src/Appy.Parsing.Tests/LexerTests.cs
+++ b/src/Appy.Parsing.Tests/LexerTests.cs
@@ -24,6 +24,6 @@ public LexerTests() =>
[Fact]
public void ParsesTokens() =>
_subject.Tokenize("9 * 6 / 3 - 2")
- .Should().BeEquivalentTo(9, new MultiToken(), 6, new DivideToken(), 3, new MinusToken(), 2);
+ .Should().BeEquivalentTo(new object[] { 9, new MultiToken(), 6, new DivideToken(), 3, new MinusToken(), 2 });
}
}
\ No newline at end of file
diff --git a/src/Appy.Parsing.sln b/src/Appy.Parsing.sln
deleted file mode 100644
index 3dc768f..0000000
--- a/src/Appy.Parsing.sln
+++ /dev/null
@@ -1,39 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.27004.2002
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Appy.Parsing", "Appy.Parsing\Appy.Parsing.csproj", "{65291E12-5AE8-4AC6-A28F-F84D0C182B62}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Appy.Parsing.Tests", "Appy.Parsing.Tests\Appy.Parsing.Tests.csproj", "{D536A6AE-BF06-4BD8-860F-0E4A3AD73004}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{FB7DCD2D-E9C1-4773-8B80-BEFF8883A09B}"
- ProjectSection(SolutionItems) = preProject
- ..\build.cake = ..\build.cake
- ..\config.yml = ..\config.yml
- ..\functions.cake = ..\functions.cake
- ..\global.json = ..\global.json
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {65291E12-5AE8-4AC6-A28F-F84D0C182B62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {65291E12-5AE8-4AC6-A28F-F84D0C182B62}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {65291E12-5AE8-4AC6-A28F-F84D0C182B62}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {65291E12-5AE8-4AC6-A28F-F84D0C182B62}.Release|Any CPU.Build.0 = Release|Any CPU
- {D536A6AE-BF06-4BD8-860F-0E4A3AD73004}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {D536A6AE-BF06-4BD8-860F-0E4A3AD73004}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {D536A6AE-BF06-4BD8-860F-0E4A3AD73004}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {D536A6AE-BF06-4BD8-860F-0E4A3AD73004}.Release|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {4CA5C51B-B78E-4847-80FD-01A8A26EBAC7}
- EndGlobalSection
-EndGlobal
diff --git a/src/Appy.Parsing.slnx b/src/Appy.Parsing.slnx
new file mode 100644
index 0000000..26ca993
--- /dev/null
+++ b/src/Appy.Parsing.slnx
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Appy.Parsing/Appy.Parsing.csproj b/src/Appy.Parsing/Appy.Parsing.csproj
index f232fa6..ac92565 100644
--- a/src/Appy.Parsing/Appy.Parsing.csproj
+++ b/src/Appy.Parsing/Appy.Parsing.csproj
@@ -1,26 +1,12 @@
- net6.0;netstandard2.0
+ net10.0;net8.0
Library
- latest
-
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
-
-
- 3.0.0
- False
-
-
\ No newline at end of file
diff --git a/src/Appy.Parsing/CompatibilitySuppressions.xml b/src/Appy.Parsing/CompatibilitySuppressions.xml
new file mode 100644
index 0000000..2b52f50
--- /dev/null
+++ b/src/Appy.Parsing/CompatibilitySuppressions.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ PKV006
+ .NETStandard,Version=v2.0
+
+
+ PKV006
+ net6.0
+
+
\ No newline at end of file
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index 3bf5c94..cba6c58 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -24,7 +24,7 @@
https://github.com/YellowLineParking/Appy.Parsing
MIT
https://github.com/YellowLineParking/Appy.Parsing/releases
- NET6;NETCore
+ NET10;NET8;parsing;lexer
@@ -38,26 +38,7 @@
-
-
+
-
- 1.0.0-alpha.160
- 1.2.1
- 2.4.18
-
-
-
- 0.1.0
- 17.0.0
- 5.10.3
- 4.14.6
- 2.4.1
- 2.4.3
- 1.3.0
- 2.1.26
- 1.1.2
-
-
diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets
index 4b6ff93..d3d5eaf 100644
--- a/src/Directory.Build.targets
+++ b/src/Directory.Build.targets
@@ -1,6 +1,16 @@
+
+ true
+ 1.1.0
+
+
+
+
+
+ 2.0
preview
normal
diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props
new file mode 100644
index 0000000..14b5a69
--- /dev/null
+++ b/src/Directory.Packages.props
@@ -0,0 +1,14 @@
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+