diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/ISSUE_TEMPLATE/question.yml index 2a07a74..fbc9048 100644 --- a/.github/ISSUE_TEMPLATE/question.yml +++ b/.github/ISSUE_TEMPLATE/question.yml @@ -11,7 +11,7 @@ body: Before asking, please check: - [Documentation](https://triasdev.github.io/templify/) - [FAQ](https://triasdev.github.io/templify/articles/FAQ.html) - - [Examples](https://github.com/TriasDev/templify/tree/main/TriasDev.Templify/Examples.md) + - [Examples](https://github.com/TriasDev/templify/tree/main/src/TriasDev.Templify/Examples.md) - type: textarea id: question diff --git a/.github/workflows/build-sonarqube.yml b/.github/workflows/build-sonarqube.yml index 13e8181..54267f1 100644 --- a/.github/workflows/build-sonarqube.yml +++ b/.github/workflows/build-sonarqube.yml @@ -72,7 +72,7 @@ jobs: ./.sonar/scanner/dotnet-sonarscanner begin /k:"TriasDev_templify_8a5e67a9-f60c-48a0-9327-7eee6085006d" /d:sonar.token="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="${SONAR_HOST_URL}" /d:sonar.sourceEncoding=UTF-8 # Sonar reports its findings as build warnings; they must not fail the analysis build # (CI builds otherwise treat warnings as errors, see Directory.Build.props). - dotnet build templify.sln -p:TreatWarningsAsErrors=false + dotnet build templify.slnx -p:TreatWarningsAsErrors=false ./.sonar/scanner/dotnet-sonarscanner end /d:sonar.token="${{ secrets.SONAR_TOKEN }}" echo "✅ **Build:** Completed successfully" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 13eb87d..269c337 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -163,7 +163,7 @@ jobs: run: dotnet build --no-restore --configuration Release - name: Pack - run: dotnet pack TriasDev.Templify/TriasDev.Templify.csproj --no-build --configuration Release --output ./artifacts + run: dotnet pack src/TriasDev.Templify/TriasDev.Templify.csproj --no-build --configuration Release --output ./artifacts - name: Upload NuGet package artifact uses: actions/upload-artifact@v7 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index d1a9614..9c9bf6d 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -43,7 +43,7 @@ jobs: build-mode: manual - name: Build - run: dotnet build templify.sln --configuration Release + run: dotnet build templify.slnx --configuration Release - name: Perform CodeQL analysis uses: github/codeql-action/analyze@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2 diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index c2824c9..a46b137 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -58,19 +58,19 @@ jobs: - name: Build run: | - dotnet build TriasDev.Templify/TriasDev.Templify.csproj \ + dotnet build src/TriasDev.Templify/TriasDev.Templify.csproj \ --configuration Release \ -p:Version=${{ env.VERSION }} - name: Build tests run: | - dotnet build TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj \ + dotnet build tests/TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj \ --configuration Release \ -p:Version=${{ env.VERSION }} - name: Run tests run: | - dotnet test TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj \ + dotnet test tests/TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj \ --configuration Release \ --no-build \ --verbosity normal \ @@ -90,7 +90,7 @@ jobs: - name: Pack run: | - dotnet pack TriasDev.Templify/TriasDev.Templify.csproj \ + dotnet pack src/TriasDev.Templify/TriasDev.Templify.csproj \ --configuration Release \ --no-build \ -p:Version=${{ env.VERSION }} \ diff --git a/.gitignore b/.gitignore index 6a9935e..902e1d5 100644 --- a/.gitignore +++ b/.gitignore @@ -335,7 +335,7 @@ certificates/ .env # Demo data files - removed from history -TriasDev.Templify.Demo/Data/ +samples/TriasDev.Templify.Demo/Data/ process-data*.json **/publish/ @@ -347,4 +347,4 @@ BenchmarkDotNet.Artifacts/ # Demo output (TriasDev.Templify.Demo writes to ./output by default) /output/ -TriasDev.Templify.Demo/output/ +samples/TriasDev.Templify.Demo/output/ diff --git a/CLAUDE.md b/CLAUDE.md index 5065ef0..b9d6ec8 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -12,17 +12,22 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Solution Structure -This is a multi-project solution with 9 projects: - -- **TriasDev.Templify** - Core library with template processing logic -- **TriasDev.Templify.Tests** - xUnit test suite (~2,090 tests, ~91% line / ~85% branch coverage) -- **TriasDev.Templify.Benchmarks** - BenchmarkDotNet performance tests -- **TriasDev.Templify.Converter** - CLI tool for converting Word documents -- **TriasDev.Templify.Gui** - Avalonia-based GUI application -- **TriasDev.Templify.Demo** - Demo console application -- **TriasDev.Templify.DocumentGenerator** - Generates the example templates/outputs used in the documentation -- **TriasDev.Templify.Tools.Tests** - xUnit tests for the tools/apps (GUI ViewModel/services headless, DocumentGenerator smoke tests) -- **TriasDev.Templify.Converter.Tests** - xUnit tests for the Converter CLI (round trips through the core, file safety, CLI parsing) +`templify.slnx` holds 9 projects in solution folders that mirror the directories (same layout as TriasDev/tabular): + +- `src/` (only what ships to NuGet) + - **TriasDev.Templify** - Core library with template processing logic +- `tests/` + - **TriasDev.Templify.Tests** - xUnit test suite (~2,090 tests, ~91% line / ~85% branch coverage) + - **TriasDev.Templify.Tools.Tests** - xUnit tests for the tools/apps (GUI ViewModel/services headless, DocumentGenerator smoke tests) + - **TriasDev.Templify.Converter.Tests** - xUnit tests for the Converter CLI (round trips through the core, file safety, CLI parsing) +- `benchmarks/` + - **TriasDev.Templify.Benchmarks** - BenchmarkDotNet performance tests +- `samples/` + - **TriasDev.Templify.Demo** - Demo console application +- `tools/` (applications that are not packages) + - **TriasDev.Templify.Converter** - CLI tool for converting Word documents + - **TriasDev.Templify.Gui** - Avalonia-based GUI application + - **TriasDev.Templify.DocumentGenerator** - Generates the example templates/outputs used in the documentation ## Development Workflow @@ -40,39 +45,40 @@ Standard flow for changes: ### Building ```bash # Build entire solution -dotnet build templify.sln +dotnet build templify.slnx # Build in Release mode -dotnet build templify.sln -c Release +dotnet build templify.slnx -c Release # Build specific project -dotnet build TriasDev.Templify/TriasDev.Templify.csproj +dotnet build src/TriasDev.Templify/TriasDev.Templify.csproj ``` ### Build Configuration - `global.json` pins the SDK (10.0.100, `rollForward: latestFeature`). -- `Directory.Build.props` holds shared settings (Nullable, ImplicitUsings, LangVersion, AnalysisLevel, EnforceCodeStyleInBuild). Nullable warnings are always errors; in CI (`GITHUB_ACTIONS=true` → `ContinuousIntegrationBuild`) all warnings are errors. Reproduce locally with `dotnet build templify.sln -c Release -p:ContinuousIntegrationBuild=true`. +- `Directory.Build.props` holds shared settings (Nullable, ImplicitUsings, LangVersion, AnalysisLevel, EnforceCodeStyleInBuild). Nullable warnings are always errors; in CI (`GITHUB_ACTIONS=true` → `ContinuousIntegrationBuild`) all warnings are errors. Reproduce locally with `dotnet build templify.slnx -c Release -p:ContinuousIntegrationBuild=true`. +- `src/Directory.Build.props` (package metadata, Source Link, public API guard) and `tests/Directory.Build.props` (xUnit packages, `IsPackable=false`) import the root file; `tools/`, `benchmarks/` and `samples/` use the root file alone. - `Directory.Packages.props` (Central Package Management) holds all NuGet versions; `PackageReference` items have no `Version`. -- Every project has a committed `packages.lock.json`; CI restores in locked mode. After changing a package, run `dotnet restore templify.sln` and commit the updated lock files. +- Every project has a committed `packages.lock.json`; CI restores in locked mode. After changing a package, run `dotnet restore templify.slnx` and commit the updated lock files. - The library targets `net10.0;net9.0;net8.0`. Support policy: .NET versions in Microsoft support; EOL TFMs are dropped in a minor release with a release-notes notice (net6.0 dropped in 1.8.0). - `TriasDev.Templify.Tests` multi-targets the library's TFMs (`net10.0;net9.0;net8.0`); run a single one with `--framework net10.0`. ### Testing ```bash # Run all tests -dotnet test TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj +dotnet test tests/TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj # Run tests with detailed output -dotnet test TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj --verbosity normal +dotnet test tests/TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj --verbosity normal # Run specific test class -dotnet test TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj --filter "FullyQualifiedName~PlaceholderVisitorTests" +dotnet test tests/TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj --filter "FullyQualifiedName~PlaceholderVisitorTests" # Run single test method -dotnet test TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj --filter "FullyQualifiedName~ProcessTemplate_ValidTemplate_ReplacesPlaceholders" +dotnet test tests/TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj --filter "FullyQualifiedName~ProcessTemplate_ValidTemplate_ReplacesPlaceholders" # Run tests with code coverage -dotnet test TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj --collect:"XPlat Code Coverage" +dotnet test tests/TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj --collect:"XPlat Code Coverage" ``` ### Pre-Push Checks @@ -92,26 +98,26 @@ dotnet format --no-restore LibreOffice is **not** run on CI (single maintainer; the extra runner cost/flakiness isn't worth it — decided in #218). Instead these tests are a **required local step**: -- **when:** every change touching OpenDocument code (`TriasDev.Templify/OpenDocument/**`, `OdtTemplateProcessor`, +- **when:** every change touching OpenDocument code (`src/TriasDev.Templify/OpenDocument/**`, `OdtTemplateProcessor`, `TemplateProcessor`/format detection) or the shared engine, **and before merging every release PR**; - **how:** LibreOffice must be installed (macOS: `/Applications/LibreOffice.app`; elsewhere set `TEMPLIFY_SOFFICE`): ```bash -dotnet test TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj -c Release -f net10.0 --filter "Category=LibreOffice" +dotnet test tests/TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj -c Release -f net10.0 --filter "Category=LibreOffice" ``` - all tests must **pass with 0 skipped** (a skip means `soffice` was not found — that is not a pass). Mention the result in the PR description (e.g. "LibreOffice round trips: 15/15 passed"). - On CI these tests are skipped automatically. CI still covers LibreOffice-*produced* input through the committed - fixtures in `TriasDev.Templify.Tests/Odt/Fixtures/`. + fixtures in `tests/TriasDev.Templify.Tests/Odt/Fixtures/`. ### Benchmarking ```bash # Run all benchmarks -dotnet run --project TriasDev.Templify.Benchmarks/TriasDev.Templify.Benchmarks.csproj -c Release +dotnet run --project benchmarks/TriasDev.Templify.Benchmarks/TriasDev.Templify.Benchmarks.csproj -c Release # Run specific benchmark class -dotnet run --project TriasDev.Templify.Benchmarks/TriasDev.Templify.Benchmarks.csproj -c Release -- --filter *PlaceholderBenchmarks* +dotnet run --project benchmarks/TriasDev.Templify.Benchmarks/TriasDev.Templify.Benchmarks.csproj -c Release -- --filter *PlaceholderBenchmarks* ``` Benchmarks throw if `ProcessTemplate` fails (`BenchmarkGuard`), so failures cannot look fast. `ConditionEngineBenchmarks` @@ -121,14 +127,14 @@ covers the condition engine (`in`, `contains`, `exists`, `is empty`, grouping, ` ### Running Applications ```bash # Run demo application (writes to ./output; process your own files with --template/--data) -dotnet run --project TriasDev.Templify.Demo/TriasDev.Templify.Demo.csproj -dotnet run --project TriasDev.Templify.Demo/TriasDev.Templify.Demo.csproj -- --template my.docx --data my.json +dotnet run --project samples/TriasDev.Templify.Demo/TriasDev.Templify.Demo.csproj +dotnet run --project samples/TriasDev.Templify.Demo/TriasDev.Templify.Demo.csproj -- --template my.docx --data my.json # Regenerate documentation examples (examples/, docs/images/examples/) -dotnet run --project TriasDev.Templify.DocumentGenerator -- --skip-images +dotnet run --project tools/TriasDev.Templify.DocumentGenerator -- --skip-images # Run converter CLI (full command) -dotnet run --project TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- [command] [arguments] +dotnet run --project tools/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- [command] [arguments] # Run converter CLI (using helper scripts - recommended) ./scripts/analyze.sh template.docx @@ -137,14 +143,14 @@ dotnet run --project TriasDev.Templify.Converter/TriasDev.Templify.Converter.csp ./scripts/clean.sh template.docx # Run GUI application -dotnet run --project TriasDev.Templify.Gui/TriasDev.Templify.Gui.csproj +dotnet run --project tools/TriasDev.Templify.Gui/TriasDev.Templify.Gui.csproj ``` ### Converter CLI Tool The converter tool helps migrate OpenXMLTemplates documents to Templify format. -**Location:** `TriasDev.Templify.Converter/` +**Location:** `tools/TriasDev.Templify.Converter/` **Available Commands:** ```bash @@ -180,15 +186,15 @@ Testing converter changes: ``` Adding new conversion logic: -1. Modify converters in `TriasDev.Templify.Converter/Converters/` -2. Update analyzers in `TriasDev.Templify.Converter/Analyzers/` if needed +1. Modify converters in `tools/TriasDev.Templify.Converter/Converters/` +2. Update analyzers in `tools/TriasDev.Templify.Converter/Analyzers/` if needed 3. Test with various OpenXMLTemplates formats 4. Update converter README with new capabilities Debugging converter issues: ```bash # Use full command for more control -dotnet run --project TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- analyze template.docx --output debug-report.md +dotnet run --project tools/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- analyze template.docx --output debug-report.md # Review generated reports cat template-analysis-report.md @@ -203,12 +209,12 @@ cat template-templify-conversion-report.md - `Models/` - Data structures for analysis results **Documentation:** -- 📖 [Full Converter Documentation](TriasDev.Templify.Converter/README.md) +- 📖 [Full Converter Documentation](tools/TriasDev.Templify.Converter/README.md) - 📜 [Script Usage Guide](scripts/README.md) ## Architecture & Code Organization -See `TriasDev.Templify/ARCHITECTURE.md` for the full description. Summary: +See `src/TriasDev.Templify/ARCHITECTURE.md` for the full description. Summary: ### Visitor Pattern Pipeline @@ -289,7 +295,7 @@ Design: `docs/superpowers/specs/2026-09-26-odt-support-design.md`. after cloning), `OdtDocumentProperties` (`meta.xml`), `OdtTemplateValidator`. - **Known gaps (documented):** loop-cloned bookmarks are not renamed, whitespace collapses after removals, row spans are not adjusted, `UpdateFieldsOnOpen` does not apply, comments are not processed, `.fodt` is unsupported. -- **Tests:** `TriasDev.Templify.Tests/Odt/` (one class per feature). The helpers are `Helpers/OdtDocumentBuilder` and +- **Tests:** `tests/TriasDev.Templify.Tests/Odt/` (one class per feature). The helpers are `Helpers/OdtDocumentBuilder` and `OdtDocumentVerifier` (the verifier checks the package structure). LibreOffice round trips use `[Trait("Category", "LibreOffice")]` and run only when `soffice` is found (macOS default path, `PATH` or `TEMPLIFY_SOFFICE`). Otherwise they are skipped. Facade tests: `Core/TemplateProcessorTests.cs`. @@ -580,7 +586,7 @@ When adding new features: ### Public API Compatibility (hard rule) The library has external consumers. **Do not change, remove or rename public API** (types, members, signatures, namespaces) as a side effect of a fix or refactoring. -- Public API is tracked in `TriasDev.Templify/PublicAPI.Shipped.txt` / `PublicAPI.Unshipped.txt`; the build fails on undeclared additions (RS0016) or removals/changes (RS0017). `dotnet pack` validates against the last released package (`PackageValidationBaselineVersion`). +- Public API is tracked in `src/TriasDev.Templify/PublicAPI.Shipped.txt` / `PublicAPI.Unshipped.txt`; the build fails on undeclared additions (RS0016) or removals/changes (RS0017). `dotnet pack` validates against the last released package (`PackageValidationBaselineVersion`). - New public API → add it to `PublicAPI.Unshipped.txt` deliberately. Prefer `internal` unless the symbol is meant for consumers. - Retire API with `[Obsolete]`; remove only in a major version. - Behavior changes that alter output of existing templates are also potentially breaking: call them out, and make them opt-in via an option when they are not clearly bug fixes. @@ -638,10 +644,10 @@ Check `MissingVariableBehavior` in options: ## Additional Documentation For comprehensive information, see: -- **TriasDev.Templify/ARCHITECTURE.md** - Current design: pipeline, walker, visitors, condition engine, error model -- **README.md** (root) and **TriasDev.Templify/README.md** (NuGet readme) - User-facing overview, API reference -- **TriasDev.Templify/Examples.md** - Extensive code samples and use cases -- **TriasDev.Templify/PERFORMANCE.md** - Historical benchmark snapshot +- **src/TriasDev.Templify/ARCHITECTURE.md** - Current design: pipeline, walker, visitors, condition engine, error model +- **README.md** (root) and **src/TriasDev.Templify/README.md** (NuGet readme) - User-facing overview, API reference +- **src/TriasDev.Templify/Examples.md** - Extensive code samples and use cases +- **src/TriasDev.Templify/PERFORMANCE.md** - Historical benchmark snapshot - **docs/** - Documentation site (MkDocs, `mkdocs.yml`; build with `pip install -r requirements.txt && mkdocs build --strict`) - **docs/archive/** - Historical planning documents (TODO, REFACTORING, DOCUMENTATION_PLAN/SYSTEM), not maintained, not published - **CONTRIBUTING.md** - Contribution workflow, release-please, public API rules diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 36d0962..2ecd028 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -212,13 +212,13 @@ git clone https://github.com/TriasDev/templify.git cd templify # Restore dependencies -dotnet restore templify.sln +dotnet restore templify.slnx # Build the solution -dotnet build templify.sln +dotnet build templify.slnx # Run tests -dotnet test TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj +dotnet test tests/TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj # Run tests with coverage dotnet test --collect:"XPlat Code Coverage" @@ -228,10 +228,10 @@ dotnet test --collect:"XPlat Code Coverage" - **Shared settings** live in `Directory.Build.props` (nullable, analyzers, code style in build). Nullable warnings are always errors. - **CI builds treat all warnings as errors** (`ContinuousIntegrationBuild=true` on GitHub Actions). Reproduce locally with - `dotnet build templify.sln -c Release -p:ContinuousIntegrationBuild=true`. + `dotnet build templify.slnx -c Release -p:ContinuousIntegrationBuild=true`. - **Central package management:** all NuGet versions are in `Directory.Packages.props`; `PackageReference` items have no `Version`. - **Lock files:** every project has a committed `packages.lock.json`, and CI restores in locked mode (`RestoreLockedMode`). - After adding or updating a package, run `dotnet restore templify.sln` and commit the updated lock files, otherwise CI fails. + After adding or updating a package, run `dotnet restore templify.slnx` and commit the updated lock files, otherwise CI fails. ### Pre-Push Checks @@ -239,10 +239,10 @@ Run these before pushing; CI runs the same checks: ```bash # Build like CI (warnings are errors) -dotnet build templify.sln -c Release -p:ContinuousIntegrationBuild=true +dotnet build templify.slnx -c Release -p:ContinuousIntegrationBuild=true # Run all tests -dotnet test templify.sln -c Release --no-build +dotnet test templify.slnx -c Release --no-build # Check formatting (must report no changes) dotnet format --verify-no-changes --no-restore @@ -255,33 +255,43 @@ dotnet format --no-restore ``` templify/ -├── TriasDev.Templify/ # Core library (NuGet package) -├── TriasDev.Templify.Tests/ # Core library tests -├── TriasDev.Templify.Converter/ # CLI converter (OpenXMLTemplates → Templify) -├── TriasDev.Templify.Converter.Tests/ # Converter tests -├── TriasDev.Templify.Gui/ # Avalonia GUI application -├── TriasDev.Templify.Demo/ # Demo console application -├── TriasDev.Templify.DocumentGenerator/ # Generates the example documents used in the docs -├── TriasDev.Templify.Tools.Tests/ # Tests for GUI view models and DocumentGenerator -├── TriasDev.Templify.Benchmarks/ # BenchmarkDotNet performance benchmarks -├── docs/ # Documentation site (MkDocs) -└── scripts/ # Converter helper scripts +├── src/ +│ └── TriasDev.Templify/ # Core library (NuGet package) +├── tests/ +│ ├── TriasDev.Templify.Tests/ # Core library tests +│ ├── TriasDev.Templify.Converter.Tests/ # Converter tests +│ └── TriasDev.Templify.Tools.Tests/ # Tests for GUI view models and DocumentGenerator +├── benchmarks/ +│ └── TriasDev.Templify.Benchmarks/ # BenchmarkDotNet performance benchmarks +├── samples/ +│ └── TriasDev.Templify.Demo/ # Demo console application +├── tools/ +│ ├── TriasDev.Templify.Converter/ # CLI converter (OpenXMLTemplates → Templify) +│ ├── TriasDev.Templify.Gui/ # Avalonia GUI application +│ └── TriasDev.Templify.DocumentGenerator/ # Generates the example documents used in the docs +├── docs/ # Documentation site (MkDocs) +├── scripts/ # Converter helper scripts +└── templify.slnx # Solution (folders mirror the directories) ``` +Build settings are layered as in TriasDev/tabular: the root `Directory.Build.props` applies to every project; +`src/Directory.Build.props` adds package metadata, Source Link and the public API guard, and +`tests/Directory.Build.props` adds the xUnit packages. Package versions are in `Directory.Packages.props`. + ### Running Specific Projects ```bash # Run demo application -dotnet run --project TriasDev.Templify.Demo/TriasDev.Templify.Demo.csproj +dotnet run --project samples/TriasDev.Templify.Demo/TriasDev.Templify.Demo.csproj # Run GUI application -dotnet run --project TriasDev.Templify.Gui/TriasDev.Templify.Gui.csproj +dotnet run --project tools/TriasDev.Templify.Gui/TriasDev.Templify.Gui.csproj # Run benchmarks -dotnet run --project TriasDev.Templify.Benchmarks/TriasDev.Templify.Benchmarks.csproj -c Release +dotnet run --project benchmarks/TriasDev.Templify.Benchmarks/TriasDev.Templify.Benchmarks.csproj -c Release # Run converter tool -dotnet run --project TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- [command] [args] +dotnet run --project tools/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- [command] [args] ``` --- @@ -348,7 +358,7 @@ All contributions must include tests. Aim for full coverage of new code, includi every change to OpenDocument code or the shared engine, and before every release: ```bash -dotnet test TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj -c Release -f net10.0 --filter "Category=LibreOffice" +dotnet test tests/TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj -c Release -f net10.0 --filter "Category=LibreOffice" ``` They need LibreOffice installed (macOS default path is detected; otherwise set `TEMPLIFY_SOFFICE` to the `soffice` @@ -358,12 +368,12 @@ description. **Testing Guidelines:** 1. **Unit Tests** - Test individual components in isolation - - Location: `TriasDev.Templify.Tests/` + - Location: `tests/TriasDev.Templify.Tests/` - Use xUnit framework - Mock dependencies where appropriate 2. **Integration Tests** - Test end-to-end scenarios - - Location: `TriasDev.Templify.Tests/Integration/` + - Location: `tests/TriasDev.Templify.Tests/Integration/` - Process actual Word documents - Verify output using `DocumentVerifier` helper @@ -387,7 +397,7 @@ description. - Cover every new branch; CI uploads coverage to Codecov - Run locally: `dotnet test --collect:"XPlat Code Coverage"` -**Example Test** (helpers in `TriasDev.Templify.Tests/Helpers/`: `DocumentBuilder` builds a template, +**Example Test** (helpers in `tests/TriasDev.Templify.Tests/Helpers/`: `DocumentBuilder` builds a template, `TemplateTestHarness` processes it with invariant-culture options, `DocumentVerifier` inspects the output): ```csharp [Fact] @@ -415,8 +425,8 @@ public void ProcessTemplate_ValidTemplate_ReplacesPlaceholders() Templify is published on NuGet and used by external consumers. **Public API changes must never happen by accident.** Two automated guards enforce this: -1. **Public API analyzer** (`Microsoft.CodeAnalysis.PublicApiAnalyzers`). Every public symbol of `TriasDev.Templify` is listed in `TriasDev.Templify/PublicAPI.Shipped.txt` (released) or `PublicAPI.Unshipped.txt` (not yet released). The build fails when: - - a new public symbol is not declared (**RS0016**). Add it to `PublicAPI.Unshipped.txt`; the IDE code fix does this for you, or run `dotnet format analyzers TriasDev.Templify/TriasDev.Templify.csproj --diagnostics RS0016 --severity info`. +1. **Public API analyzer** (`Microsoft.CodeAnalysis.PublicApiAnalyzers`). Every public symbol of `TriasDev.Templify` is listed in `src/TriasDev.Templify/PublicAPI.Shipped.txt` (released) or `PublicAPI.Unshipped.txt` (not yet released). The build fails when: + - a new public symbol is not declared (**RS0016**). Add it to `PublicAPI.Unshipped.txt`; the IDE code fix does this for you, or run `dotnet format analyzers src/TriasDev.Templify/TriasDev.Templify.csproj --diagnostics RS0016 --severity info`. - a declared symbol was removed, renamed, or its signature changed (**RS0017**). This is a breaking change; see below. 2. **Package validation** (`EnablePackageValidation`). `dotnet pack` compares the package against the last released version (`PackageValidationBaselineVersion` in the csproj) for every target framework and fails on binary-breaking changes (**CP0002** and similar). @@ -481,9 +491,9 @@ Update documentation when you: **Repository Documentation:** - **[README.md](README.md)** - Project overview, getting started -- **[TriasDev.Templify/README.md](TriasDev.Templify/README.md)** - API reference, usage guide -- **[TriasDev.Templify/Examples.md](TriasDev.Templify/Examples.md)** - Comprehensive code examples -- **[TriasDev.Templify/ARCHITECTURE.md](TriasDev.Templify/ARCHITECTURE.md)** - Design patterns, technical decisions +- **[src/TriasDev.Templify/README.md](src/TriasDev.Templify/README.md)** - API reference, usage guide +- **[src/TriasDev.Templify/Examples.md](src/TriasDev.Templify/Examples.md)** - Comprehensive code examples +- **[src/TriasDev.Templify/ARCHITECTURE.md](src/TriasDev.Templify/ARCHITECTURE.md)** - Design patterns, technical decisions - **[CLAUDE.md](CLAUDE.md)** - Development guide for contributors **User Documentation (docs/ folder, published at https://triasdev.github.io/templify/):** @@ -550,7 +560,7 @@ mkdocs build --strict changes, dropped target frameworks, security notes) are added to the release PR body **and** to `CHANGELOG.md` in the release branch right before merging it — a later push to `main` regenerates the release PR and discards such edits. - release-please keeps a release PR open that bumps the version (`.release-please-manifest.json` and `` in - `TriasDev.Templify/TriasDev.Templify.csproj`) and updates the changelog. Merging it creates the tag and GitHub release, + `src/TriasDev.Templify/TriasDev.Templify.csproj`) and updates the changelog. Merging it creates the tag and GitHub release, which triggers the NuGet publish workflow. - **Before merging a release PR:** run the LibreOffice round-trip tests locally (see Testing Requirements) and make sure the release PR's CI is green (update its branch first — release-please pushes do not trigger CI). @@ -566,9 +576,9 @@ mkdocs build --strict ### Helpful Documentation - **[CLAUDE.md](CLAUDE.md)** - Comprehensive development guide -- **[ARCHITECTURE.md](TriasDev.Templify/ARCHITECTURE.md)** - Architecture and design patterns -- **[PERFORMANCE.md](TriasDev.Templify/PERFORMANCE.md)** - Performance considerations -- **[Examples.md](TriasDev.Templify/Examples.md)** - Extensive code examples +- **[ARCHITECTURE.md](src/TriasDev.Templify/ARCHITECTURE.md)** - Architecture and design patterns +- **[PERFORMANCE.md](src/TriasDev.Templify/PERFORMANCE.md)** - Performance considerations +- **[Examples.md](src/TriasDev.Templify/Examples.md)** - Extensive code examples ### Getting Help diff --git a/Directory.Build.props b/Directory.Build.props index 31be258..f1b3991 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,7 @@ - + enable enable diff --git a/README.md b/README.md index 4b8d307..4c1c906 100644 --- a/README.md +++ b/README.md @@ -117,7 +117,7 @@ dotnet add package TriasDev.Templify 3. **Done!** Open `output.docx` and see the result. -The output stream must be readable, writable and seekable (`File.Create` or a `MemoryStream`). There are also overloads for files (`ProcessTemplateFile`), byte arrays, `IReadOnlyDictionary` data and JSON strings; see the [library documentation](TriasDev.Templify/README.md#api-reference). +The output stream must be readable, writable and seekable (`File.Create` or a `MemoryStream`). There are also overloads for files (`ProcessTemplateFile`), byte arrays, `IReadOnlyDictionary` data and JSON strings; see the [library documentation](src/TriasDev.Templify/README.md#api-reference). ### LibreOffice / OpenDocument Templates @@ -247,10 +247,10 @@ bool r4 = context.Evaluate("Status in (\"Active\", \"Pending\")"); - **For template authors:** [Getting Started](https://triasdev.github.io/templify/for-template-authors/getting-started/), [Template Syntax](https://triasdev.github.io/templify/for-template-authors/template-syntax/), [Format Specifiers](https://triasdev.github.io/templify/for-template-authors/format-specifiers/), [LibreOffice / OpenDocument](https://triasdev.github.io/templify/for-template-authors/libreoffice/) - **For developers:** [Quick Start](https://triasdev.github.io/templify/for-developers/quick-start/), [OpenDocument (.odt)](https://triasdev.github.io/templify/for-developers/opendocument/), [Text Templates](https://triasdev.github.io/templify/for-developers/text-templates/), [Processing Warnings](https://triasdev.github.io/templify/for-developers/processing-warnings/) - **[Tutorials](https://triasdev.github.io/templify/tutorials/)** and **[FAQ](https://triasdev.github.io/templify/FAQ/)** -- **[Library README](TriasDev.Templify/README.md)** - Feature and API reference (also shown on NuGet) -- **[Examples.md](TriasDev.Templify/Examples.md)** - Extensive code samples and use cases -- **[ARCHITECTURE.md](TriasDev.Templify/ARCHITECTURE.md)** - Design and implementation -- **[PERFORMANCE.md](TriasDev.Templify/PERFORMANCE.md)** - Benchmarks +- **[Library README](src/TriasDev.Templify/README.md)** - Feature and API reference (also shown on NuGet) +- **[Examples.md](src/TriasDev.Templify/Examples.md)** - Extensive code samples and use cases +- **[ARCHITECTURE.md](src/TriasDev.Templify/ARCHITECTURE.md)** - Design and implementation +- **[PERFORMANCE.md](src/TriasDev.Templify/PERFORMANCE.md)** - Benchmarks - **[CHANGELOG.md](CHANGELOG.md)** - Release history --- @@ -259,18 +259,24 @@ bool r4 = context.Evaluate("Status in (\"Active\", \"Pending\")"); ``` templify/ -├── TriasDev.Templify/ # Core library (net8.0, net9.0, net10.0), published to NuGet -├── TriasDev.Templify.Tests/ # xUnit tests for the core library (run on all library TFMs) -├── TriasDev.Templify.Converter/ # CLI tool: migrate OpenXMLTemplates documents to Templify -├── TriasDev.Templify.Converter.Tests/ # Tests for the converter -├── TriasDev.Templify.Gui/ # Cross-platform desktop app for trying templates (Avalonia) -├── TriasDev.Templify.Demo/ # Demo console application -├── TriasDev.Templify.DocumentGenerator/# Generates the example templates and outputs used in the docs -├── TriasDev.Templify.Tools.Tests/ # Tests for the GUI and the document generator -├── TriasDev.Templify.Benchmarks/ # Performance benchmarks (BenchmarkDotNet) -├── docs/ # Documentation site (MkDocs) -├── examples/ # Example templates and generated outputs -└── scripts/ # Helper scripts for the converter +├── src/ +│ └── TriasDev.Templify/ # Core library (net8.0, net9.0, net10.0), published to NuGet +├── tests/ +│ ├── TriasDev.Templify.Tests/ # xUnit tests for the core library (run on all library TFMs) +│ ├── TriasDev.Templify.Converter.Tests/ # Tests for the converter +│ └── TriasDev.Templify.Tools.Tests/ # Tests for the GUI and the document generator +├── benchmarks/ +│ └── TriasDev.Templify.Benchmarks/ # Performance benchmarks (BenchmarkDotNet) +├── samples/ +│ └── TriasDev.Templify.Demo/ # Demo console application +├── tools/ +│ ├── TriasDev.Templify.Converter/ # CLI tool: migrate OpenXMLTemplates documents to Templify +│ ├── TriasDev.Templify.Gui/ # Cross-platform desktop app for trying templates (Avalonia) +│ └── TriasDev.Templify.DocumentGenerator/ # Generates the example templates and outputs used in the docs +├── docs/ # Documentation site (MkDocs) +├── examples/ # Example templates and generated outputs +├── scripts/ # Helper scripts for the converter +└── templify.slnx # Solution (folders mirror the directories) ``` ## Projects @@ -282,17 +288,17 @@ The template processing library: `DocumentTemplateProcessor` for Word documents, **Target:** net8.0, net9.0, net10.0 ([support policy](#supported-net-versions)) **Dependency:** DocumentFormat.OpenXml 3.5.1 -📖 [Library Documentation](TriasDev.Templify/README.md) | 🏗️ [Architecture](TriasDev.Templify/ARCHITECTURE.md) | 📝 [Code Examples](TriasDev.Templify/Examples.md) +📖 [Library Documentation](src/TriasDev.Templify/README.md) | 🏗️ [Architecture](src/TriasDev.Templify/ARCHITECTURE.md) | 📝 [Code Examples](src/TriasDev.Templify/Examples.md) ### 🖥️ GUI Application Cross-platform desktop application (Avalonia) to load a template (`.docx`, `.odt` or `.ott`) and JSON data, process the template with Templify, and preview and save the result. ```bash -dotnet run --project TriasDev.Templify.Gui/TriasDev.Templify.Gui.csproj +dotnet run --project tools/TriasDev.Templify.Gui/TriasDev.Templify.Gui.csproj ``` -See the [GUI README](TriasDev.Templify.Gui/README.md). +See the [GUI README](tools/TriasDev.Templify.Gui/README.md). ### 🔧 CLI Converter Tool @@ -300,7 +306,7 @@ Command-line tool for migrating OpenXMLTemplates documents (content controls) to ```bash # Full command -dotnet run --project TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- [options] +dotnet run --project tools/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- [options] # Or use the helper scripts ./scripts/.sh [options] # macOS/Linux @@ -333,16 +339,16 @@ The converter translates OpenXMLTemplates content control tags to Templify synta | `conditionalRemove_Count_gt_0` | `{{#if Count > 0}}...{{/if}}` | | `repeating_LineItems` | `{{#foreach LineItems}}...{{/foreach}}` | -📖 **[Converter Documentation](TriasDev.Templify.Converter/README.md)** | 📜 **[Script Usage Guide](scripts/README.md)** +📖 **[Converter Documentation](tools/TriasDev.Templify.Converter/README.md)** | 📜 **[Script Usage Guide](scripts/README.md)** ### 🎯 Demo Application Console application that builds a template covering all features, processes it and writes template and output to `./output`. It can also process your own files: ```bash -dotnet run --project TriasDev.Templify.Demo/TriasDev.Templify.Demo.csproj -dotnet run --project TriasDev.Templify.Demo/TriasDev.Templify.Demo.csproj -- --template my.docx --data my.json [--output out.docx] -dotnet run --project TriasDev.Templify.Demo/TriasDev.Templify.Demo.csproj -- --template my.odt --data my.json # LibreOffice / OpenDocument +dotnet run --project samples/TriasDev.Templify.Demo/TriasDev.Templify.Demo.csproj +dotnet run --project samples/TriasDev.Templify.Demo/TriasDev.Templify.Demo.csproj -- --template my.docx --data my.json [--output out.docx] +dotnet run --project samples/TriasDev.Templify.Demo/TriasDev.Templify.Demo.csproj -- --template my.odt --data my.json # LibreOffice / OpenDocument ``` ### ⚡ Benchmarks @@ -350,10 +356,10 @@ dotnet run --project TriasDev.Templify.Demo/TriasDev.Templify.Demo.csproj -- --t Performance tests with BenchmarkDotNet (placeholders, conditionals, loops, condition engine, complex scenarios): ```bash -dotnet run --project TriasDev.Templify.Benchmarks/TriasDev.Templify.Benchmarks.csproj -c Release +dotnet run --project benchmarks/TriasDev.Templify.Benchmarks/TriasDev.Templify.Benchmarks.csproj -c Release ``` -📊 [Performance Details](TriasDev.Templify/PERFORMANCE.md) +📊 [Performance Details](src/TriasDev.Templify/PERFORMANCE.md) --- @@ -372,26 +378,26 @@ git clone https://github.com/TriasDev/templify.git cd templify # Build (Debug); CI builds with warnings as errors: -dotnet build templify.sln -dotnet build templify.sln -c Release -p:ContinuousIntegrationBuild=true +dotnet build templify.slnx +dotnet build templify.slnx -c Release -p:ContinuousIntegrationBuild=true # Run the core tests (all target frameworks, or one with --framework net10.0) -dotnet test TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj +dotnet test tests/TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj # Run all test projects -dotnet test templify.sln +dotnet test templify.slnx # Run specific tests -dotnet test TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj --filter "FullyQualifiedName~PlaceholderVisitorTests" +dotnet test tests/TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj --filter "FullyQualifiedName~PlaceholderVisitorTests" # Coverage -dotnet test TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj --collect:"XPlat Code Coverage" +dotnet test tests/TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj --collect:"XPlat Code Coverage" # Formatting check (required before pushing) dotnet format --verify-no-changes --no-restore ``` -NuGet versions are managed centrally in `Directory.Packages.props`, and every project has a committed `packages.lock.json`. After changing a package, run `dotnet restore templify.sln` and commit the updated lock files. +NuGet versions are managed centrally in `Directory.Packages.props`, and every project has a committed `packages.lock.json`. After changing a package, run `dotnet restore templify.slnx` and commit the updated lock files. ### Build the Documentation @@ -405,7 +411,7 @@ mkdocs build --strict # what CI builds - Read the **[Contributing Guide](CONTRIBUTING.md)** and the **[Code of Conduct](CODE_OF_CONDUCT.md)** - Add tests for new features and bug fixes, and update the documentation -- Public API changes are tracked in `TriasDev.Templify/PublicAPI.Unshipped.txt` +- Public API changes are tracked in `src/TriasDev.Templify/PublicAPI.Unshipped.txt` - **[CLAUDE.md](CLAUDE.md)** has development workflows and architecture notes for AI-assisted coding ## Requirements @@ -436,13 +442,13 @@ Processing order: **Conditionals → Loops → Placeholders** (enables condition OpenDocument templates are processed by a separate engine (`TriasDev.Templify.OpenDocument`) with the same processing order and semantics. It reuses the condition engine, placeholder resolution, value conversion and markdown parsing, and leaves the Word pipeline untouched. -🏗️ [Full Architecture Documentation](TriasDev.Templify/ARCHITECTURE.md) +🏗️ [Full Architecture Documentation](src/TriasDev.Templify/ARCHITECTURE.md) ## About **Templify** is created and maintained by **TriasDev GmbH & Co. KG**. It is used in production, processing thousands of documents daily. We believe in giving back to the .NET community and providing a modern, maintainable alternative to legacy Word templating solutions. -**Related project:** OpenXMLTemplates (predecessor, content-control based); the [converter](TriasDev.Templify.Converter/README.md) migrates its templates. +**Related project:** OpenXMLTemplates (predecessor, content-control based); the [converter](tools/TriasDev.Templify.Converter/README.md) migrates its templates. ## Contributing diff --git a/TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj b/TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj deleted file mode 100644 index 2c16d97..0000000 --- a/TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj +++ /dev/null @@ -1,37 +0,0 @@ - - - - - net10.0;net9.0;net8.0 - false - - Exe - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - - - - diff --git a/TriasDev.Templify.Tools.Tests/TriasDev.Templify.Tools.Tests.csproj b/TriasDev.Templify.Tools.Tests/TriasDev.Templify.Tools.Tests.csproj deleted file mode 100644 index 6efc407..0000000 --- a/TriasDev.Templify.Tools.Tests/TriasDev.Templify.Tools.Tests.csproj +++ /dev/null @@ -1,32 +0,0 @@ - - - - net10.0 - false - - Exe - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - diff --git a/TriasDev.Templify.Benchmarks/BenchmarkDocumentBuilder.cs b/benchmarks/TriasDev.Templify.Benchmarks/BenchmarkDocumentBuilder.cs similarity index 100% rename from TriasDev.Templify.Benchmarks/BenchmarkDocumentBuilder.cs rename to benchmarks/TriasDev.Templify.Benchmarks/BenchmarkDocumentBuilder.cs diff --git a/TriasDev.Templify.Benchmarks/BenchmarkGuard.cs b/benchmarks/TriasDev.Templify.Benchmarks/BenchmarkGuard.cs similarity index 100% rename from TriasDev.Templify.Benchmarks/BenchmarkGuard.cs rename to benchmarks/TriasDev.Templify.Benchmarks/BenchmarkGuard.cs diff --git a/TriasDev.Templify.Benchmarks/ComplexScenarioBenchmarks.cs b/benchmarks/TriasDev.Templify.Benchmarks/ComplexScenarioBenchmarks.cs similarity index 100% rename from TriasDev.Templify.Benchmarks/ComplexScenarioBenchmarks.cs rename to benchmarks/TriasDev.Templify.Benchmarks/ComplexScenarioBenchmarks.cs diff --git a/TriasDev.Templify.Benchmarks/ConditionEngineBenchmarks.cs b/benchmarks/TriasDev.Templify.Benchmarks/ConditionEngineBenchmarks.cs similarity index 100% rename from TriasDev.Templify.Benchmarks/ConditionEngineBenchmarks.cs rename to benchmarks/TriasDev.Templify.Benchmarks/ConditionEngineBenchmarks.cs diff --git a/TriasDev.Templify.Benchmarks/ConditionalBenchmarks.cs b/benchmarks/TriasDev.Templify.Benchmarks/ConditionalBenchmarks.cs similarity index 100% rename from TriasDev.Templify.Benchmarks/ConditionalBenchmarks.cs rename to benchmarks/TriasDev.Templify.Benchmarks/ConditionalBenchmarks.cs diff --git a/TriasDev.Templify.Benchmarks/LoopBenchmarks.cs b/benchmarks/TriasDev.Templify.Benchmarks/LoopBenchmarks.cs similarity index 100% rename from TriasDev.Templify.Benchmarks/LoopBenchmarks.cs rename to benchmarks/TriasDev.Templify.Benchmarks/LoopBenchmarks.cs diff --git a/TriasDev.Templify.Benchmarks/PlaceholderBenchmarks.cs b/benchmarks/TriasDev.Templify.Benchmarks/PlaceholderBenchmarks.cs similarity index 100% rename from TriasDev.Templify.Benchmarks/PlaceholderBenchmarks.cs rename to benchmarks/TriasDev.Templify.Benchmarks/PlaceholderBenchmarks.cs diff --git a/TriasDev.Templify.Benchmarks/Program.cs b/benchmarks/TriasDev.Templify.Benchmarks/Program.cs similarity index 100% rename from TriasDev.Templify.Benchmarks/Program.cs rename to benchmarks/TriasDev.Templify.Benchmarks/Program.cs diff --git a/TriasDev.Templify.Benchmarks/TriasDev.Templify.Benchmarks.csproj b/benchmarks/TriasDev.Templify.Benchmarks/TriasDev.Templify.Benchmarks.csproj similarity index 75% rename from TriasDev.Templify.Benchmarks/TriasDev.Templify.Benchmarks.csproj rename to benchmarks/TriasDev.Templify.Benchmarks/TriasDev.Templify.Benchmarks.csproj index fcc1e0b..a817720 100644 --- a/TriasDev.Templify.Benchmarks/TriasDev.Templify.Benchmarks.csproj +++ b/benchmarks/TriasDev.Templify.Benchmarks/TriasDev.Templify.Benchmarks.csproj @@ -10,7 +10,7 @@ - + diff --git a/TriasDev.Templify.Benchmarks/packages.lock.json b/benchmarks/TriasDev.Templify.Benchmarks/packages.lock.json similarity index 100% rename from TriasDev.Templify.Benchmarks/packages.lock.json rename to benchmarks/TriasDev.Templify.Benchmarks/packages.lock.json diff --git a/docs/FAQ.md b/docs/FAQ.md index c9fbb77..a2b0b8f 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -48,7 +48,7 @@ Or in Visual Studio: `Install-Package TriasDev.Templify` 1. [Quick Start Guide](for-developers/quick-start.md) (5 minutes) 2. [Tutorial 1: Hello World](tutorials/01-hello-world.md) (30 min) 3. [Tutorial 2: Invoice Generator](tutorials/02-invoice-generator.md) (1 hour) -4. [Template Syntax](for-template-authors/template-syntax.md) and the [library README](https://github.com/TriasDev/templify/blob/main/TriasDev.Templify/README.md) +4. [Template Syntax](for-template-authors/template-syntax.md) and the [library README](https://github.com/TriasDev/templify/blob/main/src/TriasDev.Templify/README.md) ### Q: Do I need Microsoft Word installed? @@ -122,7 +122,7 @@ In ASP.NET Core, buffer uploaded templates asynchronously before processing (see **A:** **Yes!** Templify is designed for performance: - The whole document is loaded into memory, so it is not suited for documents larger than ~50 MB - Processing time grows linearly with the size of the document and the data -- See the [performance notes](https://github.com/TriasDev/templify/blob/main/TriasDev.Templify/PERFORMANCE.md) (a benchmark snapshot) +- See the [performance notes](https://github.com/TriasDev/templify/blob/main/src/TriasDev.Templify/PERFORMANCE.md) (a benchmark snapshot) ### Q: Does Templify support tables? @@ -557,7 +557,7 @@ otherwise). Symbol-based formatters (`checkbox`, `checkmark` and its alias `chec ### Q: How fast is Templify? **A:** Typical templates are processed in milliseconds; processing time grows linearly with document and data -size. See the [performance notes](https://github.com/TriasDev/templify/blob/main/TriasDev.Templify/PERFORMANCE.md) for a benchmark snapshot, and run +size. See the [performance notes](https://github.com/TriasDev/templify/blob/main/src/TriasDev.Templify/PERFORMANCE.md) for a benchmark snapshot, and run `TriasDev.Templify.Benchmarks` for numbers on your hardware. ### Q: Does Templify cache templates? @@ -659,11 +659,11 @@ the formatting of the run where the placeholder starts. 1. **Output not flushed**: Dispose (or flush) the output stream before reading the file; use `using` statements 2. **Reused output stream**: Use a new, empty output stream for each document (the template is copied into it) 3. **Concurrent access**: Don't share streams between threads -4. **Template already corrupted**: Validate the template with the [Converter tool](https://github.com/TriasDev/templify/blob/main/TriasDev.Templify.Converter/README.md) +4. **Template already corrupted**: Validate the template with the [Converter tool](https://github.com/TriasDev/templify/blob/main/tools/TriasDev.Templify.Converter/README.md) **Validate template**: ```bash -dotnet run --project TriasDev.Templify.Converter -- validate template.docx +dotnet run --project tools/TriasDev.Templify.Converter -- validate template.docx ``` ### Q: How do I debug template issues? @@ -733,7 +733,7 @@ ProcessingResult result = processor.ProcessTemplate(templateStream, outputStream `convert` only converts OpenXMLTemplates content controls; other content controls are kept unless you pass `--unwrap-all-controls`. The CLI exits with 0 on success, 1 when the command failed (for example a control that cannot be converted) and 2 for invalid arguments. See the full -[Converter Documentation](https://github.com/TriasDev/templify/blob/main/TriasDev.Templify.Converter/README.md). +[Converter Documentation](https://github.com/TriasDev/templify/blob/main/tools/TriasDev.Templify.Converter/README.md). ### Q: What's the mapping from OpenXMLTemplates? @@ -964,13 +964,13 @@ _metrics.RecordCount("templify.warnings", result.Warnings.Count); ### Community Support - 💬 [GitHub Discussions](https://github.com/TriasDev/templify/discussions) - Ask the community - 🐛 [GitHub Issues](https://github.com/TriasDev/templify/issues) - Report bugs -- 📖 [Library README](https://github.com/TriasDev/templify/blob/main/TriasDev.Templify/README.md) - Complete reference +- 📖 [Library README](https://github.com/TriasDev/templify/blob/main/src/TriasDev.Templify/README.md) - Complete reference ### Documentation - [Quick Start Guide](for-developers/quick-start.md) - [Tutorial Series](tutorials/index.md) -- [Architecture Guide](https://github.com/TriasDev/templify/blob/main/TriasDev.Templify/ARCHITECTURE.md) -- [Examples Collection](https://github.com/TriasDev/templify/blob/main/TriasDev.Templify/Examples.md) +- [Architecture Guide](https://github.com/TriasDev/templify/blob/main/src/TriasDev.Templify/ARCHITECTURE.md) +- [Examples Collection](https://github.com/TriasDev/templify/blob/main/src/TriasDev.Templify/Examples.md) ### Can't Find Your Answer? [Open a discussion](https://github.com/TriasDev/templify/discussions/new) or [create an issue](https://github.com/TriasDev/templify/issues/new) on GitHub. diff --git a/docs/for-developers/quick-start.md b/docs/for-developers/quick-start.md index bf99d23..cc9020c 100644 --- a/docs/for-developers/quick-start.md +++ b/docs/for-developers/quick-start.md @@ -129,7 +129,7 @@ using var outputStream = new MemoryStream(); // a Word output must be readable, ProcessingResult result = processor.ProcessTemplate(templateStream, outputStream, data); ``` -See the [ASP.NET Core examples](https://github.com/TriasDev/templify/blob/main/TriasDev.Templify/Examples.md#web-application-integration). +See the [ASP.NET Core examples](https://github.com/TriasDev/templify/blob/main/src/TriasDev.Templify/Examples.md#web-application-integration). ## Data @@ -446,4 +446,4 @@ var options = new PlaceholderReplacementOptions - 🐛 [Report Issues](https://github.com/TriasDev/templify/issues) - 💬 [Discussions](https://github.com/TriasDev/templify/discussions) -- 📖 [Library README](https://github.com/TriasDev/templify/blob/main/TriasDev.Templify/README.md) +- 📖 [Library README](https://github.com/TriasDev/templify/blob/main/src/TriasDev.Templify/README.md) diff --git a/docs/for-template-authors/boolean-expressions.md b/docs/for-template-authors/boolean-expressions.md index f0ac3e4..488e666 100644 --- a/docs/for-template-authors/boolean-expressions.md +++ b/docs/for-template-authors/boolean-expressions.md @@ -1044,6 +1044,6 @@ Boolean expressions enable powerful inline logic in your templates: For more information, see: - [Format Specifiers Guide](format-specifiers.md) - Format boolean output -- [API Reference](https://github.com/TriasDev/templify/blob/main/TriasDev.Templify/README.md) - Complete API documentation -- [Examples](https://github.com/TriasDev/templify/blob/main/TriasDev.Templify/Examples.md) - More code examples +- [API Reference](https://github.com/TriasDev/templify/blob/main/src/TriasDev.Templify/README.md) - Complete API documentation +- [Examples](https://github.com/TriasDev/templify/blob/main/src/TriasDev.Templify/Examples.md) - More code examples - [FAQ](../FAQ.md) - Common questions diff --git a/docs/for-template-authors/examples-gallery.md b/docs/for-template-authors/examples-gallery.md index 365934d..4b55fd2 100644 --- a/docs/for-template-authors/examples-gallery.md +++ b/docs/for-template-authors/examples-gallery.md @@ -72,7 +72,7 @@ Explore real-world Templify templates with visual examples. Each example include - [conditionals-template.docx](https://github.com/TriasDev/templify/raw/main/examples/templates/conditionals-template.docx) - The Word template file - [conditionals-output.docx](https://github.com/TriasDev/templify/raw/main/examples/outputs/conditionals-output.docx) - The processed result -More templates (advanced conditionals, warning report) are in the [examples folder](https://github.com/TriasDev/templify/tree/main/examples) of the repository. The sample data for each example is defined in the [DocumentGenerator](https://github.com/TriasDev/templify/tree/main/TriasDev.Templify.DocumentGenerator) tool that produces these files. +More templates (advanced conditionals, warning report) are in the [examples folder](https://github.com/TriasDev/templify/tree/main/examples) of the repository. The sample data for each example is defined in the [DocumentGenerator](https://github.com/TriasDev/templify/tree/main/tools/TriasDev.Templify.DocumentGenerator) tool that produces these files. --- @@ -95,7 +95,7 @@ We're working on adding more examples covering: 2. Write a JSON file with matching data (see the output file for the values used) 3. Process the template using: - **GUI Application:** Open Templify GUI, select the template and JSON file, then click **Process Template** - - **Demo app (from the source code):** `dotnet run --project TriasDev.Templify.Demo -- --template template.docx --data data.json --output output.docx` + - **Demo app (from the source code):** `dotnet run --project samples/TriasDev.Templify.Demo -- --template template.docx --data data.json --output output.docx` ### Modify for Your Needs diff --git a/docs/for-template-authors/format-specifiers.md b/docs/for-template-authors/format-specifiers.md index 1ce69b3..bf7fba6 100644 --- a/docs/for-template-authors/format-specifiers.md +++ b/docs/for-template-authors/format-specifiers.md @@ -988,5 +988,5 @@ Format specifiers provide a powerful way to control value presentation in your d For more advanced usage, see: - [Boolean Expressions Guide](boolean-expressions.md) - Combine expressions with formatters -- [API Reference](https://github.com/TriasDev/templify/blob/main/TriasDev.Templify/README.md) - Complete API documentation +- [API Reference](https://github.com/TriasDev/templify/blob/main/src/TriasDev.Templify/README.md) - Complete API documentation - [FAQ](../FAQ.md) - Common questions and answers diff --git a/docs/for-template-authors/getting-started.md b/docs/for-template-authors/getting-started.md index 20cd047..cde5f99 100644 --- a/docs/for-template-authors/getting-started.md +++ b/docs/for-template-authors/getting-started.md @@ -69,7 +69,7 @@ Now you'll combine the template with the data to create the final document. Templify has no installable `templify` command. If you have the [.NET SDK](https://dotnet.microsoft.com/download) and a copy of the [Templify repository](https://github.com/TriasDev/templify), the demo app processes your own files: ```bash -dotnet run --project TriasDev.Templify.Demo -- --template welcome-letter.docx --data data.json --output welcome-letter-final.docx +dotnet run --project samples/TriasDev.Templify.Demo -- --template welcome-letter.docx --data data.json --output welcome-letter-final.docx ``` In most setups, a developer integrates Templify into an application, and you only provide the template and the data. diff --git a/docs/index.md b/docs/index.md index 4463b1b..320152b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -37,8 +37,8 @@ I'm a software developer who wants to use the Templify library in my C# applicat - [Processing Warnings](for-developers/processing-warnings.md) - Missing variables, loop and expression warnings - [Text Template Processing](for-developers/text-templates.md) - Templates for plain text and emails - [Condition Evaluation](for-developers/condition-evaluation.md) - Evaluate conditions without a document -- [Code Examples](https://github.com/TriasDev/templify/blob/main/TriasDev.Templify/Examples.md) - Extensive C# samples (GitHub) -- [Architecture Overview](https://github.com/TriasDev/templify/blob/main/TriasDev.Templify/ARCHITECTURE.md) - How the library works internally (GitHub) +- [Code Examples](https://github.com/TriasDev/templify/blob/main/src/TriasDev.Templify/Examples.md) - Extensive C# samples (GitHub) +- [Architecture Overview](https://github.com/TriasDev/templify/blob/main/src/TriasDev.Templify/ARCHITECTURE.md) - How the library works internally (GitHub) --- diff --git a/docs/superpowers/plans/2026-10-03-project-structure.md b/docs/superpowers/plans/2026-10-03-project-structure.md new file mode 100644 index 0000000..db6c68f --- /dev/null +++ b/docs/superpowers/plans/2026-10-03-project-structure.md @@ -0,0 +1,735 @@ +# Project Structure Aligned with Tabular Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Move Templify's projects into `src/`, `tests/`, `benchmarks/`, `samples/` and `tools/`, replace +`templify.sln` with `templify.slnx`, and split the build props into root, `src/` and `tests/` files, without changing +the shipped package. + +**Architecture:** Pure repository restructuring in one pull request with four logical commits (move → slnx → props → +docs). No library source changes. Every commit builds and passes the tests on its own. + +**Tech Stack:** .NET SDK 10 (`global.json` 10.0.100), MSBuild `Directory.Build.props`, Central Package Management, +xUnit v3 through VSTest, GitHub Actions, release-please, MkDocs. + +**Spec:** `docs/superpowers/specs/2026-10-03-project-structure-design.md` + +## Global Constraints + +- Branch: `chore/project-structure` (the spec is already committed there). +- Public API impact: none. No `.cs` file in `src/TriasDev.Templify` changes; `PublicAPI.*.txt` untouched. +- Package content must stay the same: same files in `.nupkg`/`.snupkg`, same `.nuspec` metadata (except the + repository commit). +- Moves use `git mv` only (history must follow). +- Out of scope: Central Package Management, `packages.lock.json`, VSTest vs MTP, analyzers, Tabular, target + frameworks, package ID, namespaces. +- `Version` and `PackageValidationBaselineVersion` stay in `src/TriasDev.Templify/TriasDev.Templify.csproj`. +- `docs/archive/**` and `docs/superpowers/**` (other than this plan and its spec) are not edited. +- Run all commands from the repository root `/Users/vaceslavustinov/Documents/work/triasdev/templify`. +- Scratch files (baseline packages, test logs) go to + `/private/tmp/claude-501/-Users-vaceslavustinov-Documents-work-triasdev-templify/10f81cd0-4b6d-459a-b6a1-298912a1a9f2/scratchpad` + (written below as `$SCRATCH`; set `SCRATCH=` in each shell). + +## Review Focus + +1. Release pipeline paths (`release-please.yml`, `release-please-config.json`): a wrong path only fails at the next + release → Task 2 Step 6 checks every path in both files exists. +2. Package drift (README, icon, symbols, Source Link lost after moving settings to `src/Directory.Build.props`) → + Task 4 Step 5 compares the package file list and nuspec against the baseline from Task 1. +3. Windows scripts (`scripts/*.cmd`) use backslash paths a `/`-based grep misses → Task 2 Step 5 edits them + explicitly and Step 6 checks the referenced project exists. +4. Test count silently dropping (a test project missing from the solution is just not run) → Task 1 records the + counts, Task 6 Step 2 compares them. +5. DocumentGenerator run from a new working directory no longer finding the repository root → Task 3 test plus + Task 6 Step 5 runs the generator. + +--- + +### Task 1: Baseline + +**Files:** none in the repository (scratch only). + +**Interfaces:** +- Produces: `$SCRATCH/baseline/` with `TriasDev.Templify.1.9.0.nupkg`, `.snupkg`, `files.txt`, `nuspec.xml`, + `tests.txt` (per-project test counts) for Tasks 4 and 6. + +- [ ] **Step 1: Pack the current layout** + +```bash +SCRATCH=/private/tmp/claude-501/-Users-vaceslavustinov-Documents-work-triasdev-templify/10f81cd0-4b6d-459a-b6a1-298912a1a9f2/scratchpad +mkdir -p $SCRATCH/baseline +dotnet pack TriasDev.Templify/TriasDev.Templify.csproj -c Release -p:ContinuousIntegrationBuild=true -o $SCRATCH/baseline +unzip -l $SCRATCH/baseline/TriasDev.Templify.1.9.0.nupkg | awk 'NR>3 {print $4}' | grep -v '^$' | sort > $SCRATCH/baseline/files.txt +unzip -l $SCRATCH/baseline/TriasDev.Templify.1.9.0.snupkg | awk 'NR>3 {print $4}' | grep -v '^$' | sort > $SCRATCH/baseline/symbols.txt +unzip -p $SCRATCH/baseline/TriasDev.Templify.1.9.0.nupkg TriasDev.Templify.nuspec > $SCRATCH/baseline/nuspec.xml +``` + +Expected: pack succeeds (package validation against 1.9.0 passes); `files.txt` lists `README.md`, `icon.png`, +`lib/net8.0/...`, `lib/net9.0/...`, `lib/net10.0/...`. + +- [ ] **Step 2: Record test counts** + +```bash +dotnet test templify.sln -c Release 2>&1 | grep -E "^(Passed|Failed)!" | sed -E 's/Duration: [^-]+- //' | sort > $SCRATCH/baseline/tests.txt +cat $SCRATCH/baseline/tests.txt +``` + +Expected: one `Passed!` line per test assembly and TFM (Templify.Tests ×3, Tools.Tests, Converter.Tests), 0 failed. +LibreOffice tests show as skipped only if `soffice` is missing; note the numbers. + +--- + +### Task 2: Move the projects + +**Files:** +- Move (git mv): the nine project directories (table below) +- Modify: every moved `*.csproj` with a `ProjectReference`, `templify.sln`, `.github/workflows/ci.yml:166`, + `.github/workflows/release-please.yml:61,67,73,93`, `release-please-config.json`, `.gitignore:338,350`, + `scripts/{analyze,clean,convert,validate}.{sh,cmd}`, + `src/TriasDev.Templify/TriasDev.Templify.csproj` (icon path) + +**Interfaces:** +- Produces: the new layout used by every later task: + +| Old | New | +|---|---| +| `TriasDev.Templify/` | `src/TriasDev.Templify/` | +| `TriasDev.Templify.Tests/` | `tests/TriasDev.Templify.Tests/` | +| `TriasDev.Templify.Tools.Tests/` | `tests/TriasDev.Templify.Tools.Tests/` | +| `TriasDev.Templify.Converter.Tests/` | `tests/TriasDev.Templify.Converter.Tests/` | +| `TriasDev.Templify.Benchmarks/` | `benchmarks/TriasDev.Templify.Benchmarks/` | +| `TriasDev.Templify.Demo/` | `samples/TriasDev.Templify.Demo/` | +| `TriasDev.Templify.Converter/` | `tools/TriasDev.Templify.Converter/` | +| `TriasDev.Templify.Gui/` | `tools/TriasDev.Templify.Gui/` | +| `TriasDev.Templify.DocumentGenerator/` | `tools/TriasDev.Templify.DocumentGenerator/` | + +- [ ] **Step 1: Remove stale build output, then move** + +Untracked `bin/`/`obj/` folders would otherwise stay behind in the old directories. + +```bash +git clean -fdX -- 'TriasDev.Templify*/bin' 'TriasDev.Templify*/obj' +mkdir -p src tests benchmarks samples tools +git mv TriasDev.Templify src/TriasDev.Templify +git mv TriasDev.Templify.Tests tests/TriasDev.Templify.Tests +git mv TriasDev.Templify.Tools.Tests tests/TriasDev.Templify.Tools.Tests +git mv TriasDev.Templify.Converter.Tests tests/TriasDev.Templify.Converter.Tests +git mv TriasDev.Templify.Benchmarks benchmarks/TriasDev.Templify.Benchmarks +git mv TriasDev.Templify.Demo samples/TriasDev.Templify.Demo +git mv TriasDev.Templify.Converter tools/TriasDev.Templify.Converter +git mv TriasDev.Templify.Gui tools/TriasDev.Templify.Gui +git mv TriasDev.Templify.DocumentGenerator tools/TriasDev.Templify.DocumentGenerator +ls TriasDev.Templify* 2>&1 # expected: no such file (remaining untracked files, e.g. Demo/output, move by hand) +``` + +If `ls` shows leftover untracked directories (ignored files such as `samples` demo output or `.env`), move their +contents with plain `mv` into the new directory and delete the empty old directory. + +- [ ] **Step 2: Fix project references** + +Every moved project referencing another group needs `..\..\\`: + +```bash +for f in benchmarks/*/*.csproj samples/*/*.csproj tools/*/*.csproj tests/TriasDev.Templify.Tests/*.csproj tests/TriasDev.Templify.Converter.Tests/*.csproj; do + sed -i '' 's#Include="\.\.\\TriasDev\.Templify\\TriasDev\.Templify\.csproj"#Include="..\\..\\src\\TriasDev.Templify\\TriasDev.Templify.csproj"#' "$f" +done +sed -i '' 's#Include="\.\.\\TriasDev\.Templify\.Converter\\#Include="..\\..\\tools\\TriasDev.Templify.Converter\\#' tests/TriasDev.Templify.Converter.Tests/TriasDev.Templify.Converter.Tests.csproj +sed -i '' -e 's#Include="\.\.\\TriasDev\.Templify\.Gui\\#Include="..\\..\\tools\\TriasDev.Templify.Gui\\#' \ + -e 's#Include="\.\.\\TriasDev\.Templify\.DocumentGenerator\\#Include="..\\..\\tools\\TriasDev.Templify.DocumentGenerator\\#' \ + tests/TriasDev.Templify.Tools.Tests/TriasDev.Templify.Tools.Tests.csproj +sed -i '' 's#Include="\.\.\\assets\\icon-128\.png"#Include="..\\..\\assets\\icon-128.png"#' src/TriasDev.Templify/TriasDev.Templify.csproj +git grep -n 'ProjectReference\|assets' -- '*.csproj' +``` + +Expected: every `ProjectReference` starts with `..\..\src\` or `..\..\tools\`; the icon path is `..\..\assets\`. + +- [ ] **Step 3: Update `templify.sln` project paths** + +```bash +sed -i '' -E \ + -e 's#"TriasDev\.Templify\\TriasDev\.Templify\.csproj"#"src\\TriasDev.Templify\\TriasDev.Templify.csproj"#' \ + -e 's#"(TriasDev\.Templify\.(Tests|Tools\.Tests|Converter\.Tests))\\#"tests\\\1\\#' \ + -e 's#"(TriasDev\.Templify\.Benchmarks)\\#"benchmarks\\\1\\#' \ + -e 's#"(TriasDev\.Templify\.Demo)\\#"samples\\\1\\#' \ + -e 's#"(TriasDev\.Templify\.(Converter|Gui|DocumentGenerator))\\#"tools\\\1\\#' \ + templify.sln +grep -n '\.csproj' templify.sln +``` + +Expected: nine project lines, each with its group prefix. + +- [ ] **Step 4: Update CI, release and ignore paths** + +```bash +sed -i '' 's#dotnet pack TriasDev\.Templify/TriasDev\.Templify\.csproj#dotnet pack src/TriasDev.Templify/TriasDev.Templify.csproj#' .github/workflows/ci.yml +sed -i '' -e 's# TriasDev\.Templify/TriasDev\.Templify\.csproj# src/TriasDev.Templify/TriasDev.Templify.csproj#' \ + -e 's# TriasDev\.Templify\.Tests/TriasDev\.Templify\.Tests\.csproj# tests/TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj#' \ + .github/workflows/release-please.yml +sed -i '' 's#"path": "TriasDev\.Templify/TriasDev\.Templify\.csproj"#"path": "src/TriasDev.Templify/TriasDev.Templify.csproj"#' release-please-config.json +sed -i '' 's#^TriasDev\.Templify\.Demo/#samples/TriasDev.Templify.Demo/#' .gitignore +``` + +- [ ] **Step 5: Update converter scripts** + +```bash +sed -i '' 's#\$SCRIPT_DIR/\.\./TriasDev\.Templify\.Converter/#$SCRIPT_DIR/../tools/TriasDev.Templify.Converter/#' scripts/*.sh +sed -i '' 's#%~dp0\.\.\\TriasDev\.Templify\.Converter\\#%~dp0..\\tools\\TriasDev.Templify.Converter\\#' scripts/*.cmd +grep -n 'Converter' scripts/*.sh scripts/*.cmd | grep -- '--project\|dotnet run' +``` + +Expected: all eight scripts point to `../tools/TriasDev.Templify.Converter/` (`..\tools\...` in `.cmd`). + +- [ ] **Step 6: Check that every referenced path exists** + +```bash +for p in $(grep -ohE '(src|tests|tools)/TriasDev\.Templify[A-Za-z.]*/[A-Za-z.]+\.csproj' .github/workflows/*.yml release-please-config.json scripts/*.sh | sort -u) \ + $(grep -ohE '(src|tests|benchmarks|samples|tools)\\TriasDev\.Templify[A-Za-z.]*\\[A-Za-z.]+\.csproj' templify.sln scripts/*.cmd | tr '\\' '/' | sort -u); do + test -f "$p" && echo "ok $p" || echo "MISSING $p" +done +``` + +Expected: only `ok` lines. + +- [ ] **Step 7: Build and test** + +```bash +dotnet restore templify.sln --locked-mode +dotnet build templify.sln -c Release -p:ContinuousIntegrationBuild=true 2>&1 | tail -3 +dotnet test templify.sln -c Release --no-build 2>&1 | grep -E "^(Passed|Failed)!" +``` + +Expected: restore succeeds (lock files unchanged), 0 warnings / 0 errors, same counts as `$SCRATCH/baseline/tests.txt`. + +- [ ] **Step 8: Commit** + +```bash +git add -A +git status --short | grep -v '^R ' | head -30 # expected: only the modified files from Steps 2-5 +git commit -m "chore: move projects into src/, tests/, benchmarks/, samples/ and tools/ (#3)" +``` + +--- + +### Task 3: Replace `templify.sln` with `templify.slnx` + +**Files:** +- Create: `templify.slnx` +- Delete: `templify.sln` +- Modify: `tools/TriasDev.Templify.DocumentGenerator/RepositoryPaths.cs:9,27`, + `tools/TriasDev.Templify.DocumentGenerator/Program.cs:12`, + `tests/TriasDev.Templify.Tools.Tests/DocumentGenerator/ExampleGeneratorSmokeTests.cs:204`, + `.github/workflows/codeql.yml:46`, `.github/workflows/build-sonarqube.yml:75` + +**Interfaces:** +- Consumes: layout from Task 2. +- Produces: `templify.slnx` with solution folders `/src/`, `/tests/`, `/benchmarks/`, `/samples/`, `/tools/`; + `RepositoryPaths.FindRepositoryRoot(string)` keys on `templify.slnx` + `examples/`. + +- [ ] **Step 1: Change the smoke test to expect `templify.slnx`** + +In `tests/TriasDev.Templify.Tools.Tests/DocumentGenerator/ExampleGeneratorSmokeTests.cs` line 204: + +```csharp + Assert.True(File.Exists(Path.Combine(root, "templify.slnx"))); +``` + +- [ ] **Step 2: Create the solution and remove the old one** + +`dotnet sln add` puts each project into solution folders that mirror its directory. + +```bash +dotnet new sln --format slnx --name templify +for p in src/*/*.csproj tests/*/*.csproj benchmarks/*/*.csproj samples/*/*.csproj tools/*/*.csproj; do dotnet sln templify.slnx add "$p"; done +git rm -q templify.sln +cat templify.slnx +``` + +Expected: five `` elements (`/benchmarks/`, `/samples/`, `/src/`, `/tests/`, `/tools/`) holding +nine `` entries. If `dotnet sln add` nests an extra folder per project (e.g. `/src/TriasDev.Templify/`), +edit the file by hand to the flat shape: + +```xml + + + + + + + + + + + + + + + + + + + + + +``` + +- [ ] **Step 3: Run the smoke test to see it fail** + +```bash +dotnet test tests/TriasDev.Templify.Tools.Tests --filter "FullyQualifiedName~ExampleGeneratorSmokeTests" 2>&1 | grep -E "Failed|Passed!" +``` + +Expected: FAIL — `FindRepositoryRoot` still looks for `templify.sln`, so `root` is null or the assert fails. + +- [ ] **Step 4: Update `RepositoryPaths` and the generator message** + +`tools/TriasDev.Templify.DocumentGenerator/RepositoryPaths.cs`: + +```csharp + /// Finds the repository root (the directory containing templify.slnx and examples/). +``` + +```csharp + if (File.Exists(Path.Combine(dir.FullName, "templify.slnx")) +``` + +`tools/TriasDev.Templify.DocumentGenerator/Program.cs` line 12: + +```csharp + Console.WriteLine("Error: Could not find the repository root (directory containing templify.slnx and examples/)."); +``` + +- [ ] **Step 5: Run the smoke test to see it pass** + +```bash +dotnet test tests/TriasDev.Templify.Tools.Tests --filter "FullyQualifiedName~ExampleGeneratorSmokeTests" 2>&1 | grep -E "Failed|Passed!" +``` + +Expected: `Passed!`, 0 failed. + +- [ ] **Step 6: Update workflows** + +```bash +sed -i '' 's#templify\.sln#templify.slnx#' .github/workflows/codeql.yml .github/workflows/build-sonarqube.yml +git grep -nP 'templify\.sln(?!x)' -- .github +``` + +Expected: both build lines read `templify.slnx`; no `templify.sln` without `x` remains in `.github/`. + +- [ ] **Step 7: Build and test through the new solution** + +```bash +dotnet restore --locked-mode +dotnet build -c Release -p:ContinuousIntegrationBuild=true 2>&1 | tail -3 +dotnet test -c Release --no-build 2>&1 | grep -E "^(Passed|Failed)!" +``` + +Expected: the root commands pick up `templify.slnx` (the only solution file); 0 warnings / 0 errors; counts equal the +baseline. + +- [ ] **Step 8: Commit** + +```bash +git add -A +git commit -m "chore: replace templify.sln with templify.slnx with solution folders (#3)" +``` + +--- + +### Task 4: Layered build props + +**Files:** +- Modify: `Directory.Build.props:2-3` (header comment) +- Create: `src/Directory.Build.props`, `tests/Directory.Build.props` +- Modify: `src/TriasDev.Templify/TriasDev.Templify.csproj`, `tests/*/*.csproj` (three files) + +**Interfaces:** +- Consumes: baseline from Task 1 (`$SCRATCH/baseline/files.txt`, `symbols.txt`, `nuspec.xml`). +- Produces: `src/Directory.Build.props` and `tests/Directory.Build.props`, each importing the root file. + +- [ ] **Step 1: Update the root header comment** + +`Directory.Build.props` lines 2-3 become: + +```xml + +``` + +- [ ] **Step 2: Create `src/Directory.Build.props`** + +```xml + + + + + + + true + TriasDev GmbH & Co. KG + TriasDev GmbH & Co. KG + Copyright © TriasDev GmbH & Co. KG + MIT + https://github.com/TriasDev/templify + https://github.com/TriasDev/templify + git + README.md + icon.png + + + + + true + snupkg + true + true + + + + + $(WarningsAsErrors);RS0016;RS0017 + true + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + +``` + +- [ ] **Step 3: Remove the moved settings from the library project** + +Edit `src/TriasDev.Templify/TriasDev.Templify.csproj` by deleting elements (keep `Description` and `PackageTags` +exactly as they are, keep the UTF-8 BOM). Delete: `GenerateDocumentationFile` with its comment, the RS0016/RS0017 +`WarningsAsErrors` line with its comment, `Authors`, `Company`, `Copyright`, `PackageLicenseExpression`, +`PackageProjectUrl`, `RepositoryUrl`, `RepositoryType`, `PackageReadmeFile`, `PackageIcon`, `EnablePackageValidation`, +the "Symbols and Source Link" block, the `PublicApiAnalyzers` package reference with its comment, and the icon +`None` item. Replace the `` comment with +``. +The result has this shape (`Description` and `PackageTags` shortened here only): + +```xml + + + + + net10.0;net9.0;net8.0 + + + $(NoWarn);RS0026;RS0027 + + + TriasDev.Templify + 1.9.0 + High-performance templating engine for .NET. ... + word;docx;odt;... + + + 1.9.0 + + + + + + + + + + + + + + + + + + + +``` + + +- [ ] **Step 4: Create `tests/Directory.Build.props` and slim the test projects** + +```xml + + + + + + + false + + Exe + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + +``` + +In each of the three test csproj files delete ``, `` with its comment, the `ItemGroup` with +the four package references, and the `ItemGroup` with ``. What remains, e.g. +`tests/TriasDev.Templify.Converter.Tests/TriasDev.Templify.Converter.Tests.csproj`: + +```xml + + + + net10.0 + + + + + + + + +``` + +`tests/TriasDev.Templify.Tests` keeps its `TargetFrameworks` comment and line, the ODT fixtures `ItemGroup` and its +project reference; `tests/TriasDev.Templify.Tools.Tests` keeps `TargetFramework` and its two project references. + +- [ ] **Step 5: Verify restore, build, tests and package equivalence** + +```bash +SCRATCH=/private/tmp/claude-501/-Users-vaceslavustinov-Documents-work-triasdev-templify/10f81cd0-4b6d-459a-b6a1-298912a1a9f2/scratchpad +dotnet restore --locked-mode +dotnet build -c Release -p:ContinuousIntegrationBuild=true 2>&1 | tail -3 +dotnet test -c Release --no-build 2>&1 | grep -E "^(Passed|Failed)!" +rm -rf $SCRATCH/after && mkdir -p $SCRATCH/after +dotnet pack src/TriasDev.Templify/TriasDev.Templify.csproj -c Release -p:ContinuousIntegrationBuild=true -o $SCRATCH/after +unzip -l $SCRATCH/after/TriasDev.Templify.1.9.0.nupkg | awk 'NR>3 {print $4}' | grep -v '^$' | sort > $SCRATCH/after/files.txt +unzip -l $SCRATCH/after/TriasDev.Templify.1.9.0.snupkg | awk 'NR>3 {print $4}' | grep -v '^$' | sort > $SCRATCH/after/symbols.txt +unzip -p $SCRATCH/after/TriasDev.Templify.1.9.0.nupkg TriasDev.Templify.nuspec > $SCRATCH/after/nuspec.xml +diff $SCRATCH/baseline/files.txt $SCRATCH/after/files.txt && echo FILES-SAME +diff $SCRATCH/baseline/symbols.txt $SCRATCH/after/symbols.txt && echo SYMBOLS-SAME +diff <(grep -v 'commit=' $SCRATCH/baseline/nuspec.xml) <(grep -v 'commit=' $SCRATCH/after/nuspec.xml) && echo NUSPEC-SAME +``` + +Expected: lock files valid; 0 warnings / 0 errors; test counts equal the baseline; `FILES-SAME`, `SYMBOLS-SAME`, +`NUSPEC-SAME`. If the nuspec differs only in the `` line, that is the expected commit +difference. Any other difference (missing `icon.png`, `README.md`, `.xml` docs, `.pdb` in the snupkg, different +dependency groups) is a defect: fix the props and repeat. + +- [ ] **Step 6: Check that RS0016 still fires** + +Temporarily add `public static class ProbeApi { }` to `src/TriasDev.Templify/Core/TemplateFormat.cs` (end of file), +then: + +```bash +dotnet build src/TriasDev.Templify -c Release 2>&1 | grep -c RS0016 +git checkout src/TriasDev.Templify/Core/TemplateFormat.cs +``` + +Expected: count ≥ 1 (the API guard moved to `src/Directory.Build.props` is active); the file is restored. + +- [ ] **Step 7: Commit** + +```bash +dotnet format --verify-no-changes --no-restore +git add -A +git commit -m "chore: split build props into root, src/ and tests/ like tabular (#3)" +``` + +--- + +### Task 5: Documentation + +**Files:** +- Modify: `CLAUDE.md`, `CONTRIBUTING.md`, `README.md`, `src/TriasDev.Templify/README.md`, + `src/TriasDev.Templify/ARCHITECTURE.md`, `src/TriasDev.Templify/PERFORMANCE.md`, `scripts/README.md`, + `examples/README.md`, `tools/TriasDev.Templify.Converter/README.md`, `tools/TriasDev.Templify.Gui/README.md`, + `tools/TriasDev.Templify.DocumentGenerator/README.md`, `tools/TriasDev.Templify.DocumentGenerator/Program.cs:112`, + `docs/index.md`, `docs/FAQ.md`, `docs/for-developers/quick-start.md`, + `docs/for-template-authors/boolean-expressions.md`, `docs/for-template-authors/format-specifiers.md`, + `docs/tutorials/01-hello-world.md`, `docs/tutorials/02-invoice-generator.md`, `.github/ISSUE_TEMPLATE/question.yml`, + comments in `tests/TriasDev.Templify.Tests/Documentation/DocSamplesTests.cs` and `OpenDocumentSamplesTests.cs` + +**Interfaces:** +- Consumes: the layout and `templify.slnx` from Tasks 2-3. + +- [ ] **Step 1: Rewrite path references mechanically** + +Old project paths become new ones in GitHub links (`blob/main/`, `tree/main/`), `--project` arguments, `cd`/`dotnet` +commands and prose. Skip `docs/archive/` and `docs/superpowers/`. + +```bash +files=$(git grep -lP 'TriasDev\.Templify[A-Za-z.]*/|templify\.sln(?!x)' -- ':!docs/archive/**' ':!docs/superpowers/**' ':!*.slnx' ':!.github/workflows/**' ':!release-please-config.json' ':!scripts/*.sh') +echo "$files" +for f in $files; do + perl -pi -e ' + s#(? $l" + done +done +``` + +Expected: no `BROKEN` lines. + +- [ ] **Step 3: Update the structure sections by hand** + +- `CLAUDE.md` "Solution Structure": list the projects under their groups (`src/`, `tests/`, `benchmarks/`, + `samples/`, `tools/`); "Build Configuration": add one line — "`src/Directory.Build.props` (package metadata, Source + Link, public API guard) and `tests/Directory.Build.props` (xUnit packages, `IsPackable=false`) import the root + file." Commands use `templify.slnx` and the new project paths (Step 1 did the mechanical part; read the sections + and fix anything Step 1 left odd). +- `CONTRIBUTING.md`: the same structure description where it lists projects or commands. +- `README.md` (root): any "Project structure" / "Repository layout" section shows the new tree. + +- [ ] **Step 4: Verify docs and leftovers** + +```bash +git grep -nP '(?&1 | grep -iE "warn|error|built" +``` + +Expected: both greps print nothing (every remaining `TriasDev.Templify.X/` is preceded by `src/`, `tests/`, ...); +MkDocs reports "Documentation built" with no warning. + +- [ ] **Step 5: Commit** + +```bash +dotnet build -c Release -p:ContinuousIntegrationBuild=true 2>&1 | tail -2 # DocumentGenerator Program.cs message changed +git add -A +git commit -m "docs: update project paths for the new repository layout (#3)" +``` + +--- + +### Task 6: Full verification and pull request + +**Files:** none (verification); PR description. + +- [ ] **Step 1: CI-equivalent build, format and locked restore** + +```bash +git clean -fdX -- src tests benchmarks samples tools +dotnet restore --locked-mode +dotnet build -c Release -p:ContinuousIntegrationBuild=true 2>&1 | tail -3 +dotnet format --verify-no-changes --no-restore; echo format-exit=$? +``` + +Expected: 0 warnings / 0 errors; `format-exit=0`. + +- [ ] **Step 2: All tests, compared with the baseline** + +```bash +SCRATCH=/private/tmp/claude-501/-Users-vaceslavustinov-Documents-work-triasdev-templify/10f81cd0-4b6d-459a-b6a1-298912a1a9f2/scratchpad +dotnet test -c Release --no-build 2>&1 | grep -E "^(Passed|Failed)!" | sed -E 's/Duration: [^-]+- //' | sort > $SCRATCH/after/tests.txt +diff $SCRATCH/baseline/tests.txt $SCRATCH/after/tests.txt && echo TESTS-SAME +``` + +Expected: `TESTS-SAME` (same assemblies, TFMs and counts, 0 failed). + +- [ ] **Step 3: LibreOffice round trips** + +```bash +dotnet test tests/TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj -c Release -f net10.0 --filter "Category=LibreOffice" 2>&1 | grep -E "^(Passed|Failed)!" +``` + +Expected: all passed, `Skipped: 0`. Note the count for the PR description. + +- [ ] **Step 4: Converter scripts** + +```bash +SCRATCH=/private/tmp/claude-501/-Users-vaceslavustinov-Documents-work-triasdev-templify/10f81cd0-4b6d-459a-b6a1-298912a1a9f2/scratchpad +sample=$(git ls-files 'examples/templates/*.docx' | head -1); cp "$sample" $SCRATCH/sample.docx +(cd $SCRATCH && /Users/vaceslavustinov/Documents/work/triasdev/templify/scripts/validate.sh sample.docx; echo exit=$?) +(cd $SCRATCH && /Users/vaceslavustinov/Documents/work/triasdev/templify/scripts/analyze.sh sample.docx --output report.md; echo exit=$?) +(cd $SCRATCH && /Users/vaceslavustinov/Documents/work/triasdev/templify/scripts/clean.sh sample.docx --output cleaned.docx; echo exit=$?) +(cd $SCRATCH && /Users/vaceslavustinov/Documents/work/triasdev/templify/scripts/convert.sh sample.docx --output converted.docx; echo exit=$?) +``` + +Expected: each script starts the converter (no "project file does not exist"); `exit=0` for each. + +- [ ] **Step 5: DocumentGenerator** + +```bash +dotnet run --project tools/TriasDev.Templify.DocumentGenerator -- --skip-images 2>&1 | tail -5 +git status --short examples docs/images +``` + +Expected: no "Could not find the repository root"; `git status` shows no changes (outputs identical). If outputs +differ only in timestamps inside the documents, `git checkout -- examples` and note it in the PR. + +- [ ] **Step 6: Push and open the PR** + +```bash +git push -u origin chore/project-structure +gh pr create --title "chore: align the repository layout with tabular (#3)" --body "" +``` + +Body: summary of the four commits, the layout table from the spec, out-of-scope list, verification results (build, +`TESTS-SAME` counts, package equivalence `FILES-SAME`/`SYMBOLS-SAME`/`NUSPEC-SAME`, LibreOffice `N/N passed`, +scripts, DocumentGenerator, mkdocs), note that external links to old GitHub paths break and local `bin/obj`/IDE +folders under the old paths can be deleted, and "Public API impact: none". Closes #3. + +- [ ] **Step 7: Wait for CI** + +```bash +gh pr checks --watch --interval 30 +``` + +Expected: all checks pass, including Pack NuGet, CodeQL and SonarQube. Do not merge without the user's go-ahead. diff --git a/docs/superpowers/specs/2026-10-03-project-structure-design.md b/docs/superpowers/specs/2026-10-03-project-structure-design.md new file mode 100644 index 0000000..def340a --- /dev/null +++ b/docs/superpowers/specs/2026-10-03-project-structure-design.md @@ -0,0 +1,159 @@ +# Project Structure Aligned with Tabular (#3) + +**Date:** 2026-10-03 +**Issue:** #3 (Evaluate project structure improvements) +**Public API impact:** none (no source changes in the library; the package content stays the same) + +## Goal + +Templify and Tabular (`TriasDev/tabular`) are both TriasDev open source .NET libraries. They should have the same +repository layout, so that a contributor who knows one knows the other: + +- projects grouped in `src/`, `tests/`, `benchmarks/`, `samples/` (plus `tools/` in Templify); +- an `.slnx` solution with solution folders that mirror those directories; +- a root `Directory.Build.props` with shared settings, and `src/` / `tests/` props that import it and add the + settings of their group. + +## Non-Goals + +Build tooling stays as it is; aligning it is separate work (own issues if wanted): + +- Central Package Management and `packages.lock.json` stay (Tabular has neither). +- Tests keep running through VSTest (`xunit.v3.mtp-off`); no switch to Microsoft.Testing.Platform. +- No new analyzers (Tabular uses Roslynator and SonarAnalyzer). +- No change in Tabular. +- No change of target frameworks, package metadata values, the package ID or namespaces. + +## Layout + +| Today | After | +|---|---| +| `TriasDev.Templify/` | `src/TriasDev.Templify/` | +| `TriasDev.Templify.Tests/` | `tests/TriasDev.Templify.Tests/` | +| `TriasDev.Templify.Tools.Tests/` | `tests/TriasDev.Templify.Tools.Tests/` | +| `TriasDev.Templify.Converter.Tests/` | `tests/TriasDev.Templify.Converter.Tests/` | +| `TriasDev.Templify.Benchmarks/` | `benchmarks/TriasDev.Templify.Benchmarks/` | +| `TriasDev.Templify.Demo/` | `samples/TriasDev.Templify.Demo/` | +| `TriasDev.Templify.Converter/` | `tools/TriasDev.Templify.Converter/` | +| `TriasDev.Templify.Gui/` | `tools/TriasDev.Templify.Gui/` | +| `TriasDev.Templify.DocumentGenerator/` | `tools/TriasDev.Templify.DocumentGenerator/` | +| `templify.sln` | `templify.slnx` | + +`src/` holds only what ships to NuGet, as in Tabular. The applications that are not packages (Converter CLI, Avalonia +GUI, documentation generator) go to `tools/`, which Tabular does not need. + +These stay at the root: `Directory.Build.props`, `Directory.Packages.props`, `global.json`, `.editorconfig`, +`assets/`, `docs/`, `examples/`, `scripts/`, `mkdocs.yml`, `requirements.txt`, release-please files and the community +files (README, CHANGELOG, CONTRIBUTING, ...). Each `packages.lock.json` moves with its project. + +Moves use `git mv` so that history follows the files (`git log --follow`, GitHub rename view). + +## Solution + +`templify.sln` is replaced by `templify.slnx` (`dotnet sln migrate`; supported by SDK 10, Visual Studio 2022 17.13+, +Rider 2024.3+). Solution folders: `/src/`, `/tests/`, `/benchmarks/`, `/samples/`, `/tools/`, each listing the +projects of that directory. `templify.sln` is deleted; the untracked `templify.sln.DotSettings.user` is the +developer's own file and is not touched. + +## Build Props + +**Root `Directory.Build.props`:** unchanged content (Nullable, ImplicitUsings, LangVersion, AnalysisLevel, +EnforceCodeStyleInBuild, Deterministic, nullable as errors, lock files, CI settings). The header comment is updated to +describe the layered props. + +**`src/Directory.Build.props`** (new) imports the root file +(`$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))`) and takes from +`TriasDev.Templify.csproj` what every shipped package carries: + +- `GenerateDocumentationFile`; +- `Authors`, `Company`, `Copyright`, `PackageLicenseExpression`, `PackageProjectUrl`, `RepositoryUrl`, + `RepositoryType`, `PackageReadmeFile`, `PackageIcon`; +- symbols and Source Link: `IncludeSymbols`, `SymbolPackageFormat`, `PublishRepositoryUrl`, `EmbedUntrackedSources`; +- the public API guard: `PublicApiAnalyzers` package reference, RS0016/RS0017 as errors, `EnablePackageValidation`; +- the icon item (`$(MSBuildThisFileDirectory)../assets/icon-128.png` packed as `icon.png`). + +These stay in `TriasDev.Templify.csproj`, because they are specific to this package or read by tools: + +- `Version` (release-please updates it through `extra-files` with the XPath `//Project/PropertyGroup/Version`); +- `PackageValidationBaselineVersion` (bumped after each release, see CONTRIBUTING); +- `TargetFrameworks`, `PackageId`, `Description`, `PackageTags`, `NoWarn` RS0026/RS0027 (with its comment); +- `DocumentFormat.OpenXml`, `InternalsVisibleTo`, the embedded resource, the README item. + +**`tests/Directory.Build.props`** (new) imports the root file and holds what every test project repeats today: + +- `IsPackable=false`, `OutputType=Exe` (with the xunit.v3 comment); +- package references `coverlet.collector`, `Microsoft.NET.Test.Sdk`, `xunit.v3.mtp-off`, + `xunit.runner.visualstudio` (versions stay in `Directory.Packages.props`); +- ``. + +Test csproj files keep their target frameworks, project references and project-specific items (ODT fixtures). + +`tools/`, `benchmarks/` and `samples/` get no props of their own (as in Tabular); they inherit the root file. + +## References to Update + +Build and release: +- `.github/workflows/ci.yml`: `dotnet pack src/TriasDev.Templify/...`; the root `dotnet restore/build/test` commands + find `templify.slnx` without changes. +- `.github/workflows/release-please.yml`: build, test and pack paths. +- `.github/workflows/codeql.yml`, `build-sonarqube.yml`: `templify.sln` → `templify.slnx`. +- `.github/workflows/documentation.yml`: no change (its trigger paths are `docs/**`, `mkdocs.yml`, `requirements.txt`). +- `release-please-config.json`: `extra-files` path → `src/TriasDev.Templify/TriasDev.Templify.csproj`. +- `.github/dependabot.yml`: nuget `directory: "/"` stays (Central Package Management lives at the root); verified + by the Dependabot run after merge. +- `.gitignore`: `TriasDev.Templify.Demo/Data/` and `/output/` → `samples/TriasDev.Templify.Demo/...`. + +Code: +- `tools/TriasDev.Templify.DocumentGenerator/RepositoryPaths.cs` and `Program.cs`: the repository root is the + directory with `templify.slnx` and `examples/` (message and doc comment updated). +- `tests/TriasDev.Templify.Tools.Tests/DocumentGenerator/ExampleGeneratorSmokeTests.cs`: asserts `templify.slnx`. +- Relative `ProjectReference` paths: `..\X\X.csproj` becomes `..\..\\X\X.csproj` where groups differ. + +Scripts: +- `scripts/*.sh` and `scripts/*.cmd`: Converter project path → `tools/TriasDev.Templify.Converter/...`. + +Documentation: +- `CLAUDE.md`, `CONTRIBUTING.md`, `README.md`, and in `src/TriasDev.Templify/` the package `README.md`, + `ARCHITECTURE.md`, `Examples.md` and `PERFORMANCE.md`, `scripts/README.md`, `examples/README.md`, `docs/**` (outside + `docs/archive/`, which is historical and stays as is), `.github/ISSUE_TEMPLATE/question.yml`: project paths, + commands and `github.com/TriasDev/templify/blob|tree/main/` links. +- Earlier specs and plans in `docs/superpowers/` stay unchanged: they describe the repository at their date. + +External links to old paths (for example to `TriasDev.Templify/Examples.md` on GitHub) break, because GitHub does +not redirect moved files. The NuGet package README uses absolute links; they are updated, and the package page on +NuGet changes with the next release. + +## Commits + +One pull request with logical commits, so that `main` never has a half-moved layout: + +1. `git mv` of all projects, with the `ProjectReference`, workflow, script, `.gitignore`, release-please and code + path updates needed to build and test; +2. `templify.sln` → `templify.slnx` (with the `RepositoryPaths` / smoke test and workflow updates); +3. `src/` and `tests/` `Directory.Build.props`, with the moved settings removed from the csproj files; +4. documentation updates. + +## Verification + +- `dotnet build templify.slnx -c Release -p:ContinuousIntegrationBuild=true`: 0 warnings, 0 errors. +- `dotnet test` of all test projects (core tests on net10.0, net9.0, net8.0): same test count as on `main`, all pass. +- `dotnet format --verify-no-changes --no-restore`: clean. +- `dotnet restore --locked-mode`: lock files still valid. +- Package equivalence: `dotnet pack` before and after the change; the `.nupkg` and `.snupkg` contain the same files, + and the `.nuspec` metadata is the same (except the repository commit). Package validation against 1.9.0 passes. +- `scripts/analyze.sh`, `convert.sh`, `validate.sh`, `clean.sh` run against a sample document. +- `dotnet run --project tools/TriasDev.Templify.DocumentGenerator -- --skip-images` finds the repository root and + produces no changes in `examples/`. +- `mkdocs build --strict` passes; no link to a moved path is left (`git grep` for the old project paths outside + `docs/archive/` and `docs/superpowers/`). +- LibreOffice round trips: `dotnet test tests/TriasDev.Templify.Tests -c Release -f net10.0 --filter + "Category=LibreOffice"`, all passed, 0 skipped (the shared engine project moves). +- CI on the pull request is green, including Pack NuGet, CodeQL and SonarQube. + +## Risks + +- **Release pipeline:** a wrong path in `release-please.yml` or `release-please-config.json` only shows at the next + release. Mitigation: review both against the new layout; CI's Pack NuGet job builds the same project. +- **Open branches:** branches made before the move conflict on rebase. Today no pull request is open. +- **Developer IDE state:** local `.idea/`, `.vs/` and `bin/obj` folders under the old paths become stale; delete them + after pulling. diff --git a/docs/tutorials/01-hello-world.md b/docs/tutorials/01-hello-world.md index 6821d5c..f0b05e4 100644 --- a/docs/tutorials/01-hello-world.md +++ b/docs/tutorials/01-hello-world.md @@ -512,8 +512,8 @@ Now that you understand the basics, move on to more advanced features: - [Quick Start Guide](../for-developers/quick-start.md) - [FAQ](../FAQ.md) -- [Library README](https://github.com/TriasDev/templify/blob/main/TriasDev.Templify/README.md) -- [Examples Collection](https://github.com/TriasDev/templify/blob/main/TriasDev.Templify/Examples.md) +- [Library README](https://github.com/TriasDev/templify/blob/main/src/TriasDev.Templify/README.md) +- [Examples Collection](https://github.com/TriasDev/templify/blob/main/src/TriasDev.Templify/Examples.md) --- diff --git a/docs/tutorials/02-invoice-generator.md b/docs/tutorials/02-invoice-generator.md index ffa7f65..6e4f6c3 100644 --- a/docs/tutorials/02-invoice-generator.md +++ b/docs/tutorials/02-invoice-generator.md @@ -460,7 +460,7 @@ if (generator.GenerateInvoice(invoice, $"output/invoice-{invoice.InvoiceNumber}. ## Additional Resources -- [Examples Collection](https://github.com/TriasDev/templify/blob/main/TriasDev.Templify/Examples.md) - loops and tables +- [Examples Collection](https://github.com/TriasDev/templify/blob/main/src/TriasDev.Templify/Examples.md) - loops and tables - [FAQ - Loops](../FAQ.md#q-how-do-loops-work) - [FAQ - Loops in Tables](../FAQ.md#q-how-do-i-use-loops-in-tables) diff --git a/examples/README.md b/examples/README.md index 028e260..a640150 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,7 +1,7 @@ # Templify Examples This folder contains example Word (and one LibreOffice / OpenDocument) templates and the documents Templify produced from them. They are generated -by the [DocumentGenerator](../TriasDev.Templify.DocumentGenerator/README.md) tool, so they always match the +by the [DocumentGenerator](../tools/TriasDev.Templify.DocumentGenerator/README.md) tool, so they always match the current library. ## Available Examples @@ -16,7 +16,7 @@ current library. | LibreOffice Letter | [templates/libreoffice-letter-template.odt](templates/libreoffice-letter-template.odt) | [outputs/libreoffice-letter-output.odt](outputs/libreoffice-letter-output.odt) | OpenDocument (`.odt`) template for LibreOffice Writer: conditionals, list-item and table-row loops, markdown, footer | The sample data for each example is defined in code in -[`TriasDev.Templify.DocumentGenerator/Generators/`](../TriasDev.Templify.DocumentGenerator/Generators/). +[`tools/TriasDev.Templify.DocumentGenerator/Generators/`](../tools/TriasDev.Templify.DocumentGenerator/Generators/). ## How to Use These Examples @@ -32,7 +32,7 @@ Write a JSON file with the values the template uses, then use one of these optio **Option A: Templify GUI** ```bash -dotnet run --project TriasDev.Templify.Gui/TriasDev.Templify.Gui.csproj +dotnet run --project tools/TriasDev.Templify.Gui/TriasDev.Templify.Gui.csproj ``` Select the template (`.docx`, `.odt` or `.ott`), the JSON data file and the output file, then click **Process Template**. @@ -40,7 +40,7 @@ Select the template (`.docx`, `.odt` or `.ott`), the JSON data file and the outp **Option B: Demo console application** ```bash -dotnet run --project TriasDev.Templify.Demo -- --template examples/templates/hello-world-template.docx --data my-data.json --output my-output.docx +dotnet run --project samples/TriasDev.Templify.Demo -- --template examples/templates/hello-world-template.docx --data my-data.json --output my-output.docx ``` There is no general-purpose `templify` command-line tool; `TriasDev.Templify.Converter` only migrates @@ -74,10 +74,10 @@ JSON into a `Dictionary`. ## Regenerating the Examples ```bash -dotnet run --project TriasDev.Templify.DocumentGenerator -- --skip-images +dotnet run --project tools/TriasDev.Templify.DocumentGenerator -- --skip-images ``` -See the [DocumentGenerator README](../TriasDev.Templify.DocumentGenerator/README.md) for options (including the +See the [DocumentGenerator README](../tools/TriasDev.Templify.DocumentGenerator/README.md) for options (including the preview images in `docs/images/examples/`). ## Need Help? diff --git a/release-please-config.json b/release-please-config.json index e495acd..95744a4 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -18,7 +18,7 @@ "extra-files": [ { "type": "xml", - "path": "TriasDev.Templify/TriasDev.Templify.csproj", + "path": "src/TriasDev.Templify/TriasDev.Templify.csproj", "xpath": "//Project/PropertyGroup/Version" } ] diff --git a/TriasDev.Templify.Demo/ComprehensiveDemo.cs b/samples/TriasDev.Templify.Demo/ComprehensiveDemo.cs similarity index 100% rename from TriasDev.Templify.Demo/ComprehensiveDemo.cs rename to samples/TriasDev.Templify.Demo/ComprehensiveDemo.cs diff --git a/TriasDev.Templify.Demo/CustomTemplateDemo.cs b/samples/TriasDev.Templify.Demo/CustomTemplateDemo.cs similarity index 97% rename from TriasDev.Templify.Demo/CustomTemplateDemo.cs rename to samples/TriasDev.Templify.Demo/CustomTemplateDemo.cs index 81c2193..be57908 100644 --- a/TriasDev.Templify.Demo/CustomTemplateDemo.cs +++ b/samples/TriasDev.Templify.Demo/CustomTemplateDemo.cs @@ -23,7 +23,7 @@ private static int RunCustomTemplate(string[] args) if (string.IsNullOrEmpty(templatePath) || string.IsNullOrEmpty(jsonPath)) { - Console.WriteLine("Usage: dotnet run --project TriasDev.Templify.Demo -- --template --data [--output ]"); + Console.WriteLine("Usage: dotnet run --project samples/TriasDev.Templify.Demo -- --template --data [--output ]"); return 1; } diff --git a/TriasDev.Templify.Demo/DemoModels.cs b/samples/TriasDev.Templify.Demo/DemoModels.cs similarity index 100% rename from TriasDev.Templify.Demo/DemoModels.cs rename to samples/TriasDev.Templify.Demo/DemoModels.cs diff --git a/TriasDev.Templify.Demo/DocumentHelpers.cs b/samples/TriasDev.Templify.Demo/DocumentHelpers.cs similarity index 100% rename from TriasDev.Templify.Demo/DocumentHelpers.cs rename to samples/TriasDev.Templify.Demo/DocumentHelpers.cs diff --git a/TriasDev.Templify.Demo/JsonDemo.cs b/samples/TriasDev.Templify.Demo/JsonDemo.cs similarity index 100% rename from TriasDev.Templify.Demo/JsonDemo.cs rename to samples/TriasDev.Templify.Demo/JsonDemo.cs diff --git a/TriasDev.Templify.Demo/Program.cs b/samples/TriasDev.Templify.Demo/Program.cs similarity index 94% rename from TriasDev.Templify.Demo/Program.cs rename to samples/TriasDev.Templify.Demo/Program.cs index 00b8eb5..181f391 100644 --- a/TriasDev.Templify.Demo/Program.cs +++ b/samples/TriasDev.Templify.Demo/Program.cs @@ -19,7 +19,7 @@ internal partial class Program private static int Main(string[] args) { // Optional: process your own template instead of the built-in demos - // dotnet run --project TriasDev.Templify.Demo -- --template my.docx|my.odt --data my.json [--output out.docx] + // dotnet run --project samples/TriasDev.Templify.Demo -- --template my.docx|my.odt --data my.json [--output out.docx] if (args.Contains("--template") || args.Contains("--data")) { return RunCustomTemplate(args); @@ -98,7 +98,7 @@ private static int Main(string[] args) Console.WriteLine("═══════════════════════════════════════════════════════════"); Console.WriteLine(); Console.WriteLine("💡 To process your own template, run:"); - Console.WriteLine(" dotnet run --project TriasDev.Templify.Demo -- --template my.docx --data my.json (or my.odt / my.ott)"); + Console.WriteLine(" dotnet run --project samples/TriasDev.Templify.Demo -- --template my.docx --data my.json (or my.odt / my.ott)"); return result.IsSuccess ? 0 : 1; } diff --git a/TriasDev.Templify.Demo/TriasDev.Templify.Demo.csproj b/samples/TriasDev.Templify.Demo/TriasDev.Templify.Demo.csproj similarity index 69% rename from TriasDev.Templify.Demo/TriasDev.Templify.Demo.csproj rename to samples/TriasDev.Templify.Demo/TriasDev.Templify.Demo.csproj index 5a7a36f..55f51c7 100644 --- a/TriasDev.Templify.Demo/TriasDev.Templify.Demo.csproj +++ b/samples/TriasDev.Templify.Demo/TriasDev.Templify.Demo.csproj @@ -1,7 +1,7 @@  - + diff --git a/TriasDev.Templify.Demo/ValidationDemo.cs b/samples/TriasDev.Templify.Demo/ValidationDemo.cs similarity index 100% rename from TriasDev.Templify.Demo/ValidationDemo.cs rename to samples/TriasDev.Templify.Demo/ValidationDemo.cs diff --git a/TriasDev.Templify.Converter/packages.lock.json b/samples/TriasDev.Templify.Demo/packages.lock.json similarity index 100% rename from TriasDev.Templify.Converter/packages.lock.json rename to samples/TriasDev.Templify.Demo/packages.lock.json diff --git a/scripts/README.md b/scripts/README.md index 7f07ac9..1f58245 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -216,7 +216,7 @@ for %%f in (old-templates\*.docx) do ( ```bash # Long form - 80+ characters -dotnet run --project TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- analyze templates/invoice.docx --output reports/invoice-analysis.md +dotnet run --project tools/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- analyze templates/invoice.docx --output reports/invoice-analysis.md ``` ### With Scripts (Concise) @@ -318,7 +318,7 @@ scripts/analyze.cmd template.docx REM Won't work ### Issue: "Project not found" **Cause:** The script was copied out of the repository. The scripts expect to live in `scripts/` next to -`TriasDev.Templify.Converter/`. +`tools/TriasDev.Templify.Converter/`. **Solution:** Call the scripts in place (or add the repository's `scripts/` directory to your PATH) instead of copying them elsewhere. A symlink on your PATH that points to a script is not resolved; add the directory @@ -332,13 +332,13 @@ Each script is a thin wrapper around the converter CLI: ```bash #!/usr/bin/env bash SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -exec dotnet run --project "$SCRIPT_DIR/../TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj" -- [command] "$@" +exec dotnet run --project "$SCRIPT_DIR/../tools/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj" -- [command] "$@" ``` **Windows scripts (`.cmd`):** ```cmd @echo off -dotnet run --project "%~dp0..\TriasDev.Templify.Converter\TriasDev.Templify.Converter.csproj" -- [command] %* +dotnet run --project "%~dp0..\tools\TriasDev.Templify.Converter\TriasDev.Templify.Converter.csproj" -- [command] %* exit /b %ERRORLEVEL% ``` @@ -346,8 +346,8 @@ All command-line arguments are passed through to the converter unchanged. ## Related Documentation -- 📖 **[Converter Documentation](../TriasDev.Templify.Converter/README.md)** - Full converter command reference -- 📚 **[Templify Library Documentation](../TriasDev.Templify/README.md)** - Templify API and usage +- 📖 **[Converter Documentation](../tools/TriasDev.Templify.Converter/README.md)** - Full converter command reference +- 📚 **[Templify Library Documentation](../src/TriasDev.Templify/README.md)** - Templify API and usage - 📝 **[Root README](../README.md)** - Repository overview --- diff --git a/scripts/analyze.cmd b/scripts/analyze.cmd index 4d827c6..7c7de1b 100644 --- a/scripts/analyze.cmd +++ b/scripts/analyze.cmd @@ -5,5 +5,5 @@ REM REM Works from any directory: the converter project is located relative to this script (%~dp0), REM while file arguments stay relative to your current directory. -dotnet run --project "%~dp0..\TriasDev.Templify.Converter\TriasDev.Templify.Converter.csproj" -- analyze %* +dotnet run --project "%~dp0..\tools\TriasDev.Templify.Converter\TriasDev.Templify.Converter.csproj" -- analyze %* exit /b %ERRORLEVEL% diff --git a/scripts/analyze.sh b/scripts/analyze.sh index 60c3acf..b9a57d4 100755 --- a/scripts/analyze.sh +++ b/scripts/analyze.sh @@ -6,4 +6,4 @@ # while file arguments stay relative to your current directory. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -exec dotnet run --project "$SCRIPT_DIR/../TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj" -- analyze "$@" +exec dotnet run --project "$SCRIPT_DIR/../tools/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj" -- analyze "$@" diff --git a/scripts/clean.cmd b/scripts/clean.cmd index 1eeb900..2172a03 100644 --- a/scripts/clean.cmd +++ b/scripts/clean.cmd @@ -5,5 +5,5 @@ REM REM Works from any directory: the converter project is located relative to this script (%~dp0), REM while file arguments stay relative to your current directory. -dotnet run --project "%~dp0..\TriasDev.Templify.Converter\TriasDev.Templify.Converter.csproj" -- clean %* +dotnet run --project "%~dp0..\tools\TriasDev.Templify.Converter\TriasDev.Templify.Converter.csproj" -- clean %* exit /b %ERRORLEVEL% diff --git a/scripts/clean.sh b/scripts/clean.sh index e4e63ce..bbee490 100755 --- a/scripts/clean.sh +++ b/scripts/clean.sh @@ -6,4 +6,4 @@ # while file arguments stay relative to your current directory. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -exec dotnet run --project "$SCRIPT_DIR/../TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj" -- clean "$@" +exec dotnet run --project "$SCRIPT_DIR/../tools/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj" -- clean "$@" diff --git a/scripts/convert.cmd b/scripts/convert.cmd index f45e39a..0d584bb 100644 --- a/scripts/convert.cmd +++ b/scripts/convert.cmd @@ -5,5 +5,5 @@ REM REM Works from any directory: the converter project is located relative to this script (%~dp0), REM while file arguments stay relative to your current directory. -dotnet run --project "%~dp0..\TriasDev.Templify.Converter\TriasDev.Templify.Converter.csproj" -- convert %* +dotnet run --project "%~dp0..\tools\TriasDev.Templify.Converter\TriasDev.Templify.Converter.csproj" -- convert %* exit /b %ERRORLEVEL% diff --git a/scripts/convert.sh b/scripts/convert.sh index 7bd41ef..30baf34 100755 --- a/scripts/convert.sh +++ b/scripts/convert.sh @@ -6,4 +6,4 @@ # while file arguments stay relative to your current directory. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -exec dotnet run --project "$SCRIPT_DIR/../TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj" -- convert "$@" +exec dotnet run --project "$SCRIPT_DIR/../tools/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj" -- convert "$@" diff --git a/scripts/validate.cmd b/scripts/validate.cmd index d5b5a3b..6f032b1 100644 --- a/scripts/validate.cmd +++ b/scripts/validate.cmd @@ -5,5 +5,5 @@ REM REM Works from any directory: the converter project is located relative to this script (%~dp0), REM while file arguments stay relative to your current directory. -dotnet run --project "%~dp0..\TriasDev.Templify.Converter\TriasDev.Templify.Converter.csproj" -- validate %* +dotnet run --project "%~dp0..\tools\TriasDev.Templify.Converter\TriasDev.Templify.Converter.csproj" -- validate %* exit /b %ERRORLEVEL% diff --git a/scripts/validate.sh b/scripts/validate.sh index f32a434..f27643e 100755 --- a/scripts/validate.sh +++ b/scripts/validate.sh @@ -6,4 +6,4 @@ # while file arguments stay relative to your current directory. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -exec dotnet run --project "$SCRIPT_DIR/../TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj" -- validate "$@" +exec dotnet run --project "$SCRIPT_DIR/../tools/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj" -- validate "$@" diff --git a/src/Directory.Build.props b/src/Directory.Build.props new file mode 100644 index 0000000..148f0db --- /dev/null +++ b/src/Directory.Build.props @@ -0,0 +1,47 @@ + + + + + + + true + TriasDev GmbH & Co. KG + TriasDev GmbH & Co. KG + Copyright © TriasDev GmbH & Co. KG + MIT + https://github.com/TriasDev/templify + https://github.com/TriasDev/templify + git + README.md + icon.png + + + + + true + snupkg + true + true + + + + + $(WarningsAsErrors);RS0016;RS0017 + true + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + diff --git a/TriasDev.Templify/ARCHITECTURE.md b/src/TriasDev.Templify/ARCHITECTURE.md similarity index 99% rename from TriasDev.Templify/ARCHITECTURE.md rename to src/TriasDev.Templify/ARCHITECTURE.md index f5d2965..cf6d419 100644 --- a/TriasDev.Templify/ARCHITECTURE.md +++ b/src/TriasDev.Templify/ARCHITECTURE.md @@ -4,7 +4,7 @@ This document describes how the `TriasDev.Templify` library processes templates. for template syntax and API usage see the [documentation site](https://triasdev.github.io/templify/) and the [library README](README.md). -Paths below are relative to `TriasDev.Templify/`. Everything not listed in `PublicAPI.Shipped.txt` / +Paths below are relative to `src/TriasDev.Templify/`. Everything not listed in `PublicAPI.Shipped.txt` / `PublicAPI.Unshipped.txt` is `internal` and may change at any time. ## Design Principles diff --git a/TriasDev.Templify/Conditionals/ConditionContext.cs b/src/TriasDev.Templify/Conditionals/ConditionContext.cs similarity index 100% rename from TriasDev.Templify/Conditionals/ConditionContext.cs rename to src/TriasDev.Templify/Conditionals/ConditionContext.cs diff --git a/TriasDev.Templify/Conditionals/ConditionEvaluator.cs b/src/TriasDev.Templify/Conditionals/ConditionEvaluator.cs similarity index 100% rename from TriasDev.Templify/Conditionals/ConditionEvaluator.cs rename to src/TriasDev.Templify/Conditionals/ConditionEvaluator.cs diff --git a/TriasDev.Templify/Conditionals/ConditionValidationIssue.cs b/src/TriasDev.Templify/Conditionals/ConditionValidationIssue.cs similarity index 100% rename from TriasDev.Templify/Conditionals/ConditionValidationIssue.cs rename to src/TriasDev.Templify/Conditionals/ConditionValidationIssue.cs diff --git a/TriasDev.Templify/Conditionals/ConditionValidationResult.cs b/src/TriasDev.Templify/Conditionals/ConditionValidationResult.cs similarity index 100% rename from TriasDev.Templify/Conditionals/ConditionValidationResult.cs rename to src/TriasDev.Templify/Conditionals/ConditionValidationResult.cs diff --git a/TriasDev.Templify/Conditionals/ConditionalBlock.cs b/src/TriasDev.Templify/Conditionals/ConditionalBlock.cs similarity index 100% rename from TriasDev.Templify/Conditionals/ConditionalBlock.cs rename to src/TriasDev.Templify/Conditionals/ConditionalBlock.cs diff --git a/TriasDev.Templify/Conditionals/ConditionalBranch.cs b/src/TriasDev.Templify/Conditionals/ConditionalBranch.cs similarity index 100% rename from TriasDev.Templify/Conditionals/ConditionalBranch.cs rename to src/TriasDev.Templify/Conditionals/ConditionalBranch.cs diff --git a/TriasDev.Templify/Conditionals/ConditionalDetector.cs b/src/TriasDev.Templify/Conditionals/ConditionalDetector.cs similarity index 100% rename from TriasDev.Templify/Conditionals/ConditionalDetector.cs rename to src/TriasDev.Templify/Conditionals/ConditionalDetector.cs diff --git a/TriasDev.Templify/Conditionals/ConditionalEvaluator.cs b/src/TriasDev.Templify/Conditionals/ConditionalEvaluator.cs similarity index 100% rename from TriasDev.Templify/Conditionals/ConditionalEvaluator.cs rename to src/TriasDev.Templify/Conditionals/ConditionalEvaluator.cs diff --git a/TriasDev.Templify/Conditionals/ConditionalPatterns.cs b/src/TriasDev.Templify/Conditionals/ConditionalPatterns.cs similarity index 100% rename from TriasDev.Templify/Conditionals/ConditionalPatterns.cs rename to src/TriasDev.Templify/Conditionals/ConditionalPatterns.cs diff --git a/TriasDev.Templify/Conditionals/Engine/ConditionAstCache.cs b/src/TriasDev.Templify/Conditionals/Engine/ConditionAstCache.cs similarity index 100% rename from TriasDev.Templify/Conditionals/Engine/ConditionAstCache.cs rename to src/TriasDev.Templify/Conditionals/Engine/ConditionAstCache.cs diff --git a/TriasDev.Templify/Conditionals/Engine/ConditionDialect.cs b/src/TriasDev.Templify/Conditionals/Engine/ConditionDialect.cs similarity index 100% rename from TriasDev.Templify/Conditionals/Engine/ConditionDialect.cs rename to src/TriasDev.Templify/Conditionals/Engine/ConditionDialect.cs diff --git a/TriasDev.Templify/Conditionals/Engine/ConditionEvaluatorCore.cs b/src/TriasDev.Templify/Conditionals/Engine/ConditionEvaluatorCore.cs similarity index 100% rename from TriasDev.Templify/Conditionals/Engine/ConditionEvaluatorCore.cs rename to src/TriasDev.Templify/Conditionals/Engine/ConditionEvaluatorCore.cs diff --git a/TriasDev.Templify/Conditionals/Engine/ConditionLexer.cs b/src/TriasDev.Templify/Conditionals/Engine/ConditionLexer.cs similarity index 100% rename from TriasDev.Templify/Conditionals/Engine/ConditionLexer.cs rename to src/TriasDev.Templify/Conditionals/Engine/ConditionLexer.cs diff --git a/TriasDev.Templify/Conditionals/Engine/ConditionNode.cs b/src/TriasDev.Templify/Conditionals/Engine/ConditionNode.cs similarity index 100% rename from TriasDev.Templify/Conditionals/Engine/ConditionNode.cs rename to src/TriasDev.Templify/Conditionals/Engine/ConditionNode.cs diff --git a/TriasDev.Templify/Conditionals/Engine/ConditionOperatorRegistry.cs b/src/TriasDev.Templify/Conditionals/Engine/ConditionOperatorRegistry.cs similarity index 100% rename from TriasDev.Templify/Conditionals/Engine/ConditionOperatorRegistry.cs rename to src/TriasDev.Templify/Conditionals/Engine/ConditionOperatorRegistry.cs diff --git a/TriasDev.Templify/Conditionals/Engine/ConditionParser.cs b/src/TriasDev.Templify/Conditionals/Engine/ConditionParser.cs similarity index 100% rename from TriasDev.Templify/Conditionals/Engine/ConditionParser.cs rename to src/TriasDev.Templify/Conditionals/Engine/ConditionParser.cs diff --git a/TriasDev.Templify/Conditionals/Engine/ConditionToken.cs b/src/TriasDev.Templify/Conditionals/Engine/ConditionToken.cs similarity index 100% rename from TriasDev.Templify/Conditionals/Engine/ConditionToken.cs rename to src/TriasDev.Templify/Conditionals/Engine/ConditionToken.cs diff --git a/TriasDev.Templify/Conditionals/Engine/ConditionValueOps.cs b/src/TriasDev.Templify/Conditionals/Engine/ConditionValueOps.cs similarity index 100% rename from TriasDev.Templify/Conditionals/Engine/ConditionValueOps.cs rename to src/TriasDev.Templify/Conditionals/Engine/ConditionValueOps.cs diff --git a/TriasDev.Templify/Conditionals/Engine/IConditionOperator.cs b/src/TriasDev.Templify/Conditionals/Engine/IConditionOperator.cs similarity index 100% rename from TriasDev.Templify/Conditionals/Engine/IConditionOperator.cs rename to src/TriasDev.Templify/Conditionals/Engine/IConditionOperator.cs diff --git a/TriasDev.Templify/Conditionals/Engine/OperatorFixity.cs b/src/TriasDev.Templify/Conditionals/Engine/OperatorFixity.cs similarity index 100% rename from TriasDev.Templify/Conditionals/Engine/OperatorFixity.cs rename to src/TriasDev.Templify/Conditionals/Engine/OperatorFixity.cs diff --git a/TriasDev.Templify/Conditionals/Engine/OperatorPrecedence.cs b/src/TriasDev.Templify/Conditionals/Engine/OperatorPrecedence.cs similarity index 100% rename from TriasDev.Templify/Conditionals/Engine/OperatorPrecedence.cs rename to src/TriasDev.Templify/Conditionals/Engine/OperatorPrecedence.cs diff --git a/TriasDev.Templify/Conditionals/Engine/Operators/ComparisonOperators.cs b/src/TriasDev.Templify/Conditionals/Engine/Operators/ComparisonOperators.cs similarity index 100% rename from TriasDev.Templify/Conditionals/Engine/Operators/ComparisonOperators.cs rename to src/TriasDev.Templify/Conditionals/Engine/Operators/ComparisonOperators.cs diff --git a/TriasDev.Templify/Conditionals/Engine/Operators/ExistenceOperators.cs b/src/TriasDev.Templify/Conditionals/Engine/Operators/ExistenceOperators.cs similarity index 100% rename from TriasDev.Templify/Conditionals/Engine/Operators/ExistenceOperators.cs rename to src/TriasDev.Templify/Conditionals/Engine/Operators/ExistenceOperators.cs diff --git a/TriasDev.Templify/Conditionals/Engine/Operators/LogicalOperators.cs b/src/TriasDev.Templify/Conditionals/Engine/Operators/LogicalOperators.cs similarity index 100% rename from TriasDev.Templify/Conditionals/Engine/Operators/LogicalOperators.cs rename to src/TriasDev.Templify/Conditionals/Engine/Operators/LogicalOperators.cs diff --git a/TriasDev.Templify/Conditionals/Engine/Operators/MembershipOperator.cs b/src/TriasDev.Templify/Conditionals/Engine/Operators/MembershipOperator.cs similarity index 100% rename from TriasDev.Templify/Conditionals/Engine/Operators/MembershipOperator.cs rename to src/TriasDev.Templify/Conditionals/Engine/Operators/MembershipOperator.cs diff --git a/TriasDev.Templify/Conditionals/Engine/Operators/StringOperators.cs b/src/TriasDev.Templify/Conditionals/Engine/Operators/StringOperators.cs similarity index 100% rename from TriasDev.Templify/Conditionals/Engine/Operators/StringOperators.cs rename to src/TriasDev.Templify/Conditionals/Engine/Operators/StringOperators.cs diff --git a/TriasDev.Templify/Conditionals/IConditionContext.cs b/src/TriasDev.Templify/Conditionals/IConditionContext.cs similarity index 100% rename from TriasDev.Templify/Conditionals/IConditionContext.cs rename to src/TriasDev.Templify/Conditionals/IConditionContext.cs diff --git a/TriasDev.Templify/Conditionals/IConditionEvaluator.cs b/src/TriasDev.Templify/Conditionals/IConditionEvaluator.cs similarity index 100% rename from TriasDev.Templify/Conditionals/IConditionEvaluator.cs rename to src/TriasDev.Templify/Conditionals/IConditionEvaluator.cs diff --git a/TriasDev.Templify/Conditionals/InlineConditionalParser.cs b/src/TriasDev.Templify/Conditionals/InlineConditionalParser.cs similarity index 100% rename from TriasDev.Templify/Conditionals/InlineConditionalParser.cs rename to src/TriasDev.Templify/Conditionals/InlineConditionalParser.cs diff --git a/TriasDev.Templify/Core/DocumentProperties.cs b/src/TriasDev.Templify/Core/DocumentProperties.cs similarity index 100% rename from TriasDev.Templify/Core/DocumentProperties.cs rename to src/TriasDev.Templify/Core/DocumentProperties.cs diff --git a/TriasDev.Templify/Core/DocumentTemplateProcessor.cs b/src/TriasDev.Templify/Core/DocumentTemplateProcessor.cs similarity index 100% rename from TriasDev.Templify/Core/DocumentTemplateProcessor.cs rename to src/TriasDev.Templify/Core/DocumentTemplateProcessor.cs diff --git a/TriasDev.Templify/Core/GlobalEvaluationContext.cs b/src/TriasDev.Templify/Core/GlobalEvaluationContext.cs similarity index 100% rename from TriasDev.Templify/Core/GlobalEvaluationContext.cs rename to src/TriasDev.Templify/Core/GlobalEvaluationContext.cs diff --git a/TriasDev.Templify/Core/IEvaluationContext.cs b/src/TriasDev.Templify/Core/IEvaluationContext.cs similarity index 100% rename from TriasDev.Templify/Core/IEvaluationContext.cs rename to src/TriasDev.Templify/Core/IEvaluationContext.cs diff --git a/TriasDev.Templify/Core/IWarningCollector.cs b/src/TriasDev.Templify/Core/IWarningCollector.cs similarity index 100% rename from TriasDev.Templify/Core/IWarningCollector.cs rename to src/TriasDev.Templify/Core/IWarningCollector.cs diff --git a/TriasDev.Templify/Core/InlineExpressionValidation.cs b/src/TriasDev.Templify/Core/InlineExpressionValidation.cs similarity index 100% rename from TriasDev.Templify/Core/InlineExpressionValidation.cs rename to src/TriasDev.Templify/Core/InlineExpressionValidation.cs diff --git a/TriasDev.Templify/Core/MissingConditionVariableCheck.cs b/src/TriasDev.Templify/Core/MissingConditionVariableCheck.cs similarity index 100% rename from TriasDev.Templify/Core/MissingConditionVariableCheck.cs rename to src/TriasDev.Templify/Core/MissingConditionVariableCheck.cs diff --git a/TriasDev.Templify/Core/MissingVariableBehavior.cs b/src/TriasDev.Templify/Core/MissingVariableBehavior.cs similarity index 100% rename from TriasDev.Templify/Core/MissingVariableBehavior.cs rename to src/TriasDev.Templify/Core/MissingVariableBehavior.cs diff --git a/TriasDev.Templify/Core/OdtTemplateProcessor.cs b/src/TriasDev.Templify/Core/OdtTemplateProcessor.cs similarity index 100% rename from TriasDev.Templify/Core/OdtTemplateProcessor.cs rename to src/TriasDev.Templify/Core/OdtTemplateProcessor.cs diff --git a/TriasDev.Templify/Core/PlaceholderReplacementOptions.cs b/src/TriasDev.Templify/Core/PlaceholderReplacementOptions.cs similarity index 100% rename from TriasDev.Templify/Core/PlaceholderReplacementOptions.cs rename to src/TriasDev.Templify/Core/PlaceholderReplacementOptions.cs diff --git a/TriasDev.Templify/Core/ProcessingResult.cs b/src/TriasDev.Templify/Core/ProcessingResult.cs similarity index 100% rename from TriasDev.Templify/Core/ProcessingResult.cs rename to src/TriasDev.Templify/Core/ProcessingResult.cs diff --git a/TriasDev.Templify/Core/ProcessingWarning.cs b/src/TriasDev.Templify/Core/ProcessingWarning.cs similarity index 100% rename from TriasDev.Templify/Core/ProcessingWarning.cs rename to src/TriasDev.Templify/Core/ProcessingWarning.cs diff --git a/TriasDev.Templify/Core/ScopedVariableValidator.cs b/src/TriasDev.Templify/Core/ScopedVariableValidator.cs similarity index 100% rename from TriasDev.Templify/Core/ScopedVariableValidator.cs rename to src/TriasDev.Templify/Core/ScopedVariableValidator.cs diff --git a/TriasDev.Templify/Core/TemplateExceptions.cs b/src/TriasDev.Templify/Core/TemplateExceptions.cs similarity index 100% rename from TriasDev.Templify/Core/TemplateExceptions.cs rename to src/TriasDev.Templify/Core/TemplateExceptions.cs diff --git a/TriasDev.Templify/Core/TemplateFormat.cs b/src/TriasDev.Templify/Core/TemplateFormat.cs similarity index 100% rename from TriasDev.Templify/Core/TemplateFormat.cs rename to src/TriasDev.Templify/Core/TemplateFormat.cs diff --git a/TriasDev.Templify/Core/TemplateFormatDetector.cs b/src/TriasDev.Templify/Core/TemplateFormatDetector.cs similarity index 100% rename from TriasDev.Templify/Core/TemplateFormatDetector.cs rename to src/TriasDev.Templify/Core/TemplateFormatDetector.cs diff --git a/TriasDev.Templify/Core/TemplateProcessor.cs b/src/TriasDev.Templify/Core/TemplateProcessor.cs similarity index 100% rename from TriasDev.Templify/Core/TemplateProcessor.cs rename to src/TriasDev.Templify/Core/TemplateProcessor.cs diff --git a/TriasDev.Templify/Core/TemplateValidator.cs b/src/TriasDev.Templify/Core/TemplateValidator.cs similarity index 100% rename from TriasDev.Templify/Core/TemplateValidator.cs rename to src/TriasDev.Templify/Core/TemplateValidator.cs diff --git a/TriasDev.Templify/Core/TextProcessingResult.cs b/src/TriasDev.Templify/Core/TextProcessingResult.cs similarity index 100% rename from TriasDev.Templify/Core/TextProcessingResult.cs rename to src/TriasDev.Templify/Core/TextProcessingResult.cs diff --git a/TriasDev.Templify/Core/TextTemplateProcessor.cs b/src/TriasDev.Templify/Core/TextTemplateProcessor.cs similarity index 100% rename from TriasDev.Templify/Core/TextTemplateProcessor.cs rename to src/TriasDev.Templify/Core/TextTemplateProcessor.cs diff --git a/TriasDev.Templify/Core/UpdateFieldsOnOpenMode.cs b/src/TriasDev.Templify/Core/UpdateFieldsOnOpenMode.cs similarity index 100% rename from TriasDev.Templify/Core/UpdateFieldsOnOpenMode.cs rename to src/TriasDev.Templify/Core/UpdateFieldsOnOpenMode.cs diff --git a/TriasDev.Templify/Core/ValidationResult.cs b/src/TriasDev.Templify/Core/ValidationResult.cs similarity index 100% rename from TriasDev.Templify/Core/ValidationResult.cs rename to src/TriasDev.Templify/Core/ValidationResult.cs diff --git a/TriasDev.Templify/Core/WarningReportGenerator.cs b/src/TriasDev.Templify/Core/WarningReportGenerator.cs similarity index 100% rename from TriasDev.Templify/Core/WarningReportGenerator.cs rename to src/TriasDev.Templify/Core/WarningReportGenerator.cs diff --git a/TriasDev.Templify/Examples.md b/src/TriasDev.Templify/Examples.md similarity index 100% rename from TriasDev.Templify/Examples.md rename to src/TriasDev.Templify/Examples.md diff --git a/TriasDev.Templify/Formatting/BooleanFormatter.cs b/src/TriasDev.Templify/Formatting/BooleanFormatter.cs similarity index 100% rename from TriasDev.Templify/Formatting/BooleanFormatter.cs rename to src/TriasDev.Templify/Formatting/BooleanFormatter.cs diff --git a/TriasDev.Templify/Formatting/BooleanFormatterRegistry.cs b/src/TriasDev.Templify/Formatting/BooleanFormatterRegistry.cs similarity index 100% rename from TriasDev.Templify/Formatting/BooleanFormatterRegistry.cs rename to src/TriasDev.Templify/Formatting/BooleanFormatterRegistry.cs diff --git a/TriasDev.Templify/Loops/LoopBlock.cs b/src/TriasDev.Templify/Loops/LoopBlock.cs similarity index 100% rename from TriasDev.Templify/Loops/LoopBlock.cs rename to src/TriasDev.Templify/Loops/LoopBlock.cs diff --git a/TriasDev.Templify/Loops/LoopContext.cs b/src/TriasDev.Templify/Loops/LoopContext.cs similarity index 100% rename from TriasDev.Templify/Loops/LoopContext.cs rename to src/TriasDev.Templify/Loops/LoopContext.cs diff --git a/TriasDev.Templify/Loops/LoopDetector.cs b/src/TriasDev.Templify/Loops/LoopDetector.cs similarity index 100% rename from TriasDev.Templify/Loops/LoopDetector.cs rename to src/TriasDev.Templify/Loops/LoopDetector.cs diff --git a/TriasDev.Templify/Loops/LoopEvaluationContext.cs b/src/TriasDev.Templify/Loops/LoopEvaluationContext.cs similarity index 100% rename from TriasDev.Templify/Loops/LoopEvaluationContext.cs rename to src/TriasDev.Templify/Loops/LoopEvaluationContext.cs diff --git a/TriasDev.Templify/Markdown/MarkdownParser.cs b/src/TriasDev.Templify/Markdown/MarkdownParser.cs similarity index 100% rename from TriasDev.Templify/Markdown/MarkdownParser.cs rename to src/TriasDev.Templify/Markdown/MarkdownParser.cs diff --git a/TriasDev.Templify/Markdown/MarkdownSegment.cs b/src/TriasDev.Templify/Markdown/MarkdownSegment.cs similarity index 100% rename from TriasDev.Templify/Markdown/MarkdownSegment.cs rename to src/TriasDev.Templify/Markdown/MarkdownSegment.cs diff --git a/TriasDev.Templify/OpenDocument/OdfNames.cs b/src/TriasDev.Templify/OpenDocument/OdfNames.cs similarity index 100% rename from TriasDev.Templify/OpenDocument/OdfNames.cs rename to src/TriasDev.Templify/OpenDocument/OdfNames.cs diff --git a/TriasDev.Templify/OpenDocument/OdtConditionalBlock.cs b/src/TriasDev.Templify/OpenDocument/OdtConditionalBlock.cs similarity index 100% rename from TriasDev.Templify/OpenDocument/OdtConditionalBlock.cs rename to src/TriasDev.Templify/OpenDocument/OdtConditionalBlock.cs diff --git a/TriasDev.Templify/OpenDocument/OdtConditionalDetector.cs b/src/TriasDev.Templify/OpenDocument/OdtConditionalDetector.cs similarity index 100% rename from TriasDev.Templify/OpenDocument/OdtConditionalDetector.cs rename to src/TriasDev.Templify/OpenDocument/OdtConditionalDetector.cs diff --git a/TriasDev.Templify/OpenDocument/OdtConditionalProcessor.cs b/src/TriasDev.Templify/OpenDocument/OdtConditionalProcessor.cs similarity index 100% rename from TriasDev.Templify/OpenDocument/OdtConditionalProcessor.cs rename to src/TriasDev.Templify/OpenDocument/OdtConditionalProcessor.cs diff --git a/TriasDev.Templify/OpenDocument/OdtDocumentProperties.cs b/src/TriasDev.Templify/OpenDocument/OdtDocumentProperties.cs similarity index 100% rename from TriasDev.Templify/OpenDocument/OdtDocumentProperties.cs rename to src/TriasDev.Templify/OpenDocument/OdtDocumentProperties.cs diff --git a/TriasDev.Templify/OpenDocument/OdtLoopDetector.cs b/src/TriasDev.Templify/OpenDocument/OdtLoopDetector.cs similarity index 100% rename from TriasDev.Templify/OpenDocument/OdtLoopDetector.cs rename to src/TriasDev.Templify/OpenDocument/OdtLoopDetector.cs diff --git a/TriasDev.Templify/OpenDocument/OdtMarkerText.cs b/src/TriasDev.Templify/OpenDocument/OdtMarkerText.cs similarity index 100% rename from TriasDev.Templify/OpenDocument/OdtMarkerText.cs rename to src/TriasDev.Templify/OpenDocument/OdtMarkerText.cs diff --git a/TriasDev.Templify/OpenDocument/OdtPackage.cs b/src/TriasDev.Templify/OpenDocument/OdtPackage.cs similarity index 100% rename from TriasDev.Templify/OpenDocument/OdtPackage.cs rename to src/TriasDev.Templify/OpenDocument/OdtPackage.cs diff --git a/TriasDev.Templify/OpenDocument/OdtParagraphTextModel.cs b/src/TriasDev.Templify/OpenDocument/OdtParagraphTextModel.cs similarity index 100% rename from TriasDev.Templify/OpenDocument/OdtParagraphTextModel.cs rename to src/TriasDev.Templify/OpenDocument/OdtParagraphTextModel.cs diff --git a/TriasDev.Templify/OpenDocument/OdtParagraphTextRewriter.cs b/src/TriasDev.Templify/OpenDocument/OdtParagraphTextRewriter.cs similarity index 100% rename from TriasDev.Templify/OpenDocument/OdtParagraphTextRewriter.cs rename to src/TriasDev.Templify/OpenDocument/OdtParagraphTextRewriter.cs diff --git a/TriasDev.Templify/OpenDocument/OdtPlaceholderProcessor.cs b/src/TriasDev.Templify/OpenDocument/OdtPlaceholderProcessor.cs similarity index 100% rename from TriasDev.Templify/OpenDocument/OdtPlaceholderProcessor.cs rename to src/TriasDev.Templify/OpenDocument/OdtPlaceholderProcessor.cs diff --git a/TriasDev.Templify/OpenDocument/OdtTemplateEngine.cs b/src/TriasDev.Templify/OpenDocument/OdtTemplateEngine.cs similarity index 100% rename from TriasDev.Templify/OpenDocument/OdtTemplateEngine.cs rename to src/TriasDev.Templify/OpenDocument/OdtTemplateEngine.cs diff --git a/TriasDev.Templify/OpenDocument/OdtTemplateValidator.cs b/src/TriasDev.Templify/OpenDocument/OdtTemplateValidator.cs similarity index 100% rename from TriasDev.Templify/OpenDocument/OdtTemplateValidator.cs rename to src/TriasDev.Templify/OpenDocument/OdtTemplateValidator.cs diff --git a/TriasDev.Templify/OpenDocument/OdtTextStyles.cs b/src/TriasDev.Templify/OpenDocument/OdtTextStyles.cs similarity index 100% rename from TriasDev.Templify/OpenDocument/OdtTextStyles.cs rename to src/TriasDev.Templify/OpenDocument/OdtTextStyles.cs diff --git a/TriasDev.Templify/OpenDocument/OdtUniqueNames.cs b/src/TriasDev.Templify/OpenDocument/OdtUniqueNames.cs similarity index 100% rename from TriasDev.Templify/OpenDocument/OdtUniqueNames.cs rename to src/TriasDev.Templify/OpenDocument/OdtUniqueNames.cs diff --git a/TriasDev.Templify/PERFORMANCE.md b/src/TriasDev.Templify/PERFORMANCE.md similarity index 99% rename from TriasDev.Templify/PERFORMANCE.md rename to src/TriasDev.Templify/PERFORMANCE.md index b770ad4..fdd3f67 100644 --- a/TriasDev.Templify/PERFORMANCE.md +++ b/src/TriasDev.Templify/PERFORMANCE.md @@ -4,7 +4,7 @@ > BenchmarkDotNet 0.15.6) and have not been re-measured since. Later releases changed the condition engine (1.7.0), > the text rewriting and caching (1.8.0) and the target frameworks, so treat the figures as orders of magnitude, not as > current results. To measure the current code, run the benchmarks yourself: -> `dotnet run --project TriasDev.Templify.Benchmarks/TriasDev.Templify.Benchmarks.csproj -c Release` +> `dotnet run --project benchmarks/TriasDev.Templify.Benchmarks/TriasDev.Templify.Benchmarks.csproj -c Release` > (BenchmarkDotNet output is written to `BenchmarkDotNet.Artifacts/` and is not committed). **Date**: 2025-11-09 diff --git a/TriasDev.Templify/Placeholders/ExpressionPlaceholderEvaluator.cs b/src/TriasDev.Templify/Placeholders/ExpressionPlaceholderEvaluator.cs similarity index 100% rename from TriasDev.Templify/Placeholders/ExpressionPlaceholderEvaluator.cs rename to src/TriasDev.Templify/Placeholders/ExpressionPlaceholderEvaluator.cs diff --git a/TriasDev.Templify/Placeholders/PlaceholderFinder.cs b/src/TriasDev.Templify/Placeholders/PlaceholderFinder.cs similarity index 100% rename from TriasDev.Templify/Placeholders/PlaceholderFinder.cs rename to src/TriasDev.Templify/Placeholders/PlaceholderFinder.cs diff --git a/TriasDev.Templify/Placeholders/PlaceholderMatch.cs b/src/TriasDev.Templify/Placeholders/PlaceholderMatch.cs similarity index 100% rename from TriasDev.Templify/Placeholders/PlaceholderMatch.cs rename to src/TriasDev.Templify/Placeholders/PlaceholderMatch.cs diff --git a/TriasDev.Templify/Placeholders/PlaceholderScanner.cs b/src/TriasDev.Templify/Placeholders/PlaceholderScanner.cs similarity index 100% rename from TriasDev.Templify/Placeholders/PlaceholderScanner.cs rename to src/TriasDev.Templify/Placeholders/PlaceholderScanner.cs diff --git a/TriasDev.Templify/Placeholders/PlaceholderToken.cs b/src/TriasDev.Templify/Placeholders/PlaceholderToken.cs similarity index 100% rename from TriasDev.Templify/Placeholders/PlaceholderToken.cs rename to src/TriasDev.Templify/Placeholders/PlaceholderToken.cs diff --git a/TriasDev.Templify/Placeholders/ValueConverter.cs b/src/TriasDev.Templify/Placeholders/ValueConverter.cs similarity index 100% rename from TriasDev.Templify/Placeholders/ValueConverter.cs rename to src/TriasDev.Templify/Placeholders/ValueConverter.cs diff --git a/TriasDev.Templify/Placeholders/ValueResolver.cs b/src/TriasDev.Templify/Placeholders/ValueResolver.cs similarity index 100% rename from TriasDev.Templify/Placeholders/ValueResolver.cs rename to src/TriasDev.Templify/Placeholders/ValueResolver.cs diff --git a/TriasDev.Templify/PropertyPaths/PropertyPath.cs b/src/TriasDev.Templify/PropertyPaths/PropertyPath.cs similarity index 100% rename from TriasDev.Templify/PropertyPaths/PropertyPath.cs rename to src/TriasDev.Templify/PropertyPaths/PropertyPath.cs diff --git a/TriasDev.Templify/PropertyPaths/PropertyPathResolver.cs b/src/TriasDev.Templify/PropertyPaths/PropertyPathResolver.cs similarity index 100% rename from TriasDev.Templify/PropertyPaths/PropertyPathResolver.cs rename to src/TriasDev.Templify/PropertyPaths/PropertyPathResolver.cs diff --git a/TriasDev.Templify/PropertyPaths/PropertyPathSegment.cs b/src/TriasDev.Templify/PropertyPaths/PropertyPathSegment.cs similarity index 100% rename from TriasDev.Templify/PropertyPaths/PropertyPathSegment.cs rename to src/TriasDev.Templify/PropertyPaths/PropertyPathSegment.cs diff --git a/TriasDev.Templify/PublicAPI.Shipped.txt b/src/TriasDev.Templify/PublicAPI.Shipped.txt similarity index 100% rename from TriasDev.Templify/PublicAPI.Shipped.txt rename to src/TriasDev.Templify/PublicAPI.Shipped.txt diff --git a/TriasDev.Templify/PublicAPI.Unshipped.txt b/src/TriasDev.Templify/PublicAPI.Unshipped.txt similarity index 100% rename from TriasDev.Templify/PublicAPI.Unshipped.txt rename to src/TriasDev.Templify/PublicAPI.Unshipped.txt diff --git a/TriasDev.Templify/README.md b/src/TriasDev.Templify/README.md similarity index 99% rename from TriasDev.Templify/README.md rename to src/TriasDev.Templify/README.md index 1110d9e..bc82b43 100644 --- a/TriasDev.Templify/README.md +++ b/src/TriasDev.Templify/README.md @@ -1445,6 +1445,6 @@ Contributions are welcome! See the [contribution guidelines](https://github.com/ ## See Also - [Online Documentation](https://triasdev.github.io/templify/) - Guides for template authors and developers -- [Examples](https://github.com/TriasDev/templify/blob/main/TriasDev.Templify/Examples.md) - More code samples and use cases -- [Architecture Documentation](https://github.com/TriasDev/templify/blob/main/TriasDev.Templify/ARCHITECTURE.md) - Design and implementation details +- [Examples](https://github.com/TriasDev/templify/blob/main/src/TriasDev.Templify/Examples.md) - More code samples and use cases +- [Architecture Documentation](https://github.com/TriasDev/templify/blob/main/src/TriasDev.Templify/ARCHITECTURE.md) - Design and implementation details - [Changelog](https://github.com/TriasDev/templify/blob/main/CHANGELOG.md) diff --git a/TriasDev.Templify/Replacements/TextReplacements.cs b/src/TriasDev.Templify/Replacements/TextReplacements.cs similarity index 100% rename from TriasDev.Templify/Replacements/TextReplacements.cs rename to src/TriasDev.Templify/Replacements/TextReplacements.cs diff --git a/TriasDev.Templify/Resources/WarningReportTemplate.docx b/src/TriasDev.Templify/Resources/WarningReportTemplate.docx similarity index 100% rename from TriasDev.Templify/Resources/WarningReportTemplate.docx rename to src/TriasDev.Templify/Resources/WarningReportTemplate.docx diff --git a/TriasDev.Templify/TriasDev.Templify.csproj b/src/TriasDev.Templify/TriasDev.Templify.csproj similarity index 51% rename from TriasDev.Templify/TriasDev.Templify.csproj rename to src/TriasDev.Templify/TriasDev.Templify.csproj index b0002e2..0934caf 100644 --- a/TriasDev.Templify/TriasDev.Templify.csproj +++ b/src/TriasDev.Templify/TriasDev.Templify.csproj @@ -5,48 +5,22 @@ with a release-notes notice (net6.0 dropped in 1.8.0, see #154). --> net10.0;net9.0;net8.0 - - true $(NoWarn);RS0026;RS0027 - - $(WarningsAsErrors);RS0016;RS0017 - + TriasDev.Templify 1.9.0 - TriasDev GmbH & Co. KG - TriasDev GmbH & Co. KG High-performance templating engine for .NET. Process Word documents (.docx), LibreOffice / OpenDocument Text documents (.odt, .ott) and plain text templates with the same powerful syntax. Replace placeholders, evaluate conditionals, and process loops without Microsoft Word or LibreOffice. Built on the OpenXML SDK; OpenDocument support needs no extra dependency. - Copyright © TriasDev GmbH & Co. KG - MIT - https://github.com/TriasDev/templify - https://github.com/TriasDev/templify - git word;docx;odt;ott;opendocument;libreoffice;template;openxml;document-generation;templating;word-documents;office;dotnet;email;text-templates - README.md - icon.png - true 1.9.0 - - - true - snupkg - true - true - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - @@ -55,7 +29,6 @@ - diff --git a/TriasDev.Templify/Utilities/DrawingIdAllocator.cs b/src/TriasDev.Templify/Utilities/DrawingIdAllocator.cs similarity index 100% rename from TriasDev.Templify/Utilities/DrawingIdAllocator.cs rename to src/TriasDev.Templify/Utilities/DrawingIdAllocator.cs diff --git a/TriasDev.Templify/Utilities/FormattingPreserver.cs b/src/TriasDev.Templify/Utilities/FormattingPreserver.cs similarity index 100% rename from TriasDev.Templify/Utilities/FormattingPreserver.cs rename to src/TriasDev.Templify/Utilities/FormattingPreserver.cs diff --git a/TriasDev.Templify/Utilities/JsonDataParser.cs b/src/TriasDev.Templify/Utilities/JsonDataParser.cs similarity index 100% rename from TriasDev.Templify/Utilities/JsonDataParser.cs rename to src/TriasDev.Templify/Utilities/JsonDataParser.cs diff --git a/TriasDev.Templify/Utilities/NumericValue.cs b/src/TriasDev.Templify/Utilities/NumericValue.cs similarity index 100% rename from TriasDev.Templify/Utilities/NumericValue.cs rename to src/TriasDev.Templify/Utilities/NumericValue.cs diff --git a/TriasDev.Templify/Utilities/ParagraphTextModel.cs b/src/TriasDev.Templify/Utilities/ParagraphTextModel.cs similarity index 100% rename from TriasDev.Templify/Utilities/ParagraphTextModel.cs rename to src/TriasDev.Templify/Utilities/ParagraphTextModel.cs diff --git a/TriasDev.Templify/Utilities/ParagraphTextRewriter.cs b/src/TriasDev.Templify/Utilities/ParagraphTextRewriter.cs similarity index 100% rename from TriasDev.Templify/Utilities/ParagraphTextRewriter.cs rename to src/TriasDev.Templify/Utilities/ParagraphTextRewriter.cs diff --git a/TriasDev.Templify/Utilities/ReplacementContent.cs b/src/TriasDev.Templify/Utilities/ReplacementContent.cs similarity index 100% rename from TriasDev.Templify/Utilities/ReplacementContent.cs rename to src/TriasDev.Templify/Utilities/ReplacementContent.cs diff --git a/TriasDev.Templify/Utilities/TemplateElementText.cs b/src/TriasDev.Templify/Utilities/TemplateElementText.cs similarity index 100% rename from TriasDev.Templify/Utilities/TemplateElementText.cs rename to src/TriasDev.Templify/Utilities/TemplateElementText.cs diff --git a/TriasDev.Templify/Utilities/XmlCharacterSanitizer.cs b/src/TriasDev.Templify/Utilities/XmlCharacterSanitizer.cs similarity index 100% rename from TriasDev.Templify/Utilities/XmlCharacterSanitizer.cs rename to src/TriasDev.Templify/Utilities/XmlCharacterSanitizer.cs diff --git a/TriasDev.Templify/Visitors/CompositeVisitor.cs b/src/TriasDev.Templify/Visitors/CompositeVisitor.cs similarity index 100% rename from TriasDev.Templify/Visitors/CompositeVisitor.cs rename to src/TriasDev.Templify/Visitors/CompositeVisitor.cs diff --git a/TriasDev.Templify/Visitors/ConditionalVisitor.cs b/src/TriasDev.Templify/Visitors/ConditionalVisitor.cs similarity index 100% rename from TriasDev.Templify/Visitors/ConditionalVisitor.cs rename to src/TriasDev.Templify/Visitors/ConditionalVisitor.cs diff --git a/TriasDev.Templify/Visitors/DocumentWalker.cs b/src/TriasDev.Templify/Visitors/DocumentWalker.cs similarity index 100% rename from TriasDev.Templify/Visitors/DocumentWalker.cs rename to src/TriasDev.Templify/Visitors/DocumentWalker.cs diff --git a/TriasDev.Templify/Visitors/ITemplateElementVisitor.cs b/src/TriasDev.Templify/Visitors/ITemplateElementVisitor.cs similarity index 100% rename from TriasDev.Templify/Visitors/ITemplateElementVisitor.cs rename to src/TriasDev.Templify/Visitors/ITemplateElementVisitor.cs diff --git a/TriasDev.Templify/Visitors/LoopVisitor.cs b/src/TriasDev.Templify/Visitors/LoopVisitor.cs similarity index 100% rename from TriasDev.Templify/Visitors/LoopVisitor.cs rename to src/TriasDev.Templify/Visitors/LoopVisitor.cs diff --git a/TriasDev.Templify/Visitors/PlaceholderVisitor.cs b/src/TriasDev.Templify/Visitors/PlaceholderVisitor.cs similarity index 100% rename from TriasDev.Templify/Visitors/PlaceholderVisitor.cs rename to src/TriasDev.Templify/Visitors/PlaceholderVisitor.cs diff --git a/TriasDev.Templify/Visitors/TemplateElementHelper.cs b/src/TriasDev.Templify/Visitors/TemplateElementHelper.cs similarity index 100% rename from TriasDev.Templify/Visitors/TemplateElementHelper.cs rename to src/TriasDev.Templify/Visitors/TemplateElementHelper.cs diff --git a/TriasDev.Templify/Visitors/TemplateElementType.cs b/src/TriasDev.Templify/Visitors/TemplateElementType.cs similarity index 100% rename from TriasDev.Templify/Visitors/TemplateElementType.cs rename to src/TriasDev.Templify/Visitors/TemplateElementType.cs diff --git a/TriasDev.Templify/Visitors/TemplatePipeline.cs b/src/TriasDev.Templify/Visitors/TemplatePipeline.cs similarity index 100% rename from TriasDev.Templify/Visitors/TemplatePipeline.cs rename to src/TriasDev.Templify/Visitors/TemplatePipeline.cs diff --git a/TriasDev.Templify/packages.lock.json b/src/TriasDev.Templify/packages.lock.json similarity index 100% rename from TriasDev.Templify/packages.lock.json rename to src/TriasDev.Templify/packages.lock.json diff --git a/templify.sln b/templify.sln deleted file mode 100644 index 5fd5afd..0000000 --- a/templify.sln +++ /dev/null @@ -1,149 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.5.2.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TriasDev.Templify.Benchmarks", "TriasDev.Templify.Benchmarks\TriasDev.Templify.Benchmarks.csproj", "{7A170310-281D-9525-66F7-97498782411B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TriasDev.Templify.Converter", "TriasDev.Templify.Converter\TriasDev.Templify.Converter.csproj", "{49697802-1EB4-4AA8-BF38-FBEEA02E60BF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TriasDev.Templify", "TriasDev.Templify\TriasDev.Templify.csproj", "{237238EC-CA12-9D4E-29A3-C4D77F9D01F7}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TriasDev.Templify.Gui", "TriasDev.Templify.Gui\TriasDev.Templify.Gui.csproj", "{E5379E7F-E25D-C339-0251-27BA786CE2A2}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TriasDev.Templify.Tests", "TriasDev.Templify.Tests\TriasDev.Templify.Tests.csproj", "{E799BDE9-A7BD-6FB5-DE8C-1FEA7D02AD17}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TriasDev.Templify.Demo", "TriasDev.Templify.Demo\TriasDev.Templify.Demo.csproj", "{F41CA42C-7800-B89F-9679-B55C9289EF01}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TriasDev.Templify.DocumentGenerator", "TriasDev.Templify.DocumentGenerator\TriasDev.Templify.DocumentGenerator.csproj", "{E3260025-7AAB-495F-B7B9-0D820E45932F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TriasDev.Templify.Converter.Tests", "TriasDev.Templify.Converter.Tests\TriasDev.Templify.Converter.Tests.csproj", "{05D7DF30-AFD9-47B6-A544-D312EBDB36C3}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TriasDev.Templify.Tools.Tests", "TriasDev.Templify.Tools.Tests\TriasDev.Templify.Tools.Tests.csproj", "{FEBDF9FE-1ADE-4347-830E-7BA570C238D8}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {7A170310-281D-9525-66F7-97498782411B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7A170310-281D-9525-66F7-97498782411B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7A170310-281D-9525-66F7-97498782411B}.Debug|x64.ActiveCfg = Debug|Any CPU - {7A170310-281D-9525-66F7-97498782411B}.Debug|x64.Build.0 = Debug|Any CPU - {7A170310-281D-9525-66F7-97498782411B}.Debug|x86.ActiveCfg = Debug|Any CPU - {7A170310-281D-9525-66F7-97498782411B}.Debug|x86.Build.0 = Debug|Any CPU - {7A170310-281D-9525-66F7-97498782411B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7A170310-281D-9525-66F7-97498782411B}.Release|Any CPU.Build.0 = Release|Any CPU - {7A170310-281D-9525-66F7-97498782411B}.Release|x64.ActiveCfg = Release|Any CPU - {7A170310-281D-9525-66F7-97498782411B}.Release|x64.Build.0 = Release|Any CPU - {7A170310-281D-9525-66F7-97498782411B}.Release|x86.ActiveCfg = Release|Any CPU - {7A170310-281D-9525-66F7-97498782411B}.Release|x86.Build.0 = Release|Any CPU - {49697802-1EB4-4AA8-BF38-FBEEA02E60BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {49697802-1EB4-4AA8-BF38-FBEEA02E60BF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {49697802-1EB4-4AA8-BF38-FBEEA02E60BF}.Debug|x64.ActiveCfg = Debug|Any CPU - {49697802-1EB4-4AA8-BF38-FBEEA02E60BF}.Debug|x64.Build.0 = Debug|Any CPU - {49697802-1EB4-4AA8-BF38-FBEEA02E60BF}.Debug|x86.ActiveCfg = Debug|Any CPU - {49697802-1EB4-4AA8-BF38-FBEEA02E60BF}.Debug|x86.Build.0 = Debug|Any CPU - {49697802-1EB4-4AA8-BF38-FBEEA02E60BF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {49697802-1EB4-4AA8-BF38-FBEEA02E60BF}.Release|Any CPU.Build.0 = Release|Any CPU - {49697802-1EB4-4AA8-BF38-FBEEA02E60BF}.Release|x64.ActiveCfg = Release|Any CPU - {49697802-1EB4-4AA8-BF38-FBEEA02E60BF}.Release|x64.Build.0 = Release|Any CPU - {49697802-1EB4-4AA8-BF38-FBEEA02E60BF}.Release|x86.ActiveCfg = Release|Any CPU - {49697802-1EB4-4AA8-BF38-FBEEA02E60BF}.Release|x86.Build.0 = Release|Any CPU - {237238EC-CA12-9D4E-29A3-C4D77F9D01F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {237238EC-CA12-9D4E-29A3-C4D77F9D01F7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {237238EC-CA12-9D4E-29A3-C4D77F9D01F7}.Debug|x64.ActiveCfg = Debug|Any CPU - {237238EC-CA12-9D4E-29A3-C4D77F9D01F7}.Debug|x64.Build.0 = Debug|Any CPU - {237238EC-CA12-9D4E-29A3-C4D77F9D01F7}.Debug|x86.ActiveCfg = Debug|Any CPU - {237238EC-CA12-9D4E-29A3-C4D77F9D01F7}.Debug|x86.Build.0 = Debug|Any CPU - {237238EC-CA12-9D4E-29A3-C4D77F9D01F7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {237238EC-CA12-9D4E-29A3-C4D77F9D01F7}.Release|Any CPU.Build.0 = Release|Any CPU - {237238EC-CA12-9D4E-29A3-C4D77F9D01F7}.Release|x64.ActiveCfg = Release|Any CPU - {237238EC-CA12-9D4E-29A3-C4D77F9D01F7}.Release|x64.Build.0 = Release|Any CPU - {237238EC-CA12-9D4E-29A3-C4D77F9D01F7}.Release|x86.ActiveCfg = Release|Any CPU - {237238EC-CA12-9D4E-29A3-C4D77F9D01F7}.Release|x86.Build.0 = Release|Any CPU - {E5379E7F-E25D-C339-0251-27BA786CE2A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E5379E7F-E25D-C339-0251-27BA786CE2A2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E5379E7F-E25D-C339-0251-27BA786CE2A2}.Debug|x64.ActiveCfg = Debug|Any CPU - {E5379E7F-E25D-C339-0251-27BA786CE2A2}.Debug|x64.Build.0 = Debug|Any CPU - {E5379E7F-E25D-C339-0251-27BA786CE2A2}.Debug|x86.ActiveCfg = Debug|Any CPU - {E5379E7F-E25D-C339-0251-27BA786CE2A2}.Debug|x86.Build.0 = Debug|Any CPU - {E5379E7F-E25D-C339-0251-27BA786CE2A2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E5379E7F-E25D-C339-0251-27BA786CE2A2}.Release|Any CPU.Build.0 = Release|Any CPU - {E5379E7F-E25D-C339-0251-27BA786CE2A2}.Release|x64.ActiveCfg = Release|Any CPU - {E5379E7F-E25D-C339-0251-27BA786CE2A2}.Release|x64.Build.0 = Release|Any CPU - {E5379E7F-E25D-C339-0251-27BA786CE2A2}.Release|x86.ActiveCfg = Release|Any CPU - {E5379E7F-E25D-C339-0251-27BA786CE2A2}.Release|x86.Build.0 = Release|Any CPU - {E799BDE9-A7BD-6FB5-DE8C-1FEA7D02AD17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E799BDE9-A7BD-6FB5-DE8C-1FEA7D02AD17}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E799BDE9-A7BD-6FB5-DE8C-1FEA7D02AD17}.Debug|x64.ActiveCfg = Debug|Any CPU - {E799BDE9-A7BD-6FB5-DE8C-1FEA7D02AD17}.Debug|x64.Build.0 = Debug|Any CPU - {E799BDE9-A7BD-6FB5-DE8C-1FEA7D02AD17}.Debug|x86.ActiveCfg = Debug|Any CPU - {E799BDE9-A7BD-6FB5-DE8C-1FEA7D02AD17}.Debug|x86.Build.0 = Debug|Any CPU - {E799BDE9-A7BD-6FB5-DE8C-1FEA7D02AD17}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E799BDE9-A7BD-6FB5-DE8C-1FEA7D02AD17}.Release|Any CPU.Build.0 = Release|Any CPU - {E799BDE9-A7BD-6FB5-DE8C-1FEA7D02AD17}.Release|x64.ActiveCfg = Release|Any CPU - {E799BDE9-A7BD-6FB5-DE8C-1FEA7D02AD17}.Release|x64.Build.0 = Release|Any CPU - {E799BDE9-A7BD-6FB5-DE8C-1FEA7D02AD17}.Release|x86.ActiveCfg = Release|Any CPU - {E799BDE9-A7BD-6FB5-DE8C-1FEA7D02AD17}.Release|x86.Build.0 = Release|Any CPU - {F41CA42C-7800-B89F-9679-B55C9289EF01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F41CA42C-7800-B89F-9679-B55C9289EF01}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F41CA42C-7800-B89F-9679-B55C9289EF01}.Debug|x64.ActiveCfg = Debug|Any CPU - {F41CA42C-7800-B89F-9679-B55C9289EF01}.Debug|x64.Build.0 = Debug|Any CPU - {F41CA42C-7800-B89F-9679-B55C9289EF01}.Debug|x86.ActiveCfg = Debug|Any CPU - {F41CA42C-7800-B89F-9679-B55C9289EF01}.Debug|x86.Build.0 = Debug|Any CPU - {F41CA42C-7800-B89F-9679-B55C9289EF01}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F41CA42C-7800-B89F-9679-B55C9289EF01}.Release|Any CPU.Build.0 = Release|Any CPU - {F41CA42C-7800-B89F-9679-B55C9289EF01}.Release|x64.ActiveCfg = Release|Any CPU - {F41CA42C-7800-B89F-9679-B55C9289EF01}.Release|x64.Build.0 = Release|Any CPU - {F41CA42C-7800-B89F-9679-B55C9289EF01}.Release|x86.ActiveCfg = Release|Any CPU - {F41CA42C-7800-B89F-9679-B55C9289EF01}.Release|x86.Build.0 = Release|Any CPU - {E3260025-7AAB-495F-B7B9-0D820E45932F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E3260025-7AAB-495F-B7B9-0D820E45932F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E3260025-7AAB-495F-B7B9-0D820E45932F}.Debug|x64.ActiveCfg = Debug|Any CPU - {E3260025-7AAB-495F-B7B9-0D820E45932F}.Debug|x64.Build.0 = Debug|Any CPU - {E3260025-7AAB-495F-B7B9-0D820E45932F}.Debug|x86.ActiveCfg = Debug|Any CPU - {E3260025-7AAB-495F-B7B9-0D820E45932F}.Debug|x86.Build.0 = Debug|Any CPU - {E3260025-7AAB-495F-B7B9-0D820E45932F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E3260025-7AAB-495F-B7B9-0D820E45932F}.Release|Any CPU.Build.0 = Release|Any CPU - {E3260025-7AAB-495F-B7B9-0D820E45932F}.Release|x64.ActiveCfg = Release|Any CPU - {E3260025-7AAB-495F-B7B9-0D820E45932F}.Release|x64.Build.0 = Release|Any CPU - {E3260025-7AAB-495F-B7B9-0D820E45932F}.Release|x86.ActiveCfg = Release|Any CPU - {E3260025-7AAB-495F-B7B9-0D820E45932F}.Release|x86.Build.0 = Release|Any CPU - {FEBDF9FE-1ADE-4347-830E-7BA570C238D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FEBDF9FE-1ADE-4347-830E-7BA570C238D8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FEBDF9FE-1ADE-4347-830E-7BA570C238D8}.Debug|x64.ActiveCfg = Debug|Any CPU - {FEBDF9FE-1ADE-4347-830E-7BA570C238D8}.Debug|x64.Build.0 = Debug|Any CPU - {FEBDF9FE-1ADE-4347-830E-7BA570C238D8}.Debug|x86.ActiveCfg = Debug|Any CPU - {FEBDF9FE-1ADE-4347-830E-7BA570C238D8}.Debug|x86.Build.0 = Debug|Any CPU - {FEBDF9FE-1ADE-4347-830E-7BA570C238D8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FEBDF9FE-1ADE-4347-830E-7BA570C238D8}.Release|Any CPU.Build.0 = Release|Any CPU - {FEBDF9FE-1ADE-4347-830E-7BA570C238D8}.Release|x64.ActiveCfg = Release|Any CPU - {FEBDF9FE-1ADE-4347-830E-7BA570C238D8}.Release|x64.Build.0 = Release|Any CPU - {FEBDF9FE-1ADE-4347-830E-7BA570C238D8}.Release|x86.ActiveCfg = Release|Any CPU - {FEBDF9FE-1ADE-4347-830E-7BA570C238D8}.Release|x86.Build.0 = Release|Any CPU - {05D7DF30-AFD9-47B6-A544-D312EBDB36C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {05D7DF30-AFD9-47B6-A544-D312EBDB36C3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {05D7DF30-AFD9-47B6-A544-D312EBDB36C3}.Debug|x64.ActiveCfg = Debug|Any CPU - {05D7DF30-AFD9-47B6-A544-D312EBDB36C3}.Debug|x64.Build.0 = Debug|Any CPU - {05D7DF30-AFD9-47B6-A544-D312EBDB36C3}.Debug|x86.ActiveCfg = Debug|Any CPU - {05D7DF30-AFD9-47B6-A544-D312EBDB36C3}.Debug|x86.Build.0 = Debug|Any CPU - {05D7DF30-AFD9-47B6-A544-D312EBDB36C3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {05D7DF30-AFD9-47B6-A544-D312EBDB36C3}.Release|Any CPU.Build.0 = Release|Any CPU - {05D7DF30-AFD9-47B6-A544-D312EBDB36C3}.Release|x64.ActiveCfg = Release|Any CPU - {05D7DF30-AFD9-47B6-A544-D312EBDB36C3}.Release|x64.Build.0 = Release|Any CPU - {05D7DF30-AFD9-47B6-A544-D312EBDB36C3}.Release|x86.ActiveCfg = Release|Any CPU - {05D7DF30-AFD9-47B6-A544-D312EBDB36C3}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {FE65F786-1BFA-4B1D-B9E1-0D927EDF539D} - EndGlobalSection -EndGlobal diff --git a/templify.slnx b/templify.slnx new file mode 100644 index 0000000..d9e3ce5 --- /dev/null +++ b/templify.slnx @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/TriasDev.Templify.Converter.Tests/TriasDev.Templify.Converter.Tests.csproj b/tests/Directory.Build.props similarity index 73% rename from TriasDev.Templify.Converter.Tests/TriasDev.Templify.Converter.Tests.csproj rename to tests/Directory.Build.props index b413b55..bda4471 100644 --- a/TriasDev.Templify.Converter.Tests/TriasDev.Templify.Converter.Tests.csproj +++ b/tests/Directory.Build.props @@ -1,7 +1,9 @@ - + + + + - net10.0 false Exe @@ -24,9 +26,4 @@ - - - - - diff --git a/TriasDev.Templify.Converter.Tests/CommandLineTests.cs b/tests/TriasDev.Templify.Converter.Tests/CommandLineTests.cs similarity index 100% rename from TriasDev.Templify.Converter.Tests/CommandLineTests.cs rename to tests/TriasDev.Templify.Converter.Tests/CommandLineTests.cs diff --git a/TriasDev.Templify.Converter.Tests/ConditionBuilderTests.cs b/tests/TriasDev.Templify.Converter.Tests/ConditionBuilderTests.cs similarity index 100% rename from TriasDev.Templify.Converter.Tests/ConditionBuilderTests.cs rename to tests/TriasDev.Templify.Converter.Tests/ConditionBuilderTests.cs diff --git a/TriasDev.Templify.Converter.Tests/ConditionalConverterTests.cs b/tests/TriasDev.Templify.Converter.Tests/ConditionalConverterTests.cs similarity index 100% rename from TriasDev.Templify.Converter.Tests/ConditionalConverterTests.cs rename to tests/TriasDev.Templify.Converter.Tests/ConditionalConverterTests.cs diff --git a/TriasDev.Templify.Converter.Tests/DocumentCleanerTests.cs b/tests/TriasDev.Templify.Converter.Tests/DocumentCleanerTests.cs similarity index 100% rename from TriasDev.Templify.Converter.Tests/DocumentCleanerTests.cs rename to tests/TriasDev.Templify.Converter.Tests/DocumentCleanerTests.cs diff --git a/TriasDev.Templify.Converter.Tests/RoundTripTests.cs b/tests/TriasDev.Templify.Converter.Tests/RoundTripTests.cs similarity index 100% rename from TriasDev.Templify.Converter.Tests/RoundTripTests.cs rename to tests/TriasDev.Templify.Converter.Tests/RoundTripTests.cs diff --git a/TriasDev.Templify.Converter.Tests/TemplateAnalyzerTests.cs b/tests/TriasDev.Templify.Converter.Tests/TemplateAnalyzerTests.cs similarity index 100% rename from TriasDev.Templify.Converter.Tests/TemplateAnalyzerTests.cs rename to tests/TriasDev.Templify.Converter.Tests/TemplateAnalyzerTests.cs diff --git a/TriasDev.Templify.Converter.Tests/TestDocuments.cs b/tests/TriasDev.Templify.Converter.Tests/TestDocuments.cs similarity index 100% rename from TriasDev.Templify.Converter.Tests/TestDocuments.cs rename to tests/TriasDev.Templify.Converter.Tests/TestDocuments.cs diff --git a/tests/TriasDev.Templify.Converter.Tests/TriasDev.Templify.Converter.Tests.csproj b/tests/TriasDev.Templify.Converter.Tests/TriasDev.Templify.Converter.Tests.csproj new file mode 100644 index 0000000..585a460 --- /dev/null +++ b/tests/TriasDev.Templify.Converter.Tests/TriasDev.Templify.Converter.Tests.csproj @@ -0,0 +1,12 @@ + + + + net10.0 + + + + + + + + diff --git a/TriasDev.Templify.Converter.Tests/packages.lock.json b/tests/TriasDev.Templify.Converter.Tests/packages.lock.json similarity index 100% rename from TriasDev.Templify.Converter.Tests/packages.lock.json rename to tests/TriasDev.Templify.Converter.Tests/packages.lock.json diff --git a/TriasDev.Templify.Tests/Conditionals/CollectBareOperandVariablesTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/CollectBareOperandVariablesTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/CollectBareOperandVariablesTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/CollectBareOperandVariablesTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/ConditionContextTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/ConditionContextTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/ConditionContextTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/ConditionContextTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/ConditionValidationIssueTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/ConditionValidationIssueTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/ConditionValidationIssueTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/ConditionValidationIssueTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/ConditionValidationTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/ConditionValidationTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/ConditionValidationTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/ConditionValidationTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/ConditionalBlockTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/ConditionalBlockTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/ConditionalBlockTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/ConditionalBlockTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/ConditionalEvaluatorTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/ConditionalEvaluatorTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/ConditionalEvaluatorTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/ConditionalEvaluatorTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/Engine/CompatEdgeCharacterizationTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/Engine/CompatEdgeCharacterizationTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/Engine/CompatEdgeCharacterizationTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/Engine/CompatEdgeCharacterizationTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/Engine/ConditionAstCacheTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/Engine/ConditionAstCacheTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/Engine/ConditionAstCacheTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/Engine/ConditionAstCacheTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/Engine/ConditionEscapeAndKeywordTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/Engine/ConditionEscapeAndKeywordTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/Engine/ConditionEscapeAndKeywordTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/Engine/ConditionEscapeAndKeywordTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/Engine/ConditionEvaluatorCoreTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/Engine/ConditionEvaluatorCoreTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/Engine/ConditionEvaluatorCoreTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/Engine/ConditionEvaluatorCoreTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/Engine/ConditionLexerTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/Engine/ConditionLexerTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/Engine/ConditionLexerTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/Engine/ConditionLexerTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/Engine/ConditionOperatorRegistryTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/Engine/ConditionOperatorRegistryTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/Engine/ConditionOperatorRegistryTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/Engine/ConditionOperatorRegistryTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/Engine/ConditionParserTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/Engine/ConditionParserTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/Engine/ConditionParserTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/Engine/ConditionParserTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/Engine/ConditionValueOpsTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/Engine/ConditionValueOpsTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/Engine/ConditionValueOpsTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/Engine/ConditionValueOpsTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/Engine/ExistenceOperatorsTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/Engine/ExistenceOperatorsTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/Engine/ExistenceOperatorsTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/Engine/ExistenceOperatorsTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/Engine/ExistenceValidationTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/Engine/ExistenceValidationTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/Engine/ExistenceValidationTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/Engine/ExistenceValidationTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/Engine/InlineDialectTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/Engine/InlineDialectTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/Engine/InlineDialectTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/Engine/InlineDialectTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/Engine/MembershipOperatorTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/Engine/MembershipOperatorTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/Engine/MembershipOperatorTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/Engine/MembershipOperatorTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/Engine/NewSyntaxValidationTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/Engine/NewSyntaxValidationTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/Engine/NewSyntaxValidationTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/Engine/NewSyntaxValidationTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/Engine/NumericSemanticsTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/Engine/NumericSemanticsTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/Engine/NumericSemanticsTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/Engine/NumericSemanticsTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/Engine/SingleQuoteLexingTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/Engine/SingleQuoteLexingTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/Engine/SingleQuoteLexingTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/Engine/SingleQuoteLexingTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/Engine/StrictResolutionTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/Engine/StrictResolutionTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/Engine/StrictResolutionTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/Engine/StrictResolutionTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/Engine/StringOperatorsTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/Engine/StringOperatorsTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/Engine/StringOperatorsTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/Engine/StringOperatorsTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/InlineConditionalParserTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/InlineConditionalParserTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/InlineConditionalParserTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/InlineConditionalParserTests.cs diff --git a/TriasDev.Templify.Tests/Conditionals/PublicConditionEvaluatorTests.cs b/tests/TriasDev.Templify.Tests/Conditionals/PublicConditionEvaluatorTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Conditionals/PublicConditionEvaluatorTests.cs rename to tests/TriasDev.Templify.Tests/Conditionals/PublicConditionEvaluatorTests.cs diff --git a/TriasDev.Templify.Tests/Core/GlobalEvaluationContextTests.cs b/tests/TriasDev.Templify.Tests/Core/GlobalEvaluationContextTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Core/GlobalEvaluationContextTests.cs rename to tests/TriasDev.Templify.Tests/Core/GlobalEvaluationContextTests.cs diff --git a/TriasDev.Templify.Tests/Core/PlaceholderReplacementOptionsTests.cs b/tests/TriasDev.Templify.Tests/Core/PlaceholderReplacementOptionsTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Core/PlaceholderReplacementOptionsTests.cs rename to tests/TriasDev.Templify.Tests/Core/PlaceholderReplacementOptionsTests.cs diff --git a/TriasDev.Templify.Tests/Core/ProcessingResultTests.cs b/tests/TriasDev.Templify.Tests/Core/ProcessingResultTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Core/ProcessingResultTests.cs rename to tests/TriasDev.Templify.Tests/Core/ProcessingResultTests.cs diff --git a/TriasDev.Templify.Tests/Core/TemplateProcessorTests.cs b/tests/TriasDev.Templify.Tests/Core/TemplateProcessorTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Core/TemplateProcessorTests.cs rename to tests/TriasDev.Templify.Tests/Core/TemplateProcessorTests.cs diff --git a/TriasDev.Templify.Tests/Core/TextProcessingResultTests.cs b/tests/TriasDev.Templify.Tests/Core/TextProcessingResultTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Core/TextProcessingResultTests.cs rename to tests/TriasDev.Templify.Tests/Core/TextProcessingResultTests.cs diff --git a/TriasDev.Templify.Tests/Core/TextTemplateParityTests.cs b/tests/TriasDev.Templify.Tests/Core/TextTemplateParityTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Core/TextTemplateParityTests.cs rename to tests/TriasDev.Templify.Tests/Core/TextTemplateParityTests.cs diff --git a/TriasDev.Templify.Tests/Core/TextTemplateProcessorTests.cs b/tests/TriasDev.Templify.Tests/Core/TextTemplateProcessorTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Core/TextTemplateProcessorTests.cs rename to tests/TriasDev.Templify.Tests/Core/TextTemplateProcessorTests.cs diff --git a/TriasDev.Templify.Tests/Core/ValidationResultTests.cs b/tests/TriasDev.Templify.Tests/Core/ValidationResultTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Core/ValidationResultTests.cs rename to tests/TriasDev.Templify.Tests/Core/ValidationResultTests.cs diff --git a/TriasDev.Templify.Tests/Documentation/DeveloperGuideSamplesTests.cs b/tests/TriasDev.Templify.Tests/Documentation/DeveloperGuideSamplesTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Documentation/DeveloperGuideSamplesTests.cs rename to tests/TriasDev.Templify.Tests/Documentation/DeveloperGuideSamplesTests.cs diff --git a/TriasDev.Templify.Tests/Documentation/DocSamplesTests.cs b/tests/TriasDev.Templify.Tests/Documentation/DocSamplesTests.cs similarity index 94% rename from TriasDev.Templify.Tests/Documentation/DocSamplesTests.cs rename to tests/TriasDev.Templify.Tests/Documentation/DocSamplesTests.cs index effa06f..c6a51e9 100644 --- a/TriasDev.Templify.Tests/Documentation/DocSamplesTests.cs +++ b/tests/TriasDev.Templify.Tests/Documentation/DocSamplesTests.cs @@ -11,8 +11,8 @@ namespace TriasDev.Templify.Tests.Documentation; /// -/// Mirrors the key code samples and documented behavior of README.md, TriasDev.Templify/README.md and -/// TriasDev.Templify/Examples.md, so that the samples keep compiling against the public API and the documented +/// Mirrors the key code samples and documented behavior of README.md, src/TriasDev.Templify/README.md and +/// src/TriasDev.Templify/Examples.md, so that the samples keep compiling against the public API and the documented /// output stays true. When one of these tests fails, update the documentation together with the code. /// public sealed class DocSamplesTests : IDisposable @@ -79,7 +79,7 @@ public void Examples_WriteOnlyOutputStream_IsReportedAsFailure() Assert.Contains("Invalid output stream", result.ErrorMessage); } - // TriasDev.Templify/README.md "Basic Usage": other entry points (file, byte array, JSON) + // src/TriasDev.Templify/README.md "Basic Usage": other entry points (file, byte array, JSON) [Fact] public void LibraryReadme_OtherEntryPoints_ProduceTheSameDocument() { @@ -109,7 +109,7 @@ public void LibraryReadme_OtherEntryPoints_ProduceTheSameDocument() Assert.Equal(expected, ReadParagraphs(File.ReadAllBytes(jsonOutputPath))); } - // README.md "Format Specifiers" (en-US outputs) and TriasDev.Templify/README.md format specifier table + // README.md "Format Specifiers" (en-US outputs) and src/TriasDev.Templify/README.md format specifier table [Fact] public void Readme_FormatSpecifiers_ProduceDocumentedOutput() { @@ -152,7 +152,7 @@ public void Readme_FormatSpecifiers_ProduceDocumentedOutput() run.Verifier.GetAllParagraphTexts()); } - // TriasDev.Templify/README.md "Localization": word formats follow the culture + // src/TriasDev.Templify/README.md "Localization": word formats follow the culture [Fact] public void LibraryReadme_BooleanLocalization_FollowsCulture() { @@ -202,7 +202,7 @@ public void Readme_StandaloneConditionEvaluation_Works() Assert.True(context.Evaluate("Status in (\"Active\", \"Pending\")")); } - // README.md / TriasDev.Templify/README.md: operators, precedence, bareword fallback, reserved words + // README.md / src/TriasDev.Templify/README.md: operators, precedence, bareword fallback, reserved words [Theory] [InlineData("not Status = \"Active\"", false)] // not (Status = "Active") [InlineData("not Status = \"Deleted\"", true)] @@ -245,7 +245,7 @@ public void Readme_ConditionSemantics_MatchDocumentation(string expression, bool Assert.Equal(expected, new ConditionEvaluator().Evaluate(expression, data)); } - // TriasDev.Templify/README.md "Differences from {{#if}}": inline expressions are stricter + // src/TriasDev.Templify/README.md "Differences from {{#if}}": inline expressions are stricter [Fact] public void LibraryReadme_InlineExpressions_UseStricterTruthinessAndAllowSingleQuotes() { @@ -266,7 +266,7 @@ public void LibraryReadme_InlineExpressions_UseStricterTruthinessAndAllowSingleQ Assert.Contains(run.Result.Warnings, w => w.Type == ProcessingWarningType.MissingVariable); } - // TriasDev.Templify/README.md "Conditional Blocks": malformed conditions and syntax errors + // src/TriasDev.Templify/README.md "Conditional Blocks": malformed conditions and syntax errors [Fact] public void LibraryReadme_ErrorModel_MatchesDocumentation() { @@ -291,7 +291,7 @@ public void LibraryReadme_ErrorModel_MatchesDocumentation() Assert.Equal("Missing variable or invalid expression: ContactEmail", exception.Message); } - // TriasDev.Templify/README.md "Nested Data Structures": no spaces inside braces, bracket keys, typo-free dictionary syntax + // src/TriasDev.Templify/README.md "Nested Data Structures": no spaces inside braces, bracket keys, typo-free dictionary syntax [Fact] public void LibraryReadme_PlaceholderSyntax_MatchesDocumentation() { @@ -311,7 +311,7 @@ public void LibraryReadme_PlaceholderSyntax_MatchesDocumentation() run.Verifier.GetAllParagraphTexts()); } - // Examples.md "Loop Metadata" and TriasDev.Templify/README.md "Loop Metadata Variables" + // Examples.md "Loop Metadata" and src/TriasDev.Templify/README.md "Loop Metadata Variables" [Fact] public void Examples_LoopMetadata_MatchesDocumentedOutput() { @@ -338,7 +338,7 @@ public void Examples_LoopMetadata_MatchesDocumentedOutput() run.Verifier.GetAllParagraphTexts()); } - // TriasDev.Templify/README.md "Loop Markers and Paragraphs" / Examples.md "Loop in Header" + // src/TriasDev.Templify/README.md "Loop Markers and Paragraphs" / Examples.md "Loop in Header" [Fact] public void LibraryReadme_LoopMarkersSharingOneParagraph_AreNotSupported() { @@ -349,7 +349,7 @@ public void LibraryReadme_LoopMarkersSharingOneParagraph_AreNotSupported() Assert.Equal(new[] { "before", "after" }, run.Verifier.GetAllParagraphTexts()); } - // TriasDev.Templify/README.md "Empty, Missing and Null Collections" + // src/TriasDev.Templify/README.md "Empty, Missing and Null Collections" [Fact] public void LibraryReadme_NullItemsAndCollections_MatchDocumentation() { @@ -433,7 +433,7 @@ public void Examples_ValidationAndWarnings_Work() Assert.NotEmpty(result.GetWarningReportBytes()); } - // Examples.md "JSON Data" and TriasDev.Templify/README.md "JsonDataParser" + // Examples.md "JSON Data" and src/TriasDev.Templify/README.md "JsonDataParser" [Fact] public void Examples_JsonData_ParserWorksAndJsonElementPitfallsAreAsDocumented() { @@ -462,7 +462,7 @@ public void Examples_JsonData_ParserWorksAndJsonElementPitfallsAreAsDocumented() Assert.Throws(() => new DocumentTemplateProcessor().ProcessTemplate(Array.Empty(), "not json", out _)); } - // TriasDev.Templify/README.md "TextTemplateProcessor" + // src/TriasDev.Templify/README.md "TextTemplateProcessor" [Fact] public void LibraryReadme_TextTemplateProcessor_Works() { diff --git a/TriasDev.Templify.Tests/Documentation/OpenDocumentSamplesTests.cs b/tests/TriasDev.Templify.Tests/Documentation/OpenDocumentSamplesTests.cs similarity index 99% rename from TriasDev.Templify.Tests/Documentation/OpenDocumentSamplesTests.cs rename to tests/TriasDev.Templify.Tests/Documentation/OpenDocumentSamplesTests.cs index c2d59d1..3470159 100644 --- a/TriasDev.Templify.Tests/Documentation/OpenDocumentSamplesTests.cs +++ b/tests/TriasDev.Templify.Tests/Documentation/OpenDocumentSamplesTests.cs @@ -10,7 +10,7 @@ namespace TriasDev.Templify.Tests.Documentation; /// /// Mirrors the code samples and documented behavior of docs/for-developers/opendocument.md, /// docs/for-template-authors/libreoffice.md and the OpenDocument sections of README.md and -/// TriasDev.Templify/README.md. When one of these tests fails, update the documentation together with the code. +/// src/TriasDev.Templify/README.md. When one of these tests fails, update the documentation together with the code. /// public sealed class OpenDocumentSamplesTests : IDisposable { diff --git a/TriasDev.Templify.Tests/Formatting/BooleanFormatterRegistryTests.cs b/tests/TriasDev.Templify.Tests/Formatting/BooleanFormatterRegistryTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Formatting/BooleanFormatterRegistryTests.cs rename to tests/TriasDev.Templify.Tests/Formatting/BooleanFormatterRegistryTests.cs diff --git a/TriasDev.Templify.Tests/Formatting/BooleanFormatterTests.cs b/tests/TriasDev.Templify.Tests/Formatting/BooleanFormatterTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Formatting/BooleanFormatterTests.cs rename to tests/TriasDev.Templify.Tests/Formatting/BooleanFormatterTests.cs diff --git a/TriasDev.Templify.Tests/Helpers/ConditionEngineTestHelper.cs b/tests/TriasDev.Templify.Tests/Helpers/ConditionEngineTestHelper.cs similarity index 100% rename from TriasDev.Templify.Tests/Helpers/ConditionEngineTestHelper.cs rename to tests/TriasDev.Templify.Tests/Helpers/ConditionEngineTestHelper.cs diff --git a/TriasDev.Templify.Tests/Helpers/DocumentBuilder.cs b/tests/TriasDev.Templify.Tests/Helpers/DocumentBuilder.cs similarity index 100% rename from TriasDev.Templify.Tests/Helpers/DocumentBuilder.cs rename to tests/TriasDev.Templify.Tests/Helpers/DocumentBuilder.cs diff --git a/TriasDev.Templify.Tests/Helpers/DocumentVerifier.cs b/tests/TriasDev.Templify.Tests/Helpers/DocumentVerifier.cs similarity index 100% rename from TriasDev.Templify.Tests/Helpers/DocumentVerifier.cs rename to tests/TriasDev.Templify.Tests/Helpers/DocumentVerifier.cs diff --git a/TriasDev.Templify.Tests/Helpers/OdtDocumentBuilder.cs b/tests/TriasDev.Templify.Tests/Helpers/OdtDocumentBuilder.cs similarity index 100% rename from TriasDev.Templify.Tests/Helpers/OdtDocumentBuilder.cs rename to tests/TriasDev.Templify.Tests/Helpers/OdtDocumentBuilder.cs diff --git a/TriasDev.Templify.Tests/Helpers/OdtDocumentVerifier.cs b/tests/TriasDev.Templify.Tests/Helpers/OdtDocumentVerifier.cs similarity index 100% rename from TriasDev.Templify.Tests/Helpers/OdtDocumentVerifier.cs rename to tests/TriasDev.Templify.Tests/Helpers/OdtDocumentVerifier.cs diff --git a/TriasDev.Templify.Tests/Helpers/TemplateTestHarness.cs b/tests/TriasDev.Templify.Tests/Helpers/TemplateTestHarness.cs similarity index 100% rename from TriasDev.Templify.Tests/Helpers/TemplateTestHarness.cs rename to tests/TriasDev.Templify.Tests/Helpers/TemplateTestHarness.cs diff --git a/TriasDev.Templify.Tests/Helpers/TestBlocks.cs b/tests/TriasDev.Templify.Tests/Helpers/TestBlocks.cs similarity index 100% rename from TriasDev.Templify.Tests/Helpers/TestBlocks.cs rename to tests/TriasDev.Templify.Tests/Helpers/TestBlocks.cs diff --git a/TriasDev.Templify.Tests/Integration/BasicPlaceholderReplacementTests.cs b/tests/TriasDev.Templify.Tests/Integration/BasicPlaceholderReplacementTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/BasicPlaceholderReplacementTests.cs rename to tests/TriasDev.Templify.Tests/Integration/BasicPlaceholderReplacementTests.cs diff --git a/TriasDev.Templify.Tests/Integration/ConditionalInLoopTests.cs b/tests/TriasDev.Templify.Tests/Integration/ConditionalInLoopTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/ConditionalInLoopTests.cs rename to tests/TriasDev.Templify.Tests/Integration/ConditionalInLoopTests.cs diff --git a/TriasDev.Templify.Tests/Integration/ConditionalTableCellTests.cs b/tests/TriasDev.Templify.Tests/Integration/ConditionalTableCellTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/ConditionalTableCellTests.cs rename to tests/TriasDev.Templify.Tests/Integration/ConditionalTableCellTests.cs diff --git a/TriasDev.Templify.Tests/Integration/ConditionalTests.cs b/tests/TriasDev.Templify.Tests/Integration/ConditionalTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/ConditionalTests.cs rename to tests/TriasDev.Templify.Tests/Integration/ConditionalTests.cs diff --git a/TriasDev.Templify.Tests/Integration/CultureIndependenceTests.cs b/tests/TriasDev.Templify.Tests/Integration/CultureIndependenceTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/CultureIndependenceTests.cs rename to tests/TriasDev.Templify.Tests/Integration/CultureIndependenceTests.cs diff --git a/TriasDev.Templify.Tests/Integration/DocumentPropertiesTests.cs b/tests/TriasDev.Templify.Tests/Integration/DocumentPropertiesTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/DocumentPropertiesTests.cs rename to tests/TriasDev.Templify.Tests/Integration/DocumentPropertiesTests.cs diff --git a/TriasDev.Templify.Tests/Integration/DocumentStructureTests.cs b/tests/TriasDev.Templify.Tests/Integration/DocumentStructureTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/DocumentStructureTests.cs rename to tests/TriasDev.Templify.Tests/Integration/DocumentStructureTests.cs diff --git a/TriasDev.Templify.Tests/Integration/DocumentTemplateProcessorEdgeCaseTests.cs b/tests/TriasDev.Templify.Tests/Integration/DocumentTemplateProcessorEdgeCaseTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/DocumentTemplateProcessorEdgeCaseTests.cs rename to tests/TriasDev.Templify.Tests/Integration/DocumentTemplateProcessorEdgeCaseTests.cs diff --git a/TriasDev.Templify.Tests/Integration/DrawingIdUniquenessTests.cs b/tests/TriasDev.Templify.Tests/Integration/DrawingIdUniquenessTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/DrawingIdUniquenessTests.cs rename to tests/TriasDev.Templify.Tests/Integration/DrawingIdUniquenessTests.cs diff --git a/TriasDev.Templify.Tests/Integration/ElseIfTests.cs b/tests/TriasDev.Templify.Tests/Integration/ElseIfTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/ElseIfTests.cs rename to tests/TriasDev.Templify.Tests/Integration/ElseIfTests.cs diff --git a/TriasDev.Templify.Tests/Integration/ErrorModelTests.cs b/tests/TriasDev.Templify.Tests/Integration/ErrorModelTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/ErrorModelTests.cs rename to tests/TriasDev.Templify.Tests/Integration/ErrorModelTests.cs diff --git a/TriasDev.Templify.Tests/Integration/ExpressionIntegrationTests.cs b/tests/TriasDev.Templify.Tests/Integration/ExpressionIntegrationTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/ExpressionIntegrationTests.cs rename to tests/TriasDev.Templify.Tests/Integration/ExpressionIntegrationTests.cs diff --git a/TriasDev.Templify.Tests/Integration/FormatSpecifierIntegrationTests.cs b/tests/TriasDev.Templify.Tests/Integration/FormatSpecifierIntegrationTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/FormatSpecifierIntegrationTests.cs rename to tests/TriasDev.Templify.Tests/Integration/FormatSpecifierIntegrationTests.cs diff --git a/TriasDev.Templify.Tests/Integration/FormattingPreservationTests.cs b/tests/TriasDev.Templify.Tests/Integration/FormattingPreservationTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/FormattingPreservationTests.cs rename to tests/TriasDev.Templify.Tests/Integration/FormattingPreservationTests.cs diff --git a/TriasDev.Templify.Tests/Integration/HeaderFooterTests.cs b/tests/TriasDev.Templify.Tests/Integration/HeaderFooterTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/HeaderFooterTests.cs rename to tests/TriasDev.Templify.Tests/Integration/HeaderFooterTests.cs diff --git a/TriasDev.Templify.Tests/Integration/InlineConditionalContentPreservationTests.cs b/tests/TriasDev.Templify.Tests/Integration/InlineConditionalContentPreservationTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/InlineConditionalContentPreservationTests.cs rename to tests/TriasDev.Templify.Tests/Integration/InlineConditionalContentPreservationTests.cs diff --git a/TriasDev.Templify.Tests/Integration/InlineConditionalTests.cs b/tests/TriasDev.Templify.Tests/Integration/InlineConditionalTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/InlineConditionalTests.cs rename to tests/TriasDev.Templify.Tests/Integration/InlineConditionalTests.cs diff --git a/TriasDev.Templify.Tests/Integration/JsonInputTests.cs b/tests/TriasDev.Templify.Tests/Integration/JsonInputTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/JsonInputTests.cs rename to tests/TriasDev.Templify.Tests/Integration/JsonInputTests.cs diff --git a/TriasDev.Templify.Tests/Integration/LargeLoopTests.cs b/tests/TriasDev.Templify.Tests/Integration/LargeLoopTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/LargeLoopTests.cs rename to tests/TriasDev.Templify.Tests/Integration/LargeLoopTests.cs diff --git a/TriasDev.Templify.Tests/Integration/ListsInLoopsTests.cs b/tests/TriasDev.Templify.Tests/Integration/ListsInLoopsTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/ListsInLoopsTests.cs rename to tests/TriasDev.Templify.Tests/Integration/ListsInLoopsTests.cs diff --git a/TriasDev.Templify.Tests/Integration/LoopNumberMetadataTests.cs b/tests/TriasDev.Templify.Tests/Integration/LoopNumberMetadataTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/LoopNumberMetadataTests.cs rename to tests/TriasDev.Templify.Tests/Integration/LoopNumberMetadataTests.cs diff --git a/TriasDev.Templify.Tests/Integration/LoopReprocessingTests.cs b/tests/TriasDev.Templify.Tests/Integration/LoopReprocessingTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/LoopReprocessingTests.cs rename to tests/TriasDev.Templify.Tests/Integration/LoopReprocessingTests.cs diff --git a/TriasDev.Templify.Tests/Integration/LoopTests.cs b/tests/TriasDev.Templify.Tests/Integration/LoopTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/LoopTests.cs rename to tests/TriasDev.Templify.Tests/Integration/LoopTests.cs diff --git a/TriasDev.Templify.Tests/Integration/MarkdownFormattingTests.cs b/tests/TriasDev.Templify.Tests/Integration/MarkdownFormattingTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/MarkdownFormattingTests.cs rename to tests/TriasDev.Templify.Tests/Integration/MarkdownFormattingTests.cs diff --git a/TriasDev.Templify.Tests/Integration/NamedIterationVariableIntegrationTests.cs b/tests/TriasDev.Templify.Tests/Integration/NamedIterationVariableIntegrationTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/NamedIterationVariableIntegrationTests.cs rename to tests/TriasDev.Templify.Tests/Integration/NamedIterationVariableIntegrationTests.cs diff --git a/TriasDev.Templify.Tests/Integration/NestedStructureTests.cs b/tests/TriasDev.Templify.Tests/Integration/NestedStructureTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/NestedStructureTests.cs rename to tests/TriasDev.Templify.Tests/Integration/NestedStructureTests.cs diff --git a/TriasDev.Templify.Tests/Integration/NewOperatorsIntegrationTests.cs b/tests/TriasDev.Templify.Tests/Integration/NewOperatorsIntegrationTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/NewOperatorsIntegrationTests.cs rename to tests/TriasDev.Templify.Tests/Integration/NewOperatorsIntegrationTests.cs diff --git a/TriasDev.Templify.Tests/Integration/NewlineHandlingTests.cs b/tests/TriasDev.Templify.Tests/Integration/NewlineHandlingTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/NewlineHandlingTests.cs rename to tests/TriasDev.Templify.Tests/Integration/NewlineHandlingTests.cs diff --git a/TriasDev.Templify.Tests/Integration/ParagraphRewriteCharacterizationTests.cs b/tests/TriasDev.Templify.Tests/Integration/ParagraphRewriteCharacterizationTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/ParagraphRewriteCharacterizationTests.cs rename to tests/TriasDev.Templify.Tests/Integration/ParagraphRewriteCharacterizationTests.cs diff --git a/TriasDev.Templify.Tests/Integration/ProcessingWarningsIntegrationTests.cs b/tests/TriasDev.Templify.Tests/Integration/ProcessingWarningsIntegrationTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/ProcessingWarningsIntegrationTests.cs rename to tests/TriasDev.Templify.Tests/Integration/ProcessingWarningsIntegrationTests.cs diff --git a/TriasDev.Templify.Tests/Integration/ProcessorOverloadTests.cs b/tests/TriasDev.Templify.Tests/Integration/ProcessorOverloadTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/ProcessorOverloadTests.cs rename to tests/TriasDev.Templify.Tests/Integration/ProcessorOverloadTests.cs diff --git a/TriasDev.Templify.Tests/Integration/StreamValidationTests.cs b/tests/TriasDev.Templify.Tests/Integration/StreamValidationTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/StreamValidationTests.cs rename to tests/TriasDev.Templify.Tests/Integration/StreamValidationTests.cs diff --git a/TriasDev.Templify.Tests/Integration/TableOfContentsTests.cs b/tests/TriasDev.Templify.Tests/Integration/TableOfContentsTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/TableOfContentsTests.cs rename to tests/TriasDev.Templify.Tests/Integration/TableOfContentsTests.cs diff --git a/TriasDev.Templify.Tests/Integration/TableRowConditionalTests.cs b/tests/TriasDev.Templify.Tests/Integration/TableRowConditionalTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/TableRowConditionalTests.cs rename to tests/TriasDev.Templify.Tests/Integration/TableRowConditionalTests.cs diff --git a/TriasDev.Templify.Tests/Integration/TableRowDetectionEdgeCaseTests.cs b/tests/TriasDev.Templify.Tests/Integration/TableRowDetectionEdgeCaseTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/TableRowDetectionEdgeCaseTests.cs rename to tests/TriasDev.Templify.Tests/Integration/TableRowDetectionEdgeCaseTests.cs diff --git a/TriasDev.Templify.Tests/Integration/TableTests.cs b/tests/TriasDev.Templify.Tests/Integration/TableTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/TableTests.cs rename to tests/TriasDev.Templify.Tests/Integration/TableTests.cs diff --git a/TriasDev.Templify.Tests/Integration/TextBoxContentControlAndNoteTests.cs b/tests/TriasDev.Templify.Tests/Integration/TextBoxContentControlAndNoteTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/TextBoxContentControlAndNoteTests.cs rename to tests/TriasDev.Templify.Tests/Integration/TextBoxContentControlAndNoteTests.cs diff --git a/TriasDev.Templify.Tests/Integration/TextReplacementsIntegrationTests.cs b/tests/TriasDev.Templify.Tests/Integration/TextReplacementsIntegrationTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/TextReplacementsIntegrationTests.cs rename to tests/TriasDev.Templify.Tests/Integration/TextReplacementsIntegrationTests.cs diff --git a/TriasDev.Templify.Tests/Integration/UnicodeContentTests.cs b/tests/TriasDev.Templify.Tests/Integration/UnicodeContentTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/UnicodeContentTests.cs rename to tests/TriasDev.Templify.Tests/Integration/UnicodeContentTests.cs diff --git a/TriasDev.Templify.Tests/Integration/ValidationEdgeCaseTests.cs b/tests/TriasDev.Templify.Tests/Integration/ValidationEdgeCaseTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/ValidationEdgeCaseTests.cs rename to tests/TriasDev.Templify.Tests/Integration/ValidationEdgeCaseTests.cs diff --git a/TriasDev.Templify.Tests/Integration/ValidationInlineExpressionTests.cs b/tests/TriasDev.Templify.Tests/Integration/ValidationInlineExpressionTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/ValidationInlineExpressionTests.cs rename to tests/TriasDev.Templify.Tests/Integration/ValidationInlineExpressionTests.cs diff --git a/TriasDev.Templify.Tests/Integration/ValidationIntegrationTests.cs b/tests/TriasDev.Templify.Tests/Integration/ValidationIntegrationTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/ValidationIntegrationTests.cs rename to tests/TriasDev.Templify.Tests/Integration/ValidationIntegrationTests.cs diff --git a/TriasDev.Templify.Tests/Integration/ValidationMissingConditionVariableTests.cs b/tests/TriasDev.Templify.Tests/Integration/ValidationMissingConditionVariableTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/ValidationMissingConditionVariableTests.cs rename to tests/TriasDev.Templify.Tests/Integration/ValidationMissingConditionVariableTests.cs diff --git a/TriasDev.Templify.Tests/Integration/ValidationTableRowLoopTests.cs b/tests/TriasDev.Templify.Tests/Integration/ValidationTableRowLoopTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/ValidationTableRowLoopTests.cs rename to tests/TriasDev.Templify.Tests/Integration/ValidationTableRowLoopTests.cs diff --git a/TriasDev.Templify.Tests/Integration/VisitorPatternIntegrationTests.cs b/tests/TriasDev.Templify.Tests/Integration/VisitorPatternIntegrationTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Integration/VisitorPatternIntegrationTests.cs rename to tests/TriasDev.Templify.Tests/Integration/VisitorPatternIntegrationTests.cs diff --git a/TriasDev.Templify.Tests/Loops/LoopContextPrimitiveTests.cs b/tests/TriasDev.Templify.Tests/Loops/LoopContextPrimitiveTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Loops/LoopContextPrimitiveTests.cs rename to tests/TriasDev.Templify.Tests/Loops/LoopContextPrimitiveTests.cs diff --git a/TriasDev.Templify.Tests/Loops/LoopContextTests.cs b/tests/TriasDev.Templify.Tests/Loops/LoopContextTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Loops/LoopContextTests.cs rename to tests/TriasDev.Templify.Tests/Loops/LoopContextTests.cs diff --git a/TriasDev.Templify.Tests/Loops/LoopEvaluationContextTests.cs b/tests/TriasDev.Templify.Tests/Loops/LoopEvaluationContextTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Loops/LoopEvaluationContextTests.cs rename to tests/TriasDev.Templify.Tests/Loops/LoopEvaluationContextTests.cs diff --git a/TriasDev.Templify.Tests/Markdown/MarkdownParserTests.cs b/tests/TriasDev.Templify.Tests/Markdown/MarkdownParserTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Markdown/MarkdownParserTests.cs rename to tests/TriasDev.Templify.Tests/Markdown/MarkdownParserTests.cs diff --git a/TriasDev.Templify.Tests/ObsoleteApiTests.cs b/tests/TriasDev.Templify.Tests/ObsoleteApiTests.cs similarity index 100% rename from TriasDev.Templify.Tests/ObsoleteApiTests.cs rename to tests/TriasDev.Templify.Tests/ObsoleteApiTests.cs diff --git a/TriasDev.Templify.Tests/Odt/Fixtures/Sources/containers.fodt b/tests/TriasDev.Templify.Tests/Odt/Fixtures/Sources/containers.fodt similarity index 100% rename from TriasDev.Templify.Tests/Odt/Fixtures/Sources/containers.fodt rename to tests/TriasDev.Templify.Tests/Odt/Fixtures/Sources/containers.fodt diff --git a/TriasDev.Templify.Tests/Odt/Fixtures/Sources/invoice.fodt b/tests/TriasDev.Templify.Tests/Odt/Fixtures/Sources/invoice.fodt similarity index 100% rename from TriasDev.Templify.Tests/Odt/Fixtures/Sources/invoice.fodt rename to tests/TriasDev.Templify.Tests/Odt/Fixtures/Sources/invoice.fodt diff --git a/TriasDev.Templify.Tests/Odt/Fixtures/Sources/long-document.fodt b/tests/TriasDev.Templify.Tests/Odt/Fixtures/Sources/long-document.fodt similarity index 100% rename from TriasDev.Templify.Tests/Odt/Fixtures/Sources/long-document.fodt rename to tests/TriasDev.Templify.Tests/Odt/Fixtures/Sources/long-document.fodt diff --git a/TriasDev.Templify.Tests/Odt/Fixtures/Sources/word-rsid-runs.docx b/tests/TriasDev.Templify.Tests/Odt/Fixtures/Sources/word-rsid-runs.docx similarity index 100% rename from TriasDev.Templify.Tests/Odt/Fixtures/Sources/word-rsid-runs.docx rename to tests/TriasDev.Templify.Tests/Odt/Fixtures/Sources/word-rsid-runs.docx diff --git a/TriasDev.Templify.Tests/Odt/Fixtures/lo-containers.odt b/tests/TriasDev.Templify.Tests/Odt/Fixtures/lo-containers.odt similarity index 100% rename from TriasDev.Templify.Tests/Odt/Fixtures/lo-containers.odt rename to tests/TriasDev.Templify.Tests/Odt/Fixtures/lo-containers.odt diff --git a/TriasDev.Templify.Tests/Odt/Fixtures/lo-from-word.odt b/tests/TriasDev.Templify.Tests/Odt/Fixtures/lo-from-word.odt similarity index 100% rename from TriasDev.Templify.Tests/Odt/Fixtures/lo-from-word.odt rename to tests/TriasDev.Templify.Tests/Odt/Fixtures/lo-from-word.odt diff --git a/TriasDev.Templify.Tests/Odt/Fixtures/lo-invoice.odt b/tests/TriasDev.Templify.Tests/Odt/Fixtures/lo-invoice.odt similarity index 100% rename from TriasDev.Templify.Tests/Odt/Fixtures/lo-invoice.odt rename to tests/TriasDev.Templify.Tests/Odt/Fixtures/lo-invoice.odt diff --git a/TriasDev.Templify.Tests/Odt/Fixtures/lo-long-document.odt b/tests/TriasDev.Templify.Tests/Odt/Fixtures/lo-long-document.odt similarity index 100% rename from TriasDev.Templify.Tests/Odt/Fixtures/lo-long-document.odt rename to tests/TriasDev.Templify.Tests/Odt/Fixtures/lo-long-document.odt diff --git a/TriasDev.Templify.Tests/Odt/LibreOfficeRunner.cs b/tests/TriasDev.Templify.Tests/Odt/LibreOfficeRunner.cs similarity index 100% rename from TriasDev.Templify.Tests/Odt/LibreOfficeRunner.cs rename to tests/TriasDev.Templify.Tests/Odt/LibreOfficeRunner.cs diff --git a/TriasDev.Templify.Tests/Odt/OdtConditionalTests.cs b/tests/TriasDev.Templify.Tests/Odt/OdtConditionalTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Odt/OdtConditionalTests.cs rename to tests/TriasDev.Templify.Tests/Odt/OdtConditionalTests.cs diff --git a/TriasDev.Templify.Tests/Odt/OdtContainerTests.cs b/tests/TriasDev.Templify.Tests/Odt/OdtContainerTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Odt/OdtContainerTests.cs rename to tests/TriasDev.Templify.Tests/Odt/OdtContainerTests.cs diff --git a/TriasDev.Templify.Tests/Odt/OdtEngineBranchTests.cs b/tests/TriasDev.Templify.Tests/Odt/OdtEngineBranchTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Odt/OdtEngineBranchTests.cs rename to tests/TriasDev.Templify.Tests/Odt/OdtEngineBranchTests.cs diff --git a/TriasDev.Templify.Tests/Odt/OdtLibreOfficeFixtureTests.cs b/tests/TriasDev.Templify.Tests/Odt/OdtLibreOfficeFixtureTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Odt/OdtLibreOfficeFixtureTests.cs rename to tests/TriasDev.Templify.Tests/Odt/OdtLibreOfficeFixtureTests.cs diff --git a/TriasDev.Templify.Tests/Odt/OdtLibreOfficeRoundTripTests.cs b/tests/TriasDev.Templify.Tests/Odt/OdtLibreOfficeRoundTripTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Odt/OdtLibreOfficeRoundTripTests.cs rename to tests/TriasDev.Templify.Tests/Odt/OdtLibreOfficeRoundTripTests.cs diff --git a/TriasDev.Templify.Tests/Odt/OdtLoopTests.cs b/tests/TriasDev.Templify.Tests/Odt/OdtLoopTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Odt/OdtLoopTests.cs rename to tests/TriasDev.Templify.Tests/Odt/OdtLoopTests.cs diff --git a/TriasDev.Templify.Tests/Odt/OdtMarkdownTests.cs b/tests/TriasDev.Templify.Tests/Odt/OdtMarkdownTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Odt/OdtMarkdownTests.cs rename to tests/TriasDev.Templify.Tests/Odt/OdtMarkdownTests.cs diff --git a/TriasDev.Templify.Tests/Odt/OdtPackageBranchTests.cs b/tests/TriasDev.Templify.Tests/Odt/OdtPackageBranchTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Odt/OdtPackageBranchTests.cs rename to tests/TriasDev.Templify.Tests/Odt/OdtPackageBranchTests.cs diff --git a/TriasDev.Templify.Tests/Odt/OdtPackageTests.cs b/tests/TriasDev.Templify.Tests/Odt/OdtPackageTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Odt/OdtPackageTests.cs rename to tests/TriasDev.Templify.Tests/Odt/OdtPackageTests.cs diff --git a/TriasDev.Templify.Tests/Odt/OdtParagraphTextRewriterTests.cs b/tests/TriasDev.Templify.Tests/Odt/OdtParagraphTextRewriterTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Odt/OdtParagraphTextRewriterTests.cs rename to tests/TriasDev.Templify.Tests/Odt/OdtParagraphTextRewriterTests.cs diff --git a/TriasDev.Templify.Tests/Odt/OdtPlaceholderTests.cs b/tests/TriasDev.Templify.Tests/Odt/OdtPlaceholderTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Odt/OdtPlaceholderTests.cs rename to tests/TriasDev.Templify.Tests/Odt/OdtPlaceholderTests.cs diff --git a/TriasDev.Templify.Tests/Odt/OdtTestHelper.cs b/tests/TriasDev.Templify.Tests/Odt/OdtTestHelper.cs similarity index 100% rename from TriasDev.Templify.Tests/Odt/OdtTestHelper.cs rename to tests/TriasDev.Templify.Tests/Odt/OdtTestHelper.cs diff --git a/TriasDev.Templify.Tests/Odt/OdtTextStylesTests.cs b/tests/TriasDev.Templify.Tests/Odt/OdtTextStylesTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Odt/OdtTextStylesTests.cs rename to tests/TriasDev.Templify.Tests/Odt/OdtTextStylesTests.cs diff --git a/TriasDev.Templify.Tests/Odt/OdtValidationParityTests.cs b/tests/TriasDev.Templify.Tests/Odt/OdtValidationParityTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Odt/OdtValidationParityTests.cs rename to tests/TriasDev.Templify.Tests/Odt/OdtValidationParityTests.cs diff --git a/TriasDev.Templify.Tests/Odt/OdtValidationScopeTests.cs b/tests/TriasDev.Templify.Tests/Odt/OdtValidationScopeTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Odt/OdtValidationScopeTests.cs rename to tests/TriasDev.Templify.Tests/Odt/OdtValidationScopeTests.cs diff --git a/TriasDev.Templify.Tests/Odt/OdtValidationTests.cs b/tests/TriasDev.Templify.Tests/Odt/OdtValidationTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Odt/OdtValidationTests.cs rename to tests/TriasDev.Templify.Tests/Odt/OdtValidationTests.cs diff --git a/TriasDev.Templify.Tests/Placeholders/PlaceholderFinderTests.cs b/tests/TriasDev.Templify.Tests/Placeholders/PlaceholderFinderTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Placeholders/PlaceholderFinderTests.cs rename to tests/TriasDev.Templify.Tests/Placeholders/PlaceholderFinderTests.cs diff --git a/TriasDev.Templify.Tests/Placeholders/ValueConverterTests.cs b/tests/TriasDev.Templify.Tests/Placeholders/ValueConverterTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Placeholders/ValueConverterTests.cs rename to tests/TriasDev.Templify.Tests/Placeholders/ValueConverterTests.cs diff --git a/TriasDev.Templify.Tests/Placeholders/ValueResolverTests.cs b/tests/TriasDev.Templify.Tests/Placeholders/ValueResolverTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Placeholders/ValueResolverTests.cs rename to tests/TriasDev.Templify.Tests/Placeholders/ValueResolverTests.cs diff --git a/TriasDev.Templify.Tests/PropertyPaths/PropertyPathResolverTests.cs b/tests/TriasDev.Templify.Tests/PropertyPaths/PropertyPathResolverTests.cs similarity index 100% rename from TriasDev.Templify.Tests/PropertyPaths/PropertyPathResolverTests.cs rename to tests/TriasDev.Templify.Tests/PropertyPaths/PropertyPathResolverTests.cs diff --git a/TriasDev.Templify.Tests/PropertyPaths/PropertyPathTests.cs b/tests/TriasDev.Templify.Tests/PropertyPaths/PropertyPathTests.cs similarity index 100% rename from TriasDev.Templify.Tests/PropertyPaths/PropertyPathTests.cs rename to tests/TriasDev.Templify.Tests/PropertyPaths/PropertyPathTests.cs diff --git a/TriasDev.Templify.Tests/Replacements/TextReplacementsTests.cs b/tests/TriasDev.Templify.Tests/Replacements/TextReplacementsTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Replacements/TextReplacementsTests.cs rename to tests/TriasDev.Templify.Tests/Replacements/TextReplacementsTests.cs diff --git a/tests/TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj b/tests/TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj new file mode 100644 index 0000000..9841f17 --- /dev/null +++ b/tests/TriasDev.Templify.Tests/TriasDev.Templify.Tests.csproj @@ -0,0 +1,17 @@ + + + + + net10.0;net9.0;net8.0 + + + + + + + + + + + + diff --git a/TriasDev.Templify.Tests/Utilities/DrawingIdAllocatorTests.cs b/tests/TriasDev.Templify.Tests/Utilities/DrawingIdAllocatorTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Utilities/DrawingIdAllocatorTests.cs rename to tests/TriasDev.Templify.Tests/Utilities/DrawingIdAllocatorTests.cs diff --git a/TriasDev.Templify.Tests/Utilities/JsonDataParserTests.cs b/tests/TriasDev.Templify.Tests/Utilities/JsonDataParserTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Utilities/JsonDataParserTests.cs rename to tests/TriasDev.Templify.Tests/Utilities/JsonDataParserTests.cs diff --git a/TriasDev.Templify.Tests/Utilities/NumericValueTests.cs b/tests/TriasDev.Templify.Tests/Utilities/NumericValueTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Utilities/NumericValueTests.cs rename to tests/TriasDev.Templify.Tests/Utilities/NumericValueTests.cs diff --git a/TriasDev.Templify.Tests/Utilities/ParagraphTextRewriterTests.cs b/tests/TriasDev.Templify.Tests/Utilities/ParagraphTextRewriterTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Utilities/ParagraphTextRewriterTests.cs rename to tests/TriasDev.Templify.Tests/Utilities/ParagraphTextRewriterTests.cs diff --git a/TriasDev.Templify.Tests/Utilities/XmlCharacterSanitizerTests.cs b/tests/TriasDev.Templify.Tests/Utilities/XmlCharacterSanitizerTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Utilities/XmlCharacterSanitizerTests.cs rename to tests/TriasDev.Templify.Tests/Utilities/XmlCharacterSanitizerTests.cs diff --git a/TriasDev.Templify.Tests/Visitors/CompositeVisitorTests.cs b/tests/TriasDev.Templify.Tests/Visitors/CompositeVisitorTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Visitors/CompositeVisitorTests.cs rename to tests/TriasDev.Templify.Tests/Visitors/CompositeVisitorTests.cs diff --git a/TriasDev.Templify.Tests/Visitors/ConditionalVisitorTests.cs b/tests/TriasDev.Templify.Tests/Visitors/ConditionalVisitorTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Visitors/ConditionalVisitorTests.cs rename to tests/TriasDev.Templify.Tests/Visitors/ConditionalVisitorTests.cs diff --git a/TriasDev.Templify.Tests/Visitors/DocumentWalkerTableEdgeCaseTests.cs b/tests/TriasDev.Templify.Tests/Visitors/DocumentWalkerTableEdgeCaseTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Visitors/DocumentWalkerTableEdgeCaseTests.cs rename to tests/TriasDev.Templify.Tests/Visitors/DocumentWalkerTableEdgeCaseTests.cs diff --git a/TriasDev.Templify.Tests/Visitors/DocumentWalkerTests.cs b/tests/TriasDev.Templify.Tests/Visitors/DocumentWalkerTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Visitors/DocumentWalkerTests.cs rename to tests/TriasDev.Templify.Tests/Visitors/DocumentWalkerTests.cs diff --git a/TriasDev.Templify.Tests/Visitors/LoopVisitorTests.cs b/tests/TriasDev.Templify.Tests/Visitors/LoopVisitorTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Visitors/LoopVisitorTests.cs rename to tests/TriasDev.Templify.Tests/Visitors/LoopVisitorTests.cs diff --git a/TriasDev.Templify.Tests/Visitors/PlaceholderVisitorTests.cs b/tests/TriasDev.Templify.Tests/Visitors/PlaceholderVisitorTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Visitors/PlaceholderVisitorTests.cs rename to tests/TriasDev.Templify.Tests/Visitors/PlaceholderVisitorTests.cs diff --git a/TriasDev.Templify.Tests/Visitors/TemplateElementHelperTests.cs b/tests/TriasDev.Templify.Tests/Visitors/TemplateElementHelperTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Visitors/TemplateElementHelperTests.cs rename to tests/TriasDev.Templify.Tests/Visitors/TemplateElementHelperTests.cs diff --git a/TriasDev.Templify.Tests/Visitors/TemplatePipelineTests.cs b/tests/TriasDev.Templify.Tests/Visitors/TemplatePipelineTests.cs similarity index 100% rename from TriasDev.Templify.Tests/Visitors/TemplatePipelineTests.cs rename to tests/TriasDev.Templify.Tests/Visitors/TemplatePipelineTests.cs diff --git a/TriasDev.Templify.Tests/packages.lock.json b/tests/TriasDev.Templify.Tests/packages.lock.json similarity index 100% rename from TriasDev.Templify.Tests/packages.lock.json rename to tests/TriasDev.Templify.Tests/packages.lock.json diff --git a/TriasDev.Templify.Tools.Tests/DocumentGenerator/ExampleGeneratorSmokeTests.cs b/tests/TriasDev.Templify.Tools.Tests/DocumentGenerator/ExampleGeneratorSmokeTests.cs similarity index 94% rename from TriasDev.Templify.Tools.Tests/DocumentGenerator/ExampleGeneratorSmokeTests.cs rename to tests/TriasDev.Templify.Tools.Tests/DocumentGenerator/ExampleGeneratorSmokeTests.cs index c7fbcb0..74e0992 100644 --- a/TriasDev.Templify.Tools.Tests/DocumentGenerator/ExampleGeneratorSmokeTests.cs +++ b/tests/TriasDev.Templify.Tools.Tests/DocumentGenerator/ExampleGeneratorSmokeTests.cs @@ -201,7 +201,19 @@ public void RepositoryPaths_FindsRootFromTestOutputDirectory() string? root = RepositoryPaths.FindRepositoryRoot(AppContext.BaseDirectory); Assert.NotNull(root); - Assert.True(File.Exists(Path.Combine(root, "templify.sln"))); + Assert.True(File.Exists(Path.Combine(root, "templify.slnx"))); Assert.Equal(Path.Combine(root, "docs", "images", "examples"), RepositoryPaths.ImagesDirectory(root)); } + + [Fact] + public void RepositoryPaths_GeneratorEnvFile_IsInTheGeneratorProjectDirectory() + { + string? root = RepositoryPaths.FindRepositoryRoot(AppContext.BaseDirectory); + Assert.NotNull(root); + + string envFile = RepositoryPaths.GeneratorEnvFile(root); + + Assert.Equal(".env", Path.GetFileName(envFile)); + Assert.True(File.Exists(Path.Combine(Path.GetDirectoryName(envFile)!, ".env.example"))); + } } diff --git a/TriasDev.Templify.Tools.Tests/Gui/Fakes.cs b/tests/TriasDev.Templify.Tools.Tests/Gui/Fakes.cs similarity index 100% rename from TriasDev.Templify.Tools.Tests/Gui/Fakes.cs rename to tests/TriasDev.Templify.Tools.Tests/Gui/Fakes.cs diff --git a/TriasDev.Templify.Tools.Tests/Gui/MainWindowViewModelTests.cs b/tests/TriasDev.Templify.Tools.Tests/Gui/MainWindowViewModelTests.cs similarity index 100% rename from TriasDev.Templify.Tools.Tests/Gui/MainWindowViewModelTests.cs rename to tests/TriasDev.Templify.Tools.Tests/Gui/MainWindowViewModelTests.cs diff --git a/TriasDev.Templify.Tools.Tests/Gui/OdtTestFile.cs b/tests/TriasDev.Templify.Tools.Tests/Gui/OdtTestFile.cs similarity index 100% rename from TriasDev.Templify.Tools.Tests/Gui/OdtTestFile.cs rename to tests/TriasDev.Templify.Tools.Tests/Gui/OdtTestFile.cs diff --git a/TriasDev.Templify.Tools.Tests/Gui/TemplifyServiceTests.cs b/tests/TriasDev.Templify.Tools.Tests/Gui/TemplifyServiceTests.cs similarity index 100% rename from TriasDev.Templify.Tools.Tests/Gui/TemplifyServiceTests.cs rename to tests/TriasDev.Templify.Tools.Tests/Gui/TemplifyServiceTests.cs diff --git a/tests/TriasDev.Templify.Tools.Tests/TriasDev.Templify.Tools.Tests.csproj b/tests/TriasDev.Templify.Tools.Tests/TriasDev.Templify.Tools.Tests.csproj new file mode 100644 index 0000000..ee1eb59 --- /dev/null +++ b/tests/TriasDev.Templify.Tools.Tests/TriasDev.Templify.Tools.Tests.csproj @@ -0,0 +1,12 @@ + + + + net10.0 + + + + + + + + diff --git a/TriasDev.Templify.Tools.Tests/packages.lock.json b/tests/TriasDev.Templify.Tools.Tests/packages.lock.json similarity index 100% rename from TriasDev.Templify.Tools.Tests/packages.lock.json rename to tests/TriasDev.Templify.Tools.Tests/packages.lock.json diff --git a/TriasDev.Templify.Converter/Analyzers/TemplateAnalyzer.cs b/tools/TriasDev.Templify.Converter/Analyzers/TemplateAnalyzer.cs similarity index 100% rename from TriasDev.Templify.Converter/Analyzers/TemplateAnalyzer.cs rename to tools/TriasDev.Templify.Converter/Analyzers/TemplateAnalyzer.cs diff --git a/TriasDev.Templify.Converter/Cli/CommandLineParser.cs b/tools/TriasDev.Templify.Converter/Cli/CommandLineParser.cs similarity index 100% rename from TriasDev.Templify.Converter/Cli/CommandLineParser.cs rename to tools/TriasDev.Templify.Converter/Cli/CommandLineParser.cs diff --git a/TriasDev.Templify.Converter/Converters/ConditionBuilder.cs b/tools/TriasDev.Templify.Converter/Converters/ConditionBuilder.cs similarity index 100% rename from TriasDev.Templify.Converter/Converters/ConditionBuilder.cs rename to tools/TriasDev.Templify.Converter/Converters/ConditionBuilder.cs diff --git a/TriasDev.Templify.Converter/Converters/ConditionalConverter.cs b/tools/TriasDev.Templify.Converter/Converters/ConditionalConverter.cs similarity index 100% rename from TriasDev.Templify.Converter/Converters/ConditionalConverter.cs rename to tools/TriasDev.Templify.Converter/Converters/ConditionalConverter.cs diff --git a/TriasDev.Templify.Converter/Converters/ControlConversionException.cs b/tools/TriasDev.Templify.Converter/Converters/ControlConversionException.cs similarity index 100% rename from TriasDev.Templify.Converter/Converters/ControlConversionException.cs rename to tools/TriasDev.Templify.Converter/Converters/ControlConversionException.cs diff --git a/TriasDev.Templify.Converter/Converters/DocumentCleaner.cs b/tools/TriasDev.Templify.Converter/Converters/DocumentCleaner.cs similarity index 100% rename from TriasDev.Templify.Converter/Converters/DocumentCleaner.cs rename to tools/TriasDev.Templify.Converter/Converters/DocumentCleaner.cs diff --git a/TriasDev.Templify.Converter/Converters/MarkerPlacement.cs b/tools/TriasDev.Templify.Converter/Converters/MarkerPlacement.cs similarity index 100% rename from TriasDev.Templify.Converter/Converters/MarkerPlacement.cs rename to tools/TriasDev.Templify.Converter/Converters/MarkerPlacement.cs diff --git a/TriasDev.Templify.Converter/Converters/OpenXmlHelpers.cs b/tools/TriasDev.Templify.Converter/Converters/OpenXmlHelpers.cs similarity index 100% rename from TriasDev.Templify.Converter/Converters/OpenXmlHelpers.cs rename to tools/TriasDev.Templify.Converter/Converters/OpenXmlHelpers.cs diff --git a/TriasDev.Templify.Converter/Converters/OpenXmlTemplatesTag.cs b/tools/TriasDev.Templify.Converter/Converters/OpenXmlTemplatesTag.cs similarity index 100% rename from TriasDev.Templify.Converter/Converters/OpenXmlTemplatesTag.cs rename to tools/TriasDev.Templify.Converter/Converters/OpenXmlTemplatesTag.cs diff --git a/TriasDev.Templify.Converter/Converters/RepeatingConverter.cs b/tools/TriasDev.Templify.Converter/Converters/RepeatingConverter.cs similarity index 100% rename from TriasDev.Templify.Converter/Converters/RepeatingConverter.cs rename to tools/TriasDev.Templify.Converter/Converters/RepeatingConverter.cs diff --git a/TriasDev.Templify.Converter/Converters/SafeFileWriter.cs b/tools/TriasDev.Templify.Converter/Converters/SafeFileWriter.cs similarity index 100% rename from TriasDev.Templify.Converter/Converters/SafeFileWriter.cs rename to tools/TriasDev.Templify.Converter/Converters/SafeFileWriter.cs diff --git a/TriasDev.Templify.Converter/Converters/TemplateConverter.cs b/tools/TriasDev.Templify.Converter/Converters/TemplateConverter.cs similarity index 100% rename from TriasDev.Templify.Converter/Converters/TemplateConverter.cs rename to tools/TriasDev.Templify.Converter/Converters/TemplateConverter.cs diff --git a/TriasDev.Templify.Converter/Converters/VariableConverter.cs b/tools/TriasDev.Templify.Converter/Converters/VariableConverter.cs similarity index 100% rename from TriasDev.Templify.Converter/Converters/VariableConverter.cs rename to tools/TriasDev.Templify.Converter/Converters/VariableConverter.cs diff --git a/TriasDev.Templify.Converter/Models/AnalysisResult.cs b/tools/TriasDev.Templify.Converter/Models/AnalysisResult.cs similarity index 100% rename from TriasDev.Templify.Converter/Models/AnalysisResult.cs rename to tools/TriasDev.Templify.Converter/Models/AnalysisResult.cs diff --git a/TriasDev.Templify.Converter/Models/ControlInfo.cs b/tools/TriasDev.Templify.Converter/Models/ControlInfo.cs similarity index 100% rename from TriasDev.Templify.Converter/Models/ControlInfo.cs rename to tools/TriasDev.Templify.Converter/Models/ControlInfo.cs diff --git a/TriasDev.Templify.Converter/Models/ConversionResult.cs b/tools/TriasDev.Templify.Converter/Models/ConversionResult.cs similarity index 100% rename from TriasDev.Templify.Converter/Models/ConversionResult.cs rename to tools/TriasDev.Templify.Converter/Models/ConversionResult.cs diff --git a/TriasDev.Templify.Converter/Program.cs b/tools/TriasDev.Templify.Converter/Program.cs similarity index 100% rename from TriasDev.Templify.Converter/Program.cs rename to tools/TriasDev.Templify.Converter/Program.cs diff --git a/TriasDev.Templify.Converter/README.md b/tools/TriasDev.Templify.Converter/README.md similarity index 91% rename from TriasDev.Templify.Converter/README.md rename to tools/TriasDev.Templify.Converter/README.md index b93053a..0dc497a 100644 --- a/TriasDev.Templify.Converter/README.md +++ b/tools/TriasDev.Templify.Converter/README.md @@ -23,16 +23,16 @@ The Templify Converter is a command-line tool designed to help migrate Word docu ```bash # 1. Analyze your template to understand its structure -dotnet run --project TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- analyze my-template.docx +dotnet run --project tools/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- analyze my-template.docx # 2. Review the generated analysis report cat my-template-analysis-report.md # 3. Convert the template to Templify format -dotnet run --project TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- convert my-template.docx +dotnet run --project tools/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- convert my-template.docx # 4. Validate the converted document -dotnet run --project TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- validate my-template-templify.docx +dotnet run --project tools/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- validate my-template-templify.docx ``` ### Using Helper Scripts (Recommended) @@ -49,7 +49,7 @@ chmod +x scripts/*.sh ./scripts/validate.sh my-template-templify.docx ``` -See [scripts/README.md](../scripts/README.md) for complete script documentation. +See [scripts/README.md](../../scripts/README.md) for complete script documentation. ## Commands Reference @@ -67,7 +67,7 @@ Analyzes an OpenXMLTemplates document and generates a detailed report about cont **Syntax:** ```bash -dotnet run --project TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- analyze [options] +dotnet run --project tools/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- analyze [options] ``` **Parameters:** @@ -118,7 +118,7 @@ Converts an OpenXMLTemplates document to Templify format by replacing content co **Syntax:** ```bash -dotnet run --project TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- convert [options] +dotnet run --project tools/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- convert [options] ``` **Parameters:** @@ -187,7 +187,7 @@ Validates that a Word document is well-formed and can be opened successfully. **Syntax:** ```bash -dotnet run --project TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- validate +dotnet run --project tools/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- validate ``` **Parameters:** @@ -225,7 +225,7 @@ Removes all Structured Document Tag (SDT) elements from a document while preserv **Syntax:** ```bash -dotnet run --project TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- clean [options] +dotnet run --project tools/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- clean [options] ``` **Parameters:** @@ -266,9 +266,9 @@ Displays usage information and command descriptions. **Syntax:** ```bash -dotnet run --project TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- help -dotnet run --project TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- --help -dotnet run --project TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- -h +dotnet run --project tools/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- help +dotnet run --project tools/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- --help +dotnet run --project tools/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj -- -h ``` **Output:** @@ -334,7 +334,7 @@ cat templates/letter-templify-conversion-report.md **5. Testing Phase** ```bash # Test with actual data using Templify library -dotnet run --project TriasDev.Templify.Demo/TriasDev.Templify.Demo.csproj +dotnet run --project samples/TriasDev.Templify.Demo/TriasDev.Templify.Demo.csproj # Or create a custom test program dotnet new console -n TemplifyTest @@ -581,7 +581,7 @@ chmod +x scripts/convert.sh 2. Check the error in the conversion report: the converter reports every tag it cannot translate into valid Templify syntax (supported operators: eq, ne, gt, lt, gte, lte, and, or, not) 3. Manually create the conditional in Templify syntax after conversion -4. Refer to [Templify conditional documentation](../TriasDev.Templify/README.md#conditional-blocks) +4. Refer to [Templify conditional documentation](../../src/TriasDev.Templify/README.md#conditional-blocks) ### Issue: Nested Loops Not Working @@ -664,11 +664,11 @@ before rebuilding it, risking data loss; it has been removed. ## Related Documentation -- 📖 **[Templify Library Documentation](../TriasDev.Templify/README.md)** - Full API reference and usage guide -- 🏗️ **[Architecture Documentation](../TriasDev.Templify/ARCHITECTURE.md)** - Technical design details -- 📝 **[Code Examples](../TriasDev.Templify/Examples.md)** - Templify usage examples -- 🤖 **[Development Guide](../CLAUDE.md)** - AI-assisted development guidance -- 📜 **[Script Documentation](../scripts/README.md)** - Helper script usage +- 📖 **[Templify Library Documentation](../../src/TriasDev.Templify/README.md)** - Full API reference and usage guide +- 🏗️ **[Architecture Documentation](../../src/TriasDev.Templify/ARCHITECTURE.md)** - Technical design details +- 📝 **[Code Examples](../../src/TriasDev.Templify/Examples.md)** - Templify usage examples +- 🤖 **[Development Guide](../../CLAUDE.md)** - AI-assisted development guidance +- 📜 **[Script Documentation](../../scripts/README.md)** - Helper script usage --- @@ -677,7 +677,7 @@ before rebuilding it, risking data loss; it has been removed. For issues or questions: - Review the [Troubleshooting](#troubleshooting) section - Check conversion reports for specific warnings -- Consult the [Templify documentation](../TriasDev.Templify/README.md) +- Consult the [Templify documentation](../../src/TriasDev.Templify/README.md) - Contact TriasDev internal support --- diff --git a/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj b/tools/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj similarity index 78% rename from TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj rename to tools/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj index ee5d214..b0e1a0c 100644 --- a/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj +++ b/tools/TriasDev.Templify.Converter/TriasDev.Templify.Converter.csproj @@ -13,7 +13,7 @@ - + diff --git a/TriasDev.Templify.Converter/Validators/DocumentValidator.cs b/tools/TriasDev.Templify.Converter/Validators/DocumentValidator.cs similarity index 100% rename from TriasDev.Templify.Converter/Validators/DocumentValidator.cs rename to tools/TriasDev.Templify.Converter/Validators/DocumentValidator.cs diff --git a/TriasDev.Templify.Demo/packages.lock.json b/tools/TriasDev.Templify.Converter/packages.lock.json similarity index 100% rename from TriasDev.Templify.Demo/packages.lock.json rename to tools/TriasDev.Templify.Converter/packages.lock.json diff --git a/TriasDev.Templify.DocumentGenerator/.env.example b/tools/TriasDev.Templify.DocumentGenerator/.env.example similarity index 100% rename from TriasDev.Templify.DocumentGenerator/.env.example rename to tools/TriasDev.Templify.DocumentGenerator/.env.example diff --git a/TriasDev.Templify.DocumentGenerator/BaseExampleGenerator.cs b/tools/TriasDev.Templify.DocumentGenerator/BaseExampleGenerator.cs similarity index 100% rename from TriasDev.Templify.DocumentGenerator/BaseExampleGenerator.cs rename to tools/TriasDev.Templify.DocumentGenerator/BaseExampleGenerator.cs diff --git a/TriasDev.Templify.DocumentGenerator/ExampleGenerators.cs b/tools/TriasDev.Templify.DocumentGenerator/ExampleGenerators.cs similarity index 100% rename from TriasDev.Templify.DocumentGenerator/ExampleGenerators.cs rename to tools/TriasDev.Templify.DocumentGenerator/ExampleGenerators.cs diff --git a/TriasDev.Templify.DocumentGenerator/Generators/AdvancedConditionalGenerator.cs b/tools/TriasDev.Templify.DocumentGenerator/Generators/AdvancedConditionalGenerator.cs similarity index 100% rename from TriasDev.Templify.DocumentGenerator/Generators/AdvancedConditionalGenerator.cs rename to tools/TriasDev.Templify.DocumentGenerator/Generators/AdvancedConditionalGenerator.cs diff --git a/TriasDev.Templify.DocumentGenerator/Generators/ConditionalGenerator.cs b/tools/TriasDev.Templify.DocumentGenerator/Generators/ConditionalGenerator.cs similarity index 100% rename from TriasDev.Templify.DocumentGenerator/Generators/ConditionalGenerator.cs rename to tools/TriasDev.Templify.DocumentGenerator/Generators/ConditionalGenerator.cs diff --git a/TriasDev.Templify.DocumentGenerator/Generators/HelloWorldGenerator.cs b/tools/TriasDev.Templify.DocumentGenerator/Generators/HelloWorldGenerator.cs similarity index 100% rename from TriasDev.Templify.DocumentGenerator/Generators/HelloWorldGenerator.cs rename to tools/TriasDev.Templify.DocumentGenerator/Generators/HelloWorldGenerator.cs diff --git a/TriasDev.Templify.DocumentGenerator/Generators/InvoiceGenerator.cs b/tools/TriasDev.Templify.DocumentGenerator/Generators/InvoiceGenerator.cs similarity index 100% rename from TriasDev.Templify.DocumentGenerator/Generators/InvoiceGenerator.cs rename to tools/TriasDev.Templify.DocumentGenerator/Generators/InvoiceGenerator.cs diff --git a/TriasDev.Templify.DocumentGenerator/Generators/LibreOfficeLetterGenerator.cs b/tools/TriasDev.Templify.DocumentGenerator/Generators/LibreOfficeLetterGenerator.cs similarity index 100% rename from TriasDev.Templify.DocumentGenerator/Generators/LibreOfficeLetterGenerator.cs rename to tools/TriasDev.Templify.DocumentGenerator/Generators/LibreOfficeLetterGenerator.cs diff --git a/TriasDev.Templify.DocumentGenerator/Generators/WarningReportTemplateGenerator.cs b/tools/TriasDev.Templify.DocumentGenerator/Generators/WarningReportTemplateGenerator.cs similarity index 100% rename from TriasDev.Templify.DocumentGenerator/Generators/WarningReportTemplateGenerator.cs rename to tools/TriasDev.Templify.DocumentGenerator/Generators/WarningReportTemplateGenerator.cs diff --git a/TriasDev.Templify.DocumentGenerator/IExampleGenerator.cs b/tools/TriasDev.Templify.DocumentGenerator/IExampleGenerator.cs similarity index 100% rename from TriasDev.Templify.DocumentGenerator/IExampleGenerator.cs rename to tools/TriasDev.Templify.DocumentGenerator/IExampleGenerator.cs diff --git a/TriasDev.Templify.DocumentGenerator/Program.cs b/tools/TriasDev.Templify.DocumentGenerator/Program.cs similarity index 96% rename from TriasDev.Templify.DocumentGenerator/Program.cs rename to tools/TriasDev.Templify.DocumentGenerator/Program.cs index cb184a2..fbbb1a2 100644 --- a/TriasDev.Templify.DocumentGenerator/Program.cs +++ b/tools/TriasDev.Templify.DocumentGenerator/Program.cs @@ -9,7 +9,7 @@ var baseDir = RepositoryPaths.FindRepositoryRoot(); if (baseDir == null) { - Console.WriteLine("Error: Could not find the repository root (directory containing templify.sln and examples/)."); + Console.WriteLine("Error: Could not find the repository root (directory containing templify.slnx and examples/)."); return 1; } @@ -109,7 +109,7 @@ { Console.WriteLine("⚠ Skipping image conversion: STIRLING_PDF_URL not configured"); Console.WriteLine(" To enable image generation:"); - Console.WriteLine(" 1. Copy TriasDev.Templify.DocumentGenerator/.env.example to TriasDev.Templify.DocumentGenerator/.env"); + Console.WriteLine(" 1. Copy tools/TriasDev.Templify.DocumentGenerator/.env.example to tools/TriasDev.Templify.DocumentGenerator/.env"); Console.WriteLine(" 2. Set STIRLING_PDF_URL and STIRLING_PDF_API_KEY"); } else @@ -210,7 +210,7 @@ dir = Directory.GetParent(dir)?.FullName; } - var projectEnvPath = Path.Combine(repositoryRoot, "TriasDev.Templify.DocumentGenerator", ".env"); + var projectEnvPath = RepositoryPaths.GeneratorEnvFile(repositoryRoot); return File.Exists(projectEnvPath) ? projectEnvPath : null; } diff --git a/TriasDev.Templify.DocumentGenerator/README.md b/tools/TriasDev.Templify.DocumentGenerator/README.md similarity index 87% rename from TriasDev.Templify.DocumentGenerator/README.md rename to tools/TriasDev.Templify.DocumentGenerator/README.md index 12eaed3..82de0af 100644 --- a/TriasDev.Templify.DocumentGenerator/README.md +++ b/tools/TriasDev.Templify.DocumentGenerator/README.md @@ -18,9 +18,9 @@ A tool for automatically generating example Word documents and converting them t ### Setup 1. Copy the environment file (the tool looks for `.env` in the current directory and its parents, - then in `TriasDev.Templify.DocumentGenerator/`): + then in `tools/TriasDev.Templify.DocumentGenerator/`): ```bash - cp TriasDev.Templify.DocumentGenerator/.env.example TriasDev.Templify.DocumentGenerator/.env + cp tools/TriasDev.Templify.DocumentGenerator/.env.example tools/TriasDev.Templify.DocumentGenerator/.env ``` 2. Edit `.env` and configure your Stirling-PDF instance (`.env` is git-ignored): @@ -33,24 +33,24 @@ A tool for automatically generating example Word documents and converting them t **Generate all examples (documents + images):** ```bash -dotnet run --project TriasDev.Templify.DocumentGenerator +dotnet run --project tools/TriasDev.Templify.DocumentGenerator ``` **Generate specific example:** ```bash -dotnet run --project TriasDev.Templify.DocumentGenerator -- hello-world -dotnet run --project TriasDev.Templify.DocumentGenerator -- invoice -dotnet run --project TriasDev.Templify.DocumentGenerator -- conditionals -dotnet run --project TriasDev.Templify.DocumentGenerator -- advanced-conditionals -dotnet run --project TriasDev.Templify.DocumentGenerator -- warning-report +dotnet run --project tools/TriasDev.Templify.DocumentGenerator -- hello-world +dotnet run --project tools/TriasDev.Templify.DocumentGenerator -- invoice +dotnet run --project tools/TriasDev.Templify.DocumentGenerator -- conditionals +dotnet run --project tools/TriasDev.Templify.DocumentGenerator -- advanced-conditionals +dotnet run --project tools/TriasDev.Templify.DocumentGenerator -- warning-report ``` **Skip image generation:** ```bash -dotnet run --project TriasDev.Templify.DocumentGenerator -- --skip-images +dotnet run --project tools/TriasDev.Templify.DocumentGenerator -- --skip-images ``` -The repository root is located automatically (directory containing `templify.sln`), so the tool can be +The repository root is located automatically (directory containing `templify.slnx`), so the tool can be run from any directory. It exits with a non-zero code if any example fails to generate or process, or if image conversion was requested but fails. @@ -110,8 +110,8 @@ docs/images/examples/ - **Manual step**: The library embeds a copy of this template as a resource. After changing `WarningReportTemplateGenerator`, regenerate it and copy it into the core library: ```bash - dotnet run --project TriasDev.Templify.DocumentGenerator -- warning-report --skip-images - cp examples/templates/warning-report-template.docx TriasDev.Templify/Resources/WarningReportTemplate.docx + dotnet run --project tools/TriasDev.Templify.DocumentGenerator -- warning-report --skip-images + cp examples/templates/warning-report-template.docx src/TriasDev.Templify/Resources/WarningReportTemplate.docx ``` Then run the test suite (`ProcessingWarnings*` tests cover the report) before committing. @@ -210,7 +210,7 @@ docs/images/examples/ 3. Run the generator: ```bash - dotnet run --project TriasDev.Templify.DocumentGenerator -- my-example + dotnet run --project tools/TriasDev.Templify.DocumentGenerator -- my-example ``` ## Helper Methods @@ -299,7 +299,7 @@ The tool requires a running Stirling-PDF instance. Options: ### "STIRLING_PDF_URL not configured" **Solution**: -- Create `TriasDev.Templify.DocumentGenerator/.env` from `.env.example` +- Create `tools/TriasDev.Templify.DocumentGenerator/.env` from `.env.example` - Set `STIRLING_PDF_URL` variable - Restart the tool @@ -331,7 +331,7 @@ Currently, only the first page is captured. To capture all pages: ## Related Documentation -- [Templify Main README](../README.md) -- [Templify Examples](../TriasDev.Templify/Examples.md) -- [Scripts README](../scripts/README.md) -- [Contributing Guidelines](../CONTRIBUTING.md) +- [Templify Main README](../../README.md) +- [Templify Examples](../../src/TriasDev.Templify/Examples.md) +- [Scripts README](../../scripts/README.md) +- [Contributing Guidelines](../../CONTRIBUTING.md) diff --git a/TriasDev.Templify.DocumentGenerator/RepositoryPaths.cs b/tools/TriasDev.Templify.DocumentGenerator/RepositoryPaths.cs similarity index 85% rename from TriasDev.Templify.DocumentGenerator/RepositoryPaths.cs rename to tools/TriasDev.Templify.DocumentGenerator/RepositoryPaths.cs index 1fb6dd4..3ee9f5d 100644 --- a/TriasDev.Templify.DocumentGenerator/RepositoryPaths.cs +++ b/tools/TriasDev.Templify.DocumentGenerator/RepositoryPaths.cs @@ -6,7 +6,7 @@ namespace TriasDev.Templify.DocumentGenerator; public static class RepositoryPaths { /// - /// Finds the repository root (the directory containing templify.sln and examples/). + /// Finds the repository root (the directory containing templify.slnx and examples/). /// Searches upwards from the current directory first, then from the application's base directory /// (so dotnet run --project works from any directory inside or outside the repository). /// @@ -24,7 +24,7 @@ public static class RepositoryPaths var dir = new DirectoryInfo(startDirectory); while (dir != null) { - if (File.Exists(Path.Combine(dir.FullName, "templify.sln")) + if (File.Exists(Path.Combine(dir.FullName, "templify.slnx")) && Directory.Exists(Path.Combine(dir.FullName, "examples"))) { return dir.FullName; @@ -44,6 +44,10 @@ public static string TemplatesDirectory(string repositoryRoot) => public static string OutputsDirectory(string repositoryRoot) => Path.Combine(repositoryRoot, "examples", "outputs"); + /// The generator's own .env file (next to .env.example in the project directory). + public static string GeneratorEnvFile(string repositoryRoot) => + Path.Combine(repositoryRoot, "tools", "TriasDev.Templify.DocumentGenerator", ".env"); + /// Directory for PNG screenshots used by the MkDocs site. public static string ImagesDirectory(string repositoryRoot) => Path.Combine(repositoryRoot, "docs", "images", "examples"); diff --git a/TriasDev.Templify.DocumentGenerator/StirlingPdfConverter.cs b/tools/TriasDev.Templify.DocumentGenerator/StirlingPdfConverter.cs similarity index 100% rename from TriasDev.Templify.DocumentGenerator/StirlingPdfConverter.cs rename to tools/TriasDev.Templify.DocumentGenerator/StirlingPdfConverter.cs diff --git a/TriasDev.Templify.DocumentGenerator/TriasDev.Templify.DocumentGenerator.csproj b/tools/TriasDev.Templify.DocumentGenerator/TriasDev.Templify.DocumentGenerator.csproj similarity index 75% rename from TriasDev.Templify.DocumentGenerator/TriasDev.Templify.DocumentGenerator.csproj rename to tools/TriasDev.Templify.DocumentGenerator/TriasDev.Templify.DocumentGenerator.csproj index 8526960..da849fb 100644 --- a/TriasDev.Templify.DocumentGenerator/TriasDev.Templify.DocumentGenerator.csproj +++ b/tools/TriasDev.Templify.DocumentGenerator/TriasDev.Templify.DocumentGenerator.csproj @@ -10,7 +10,7 @@ - + diff --git a/TriasDev.Templify.DocumentGenerator/packages.lock.json b/tools/TriasDev.Templify.DocumentGenerator/packages.lock.json similarity index 100% rename from TriasDev.Templify.DocumentGenerator/packages.lock.json rename to tools/TriasDev.Templify.DocumentGenerator/packages.lock.json diff --git a/TriasDev.Templify.Gui/App.axaml b/tools/TriasDev.Templify.Gui/App.axaml similarity index 100% rename from TriasDev.Templify.Gui/App.axaml rename to tools/TriasDev.Templify.Gui/App.axaml diff --git a/TriasDev.Templify.Gui/App.axaml.cs b/tools/TriasDev.Templify.Gui/App.axaml.cs similarity index 100% rename from TriasDev.Templify.Gui/App.axaml.cs rename to tools/TriasDev.Templify.Gui/App.axaml.cs diff --git a/TriasDev.Templify.Gui/Assets/templify.ico b/tools/TriasDev.Templify.Gui/Assets/templify.ico similarity index 100% rename from TriasDev.Templify.Gui/Assets/templify.ico rename to tools/TriasDev.Templify.Gui/Assets/templify.ico diff --git a/TriasDev.Templify.Gui/Models/CultureOption.cs b/tools/TriasDev.Templify.Gui/Models/CultureOption.cs similarity index 100% rename from TriasDev.Templify.Gui/Models/CultureOption.cs rename to tools/TriasDev.Templify.Gui/Models/CultureOption.cs diff --git a/TriasDev.Templify.Gui/Models/UiProcessingResult.cs b/tools/TriasDev.Templify.Gui/Models/UiProcessingResult.cs similarity index 100% rename from TriasDev.Templify.Gui/Models/UiProcessingResult.cs rename to tools/TriasDev.Templify.Gui/Models/UiProcessingResult.cs diff --git a/TriasDev.Templify.Gui/Program.cs b/tools/TriasDev.Templify.Gui/Program.cs similarity index 100% rename from TriasDev.Templify.Gui/Program.cs rename to tools/TriasDev.Templify.Gui/Program.cs diff --git a/TriasDev.Templify.Gui/README.md b/tools/TriasDev.Templify.Gui/README.md similarity index 86% rename from TriasDev.Templify.Gui/README.md rename to tools/TriasDev.Templify.Gui/README.md index 307941f..9451e05 100644 --- a/TriasDev.Templify.Gui/README.md +++ b/tools/TriasDev.Templify.Gui/README.md @@ -19,22 +19,22 @@ This GUI application provides an interactive interface to: ### From Command Line -Navigate to the project directory and run: +From the repository root, run: ```bash -dotnet run --project TriasDev.Templify.Gui +dotnet run --project tools/TriasDev.Templify.Gui ``` Or from the GUI project directory: ```bash -cd TriasDev.Templify.Gui +cd tools/TriasDev.Templify.Gui dotnet run ``` ### From Visual Studio / Rider -1. Open `templify.sln` in Visual Studio or Rider +1. Open `templify.slnx` in Visual Studio or Rider 2. Set `TriasDev.Templify.Gui` as the startup project 3. Press F5 or click Run @@ -48,7 +48,7 @@ Build a self-contained executable: dotnet publish TriasDev.Templify.Gui -c Release -r win-x64 --self-contained ``` -Output: `TriasDev.Templify.Gui/bin/Release/net10.0/win-x64/publish/TriasDev.Templify.Gui.exe` +Output: `tools/TriasDev.Templify.Gui/bin/Release/net10.0/win-x64/publish/TriasDev.Templify.Gui.exe` ### macOS @@ -58,7 +58,7 @@ Build a self-contained application: dotnet publish TriasDev.Templify.Gui -c Release -r osx-x64 --self-contained ``` -Output: `TriasDev.Templify.Gui/bin/Release/net10.0/osx-x64/publish/TriasDev.Templify.Gui` +Output: `tools/TriasDev.Templify.Gui/bin/Release/net10.0/osx-x64/publish/TriasDev.Templify.Gui` ### Linux @@ -68,7 +68,7 @@ Build a self-contained application: dotnet publish TriasDev.Templify.Gui -c Release -r linux-x64 --self-contained ``` -Output: `TriasDev.Templify.Gui/bin/Release/net10.0/linux-x64/publish/TriasDev.Templify.Gui` +Output: `tools/TriasDev.Templify.Gui/bin/Release/net10.0/linux-x64/publish/TriasDev.Templify.Gui` ## Using the Application @@ -120,7 +120,7 @@ The application follows MVVM architecture: ### Project Structure ``` -TriasDev.Templify.Gui/ +tools/TriasDev.Templify.Gui/ ├── App.axaml # Application definition ├── App.axaml.cs # Application startup ├── Program.cs # Entry point @@ -151,7 +151,7 @@ bridge (`AvaloniaUI.DiagnosticsSupport`): ViewModel and service tests live in `TriasDev.Templify.Tools.Tests` and run headless (no display required): ```bash -dotnet test TriasDev.Templify.Tools.Tests/TriasDev.Templify.Tools.Tests.csproj +dotnet test tests/TriasDev.Templify.Tools.Tests/TriasDev.Templify.Tools.Tests.csproj ``` ## Troubleshooting @@ -189,11 +189,11 @@ dotnet test TriasDev.Templify.Tools.Tests/TriasDev.Templify.Tools.Tests.csproj ## Related Documentation -- [Main Documentation](../TriasDev.Templify/README.md) - Complete Templify API reference +- [Main Documentation](../../src/TriasDev.Templify/README.md) - Complete Templify API reference - [Quick Start Guide](../docs/quick-start.md) - Get started with Templify -- [Format Specifiers Guide](../docs/for-template-authors/format-specifiers.md) - Boolean formatting -- [Boolean Expressions Guide](../docs/for-template-authors/boolean-expressions.md) - Logic evaluation -- [FAQ](../docs/FAQ.md) - Common questions and answers +- [Format Specifiers Guide](../../docs/for-template-authors/format-specifiers.md) - Boolean formatting +- [Boolean Expressions Guide](../../docs/for-template-authors/boolean-expressions.md) - Logic evaluation +- [FAQ](../../docs/FAQ.md) - Common questions and answers ## Contributing diff --git a/TriasDev.Templify.Gui/Services/FileDialogService.cs b/tools/TriasDev.Templify.Gui/Services/FileDialogService.cs similarity index 100% rename from TriasDev.Templify.Gui/Services/FileDialogService.cs rename to tools/TriasDev.Templify.Gui/Services/FileDialogService.cs diff --git a/TriasDev.Templify.Gui/Services/IFileDialogService.cs b/tools/TriasDev.Templify.Gui/Services/IFileDialogService.cs similarity index 100% rename from TriasDev.Templify.Gui/Services/IFileDialogService.cs rename to tools/TriasDev.Templify.Gui/Services/IFileDialogService.cs diff --git a/TriasDev.Templify.Gui/Services/IFileLauncher.cs b/tools/TriasDev.Templify.Gui/Services/IFileLauncher.cs similarity index 100% rename from TriasDev.Templify.Gui/Services/IFileLauncher.cs rename to tools/TriasDev.Templify.Gui/Services/IFileLauncher.cs diff --git a/TriasDev.Templify.Gui/Services/ITemplifyService.cs b/tools/TriasDev.Templify.Gui/Services/ITemplifyService.cs similarity index 100% rename from TriasDev.Templify.Gui/Services/ITemplifyService.cs rename to tools/TriasDev.Templify.Gui/Services/ITemplifyService.cs diff --git a/TriasDev.Templify.Gui/Services/ShellFileLauncher.cs b/tools/TriasDev.Templify.Gui/Services/ShellFileLauncher.cs similarity index 100% rename from TriasDev.Templify.Gui/Services/ShellFileLauncher.cs rename to tools/TriasDev.Templify.Gui/Services/ShellFileLauncher.cs diff --git a/TriasDev.Templify.Gui/Services/TemplifyService.cs b/tools/TriasDev.Templify.Gui/Services/TemplifyService.cs similarity index 100% rename from TriasDev.Templify.Gui/Services/TemplifyService.cs rename to tools/TriasDev.Templify.Gui/Services/TemplifyService.cs diff --git a/TriasDev.Templify.Gui/TriasDev.Templify.Gui.csproj b/tools/TriasDev.Templify.Gui/TriasDev.Templify.Gui.csproj similarity index 93% rename from TriasDev.Templify.Gui/TriasDev.Templify.Gui.csproj rename to tools/TriasDev.Templify.Gui/TriasDev.Templify.Gui.csproj index dc4d02e..62dbd38 100644 --- a/TriasDev.Templify.Gui/TriasDev.Templify.Gui.csproj +++ b/tools/TriasDev.Templify.Gui/TriasDev.Templify.Gui.csproj @@ -30,6 +30,6 @@ - + diff --git a/TriasDev.Templify.Gui/ViewModels/DesignMainWindowViewModel.cs b/tools/TriasDev.Templify.Gui/ViewModels/DesignMainWindowViewModel.cs similarity index 100% rename from TriasDev.Templify.Gui/ViewModels/DesignMainWindowViewModel.cs rename to tools/TriasDev.Templify.Gui/ViewModels/DesignMainWindowViewModel.cs diff --git a/TriasDev.Templify.Gui/ViewModels/MainWindowViewModel.cs b/tools/TriasDev.Templify.Gui/ViewModels/MainWindowViewModel.cs similarity index 100% rename from TriasDev.Templify.Gui/ViewModels/MainWindowViewModel.cs rename to tools/TriasDev.Templify.Gui/ViewModels/MainWindowViewModel.cs diff --git a/TriasDev.Templify.Gui/ViewModels/ViewModelBase.cs b/tools/TriasDev.Templify.Gui/ViewModels/ViewModelBase.cs similarity index 100% rename from TriasDev.Templify.Gui/ViewModels/ViewModelBase.cs rename to tools/TriasDev.Templify.Gui/ViewModels/ViewModelBase.cs diff --git a/TriasDev.Templify.Gui/Views/MainWindow.axaml b/tools/TriasDev.Templify.Gui/Views/MainWindow.axaml similarity index 100% rename from TriasDev.Templify.Gui/Views/MainWindow.axaml rename to tools/TriasDev.Templify.Gui/Views/MainWindow.axaml diff --git a/TriasDev.Templify.Gui/Views/MainWindow.axaml.cs b/tools/TriasDev.Templify.Gui/Views/MainWindow.axaml.cs similarity index 100% rename from TriasDev.Templify.Gui/Views/MainWindow.axaml.cs rename to tools/TriasDev.Templify.Gui/Views/MainWindow.axaml.cs diff --git a/TriasDev.Templify.Gui/app.manifest b/tools/TriasDev.Templify.Gui/app.manifest similarity index 100% rename from TriasDev.Templify.Gui/app.manifest rename to tools/TriasDev.Templify.Gui/app.manifest diff --git a/TriasDev.Templify.Gui/packages.lock.json b/tools/TriasDev.Templify.Gui/packages.lock.json similarity index 100% rename from TriasDev.Templify.Gui/packages.lock.json rename to tools/TriasDev.Templify.Gui/packages.lock.json