Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1837 commits
Select commit Hold shift + click to select a range
dbc4318
Use direct child access in remaining WKT2 readers
mkaring Apr 14, 2026
91cc577
Use GetChildrenSpan in remaining WKT1 readers
mkaring Apr 14, 2026
03478c8
Use direct child access in remaining WKT1 readers
mkaring Apr 14, 2026
8561319
Unify WktQuotedString raw content storage
mkaring Apr 14, 2026
b270b59
Review M97 reader migration consistency
mkaring Apr 14, 2026
b0202a8
Finalize M97 reader migration
mkaring Apr 14, 2026
3bd1200
Checkpoint M97 reader migration
mkaring Apr 14, 2026
d331ea1
Run M98 WKT benchmark suite
mkaring Apr 14, 2026
bbfa188
Document M98 benchmark comparisons
mkaring Apr 14, 2026
1fe3a74
Assess M98 parser performance
mkaring Apr 14, 2026
4c5dc0a
Review M98 benchmark artifacts
mkaring Apr 14, 2026
30c1eca
Finalize M98 benchmark verification
mkaring Apr 14, 2026
5c60e01
Checkpoint M98 benchmark verification
mkaring Apr 14, 2026
924ee14
Audit M99 private null guards
mkaring Apr 14, 2026
d9a71d0
Remove redundant private reader null guards
mkaring Apr 14, 2026
c798e99
Record M99 unit test impact
mkaring Apr 14, 2026
db7b70e
Record M99 benchmark impact
mkaring Apr 14, 2026
60af5e0
Review M99 guard cleanup
mkaring Apr 14, 2026
7f133b8
Finalize M99 guard cleanup
mkaring Apr 14, 2026
436fa7e
Checkpoint M99 guard cleanup
mkaring Apr 14, 2026
e813120
Remove dead WKT2 tokenizer overloads
mkaring Apr 15, 2026
f8e005f
Remove dead WKT1 tokenizer overloads
mkaring Apr 15, 2026
cb85dd5
Verify WKT overload removal
mkaring Apr 15, 2026
88805b2
Remove unused WKT reader helper
mkaring Apr 15, 2026
29b8206
Remove dead WKT reader usings
mkaring Apr 15, 2026
2a8e782
Remove dead WktKeywordNode helpers
mkaring Apr 15, 2026
4b33980
Remove dead ArgumentGuard helpers
mkaring Apr 15, 2026
500aa3b
Remove transformation test wrappers
mkaring Apr 15, 2026
7c8b9fe
Verify dead code removal
mkaring Apr 15, 2026
8a0ae49
Review dead code cleanup
mkaring Apr 15, 2026
15e4705
Rerun M100 benchmarks
mkaring Apr 15, 2026
80f8a50
Finalize dead code cleanup
mkaring Apr 15, 2026
70ddd7b
Checkpoint M100 completion
mkaring Apr 15, 2026
f605d27
Add WKT parse exception
mkaring Apr 15, 2026
5aef508
Use WKT parse exception in tokenizer
mkaring Apr 15, 2026
87bb441
Narrow native WKT2 fallback catch
mkaring Apr 15, 2026
92bcd22
Narrow coordinate service fallback catch
mkaring Apr 15, 2026
3c9a7f5
Verify exception handling
mkaring Apr 15, 2026
ed2a9c8
Review exception handling
mkaring Apr 15, 2026
4fb2f01
Finalize exception handling
mkaring Apr 15, 2026
f9ec468
Checkpoint M101 completion
mkaring Apr 15, 2026
0c2447e
Audit WKT2 parser exceptions
mkaring Apr 15, 2026
3513e65
Audit ProjJSON parser arguments
mkaring Apr 15, 2026
36e35ac
Audit WKT tokenizer exceptions
mkaring Apr 15, 2026
b67f78a
Audit remaining IO parser exceptions
mkaring Apr 15, 2026
13ab0f9
Verify parser audit
mkaring Apr 15, 2026
6d85c1a
Review parser audit
mkaring Apr 15, 2026
91c41b1
Finalize parser audit
mkaring Apr 15, 2026
474ac2b
Checkpoint parser audit
mkaring Apr 15, 2026
a882017
Audit projection domain exceptions
mkaring Apr 15, 2026
e3419d4
Audit projection constructor exceptions
mkaring Apr 15, 2026
68f9749
Verify projection exception audit
mkaring Apr 15, 2026
7b69cac
Review projection exception audit
mkaring Apr 15, 2026
5887631
Finalize projection exception audit
mkaring Apr 15, 2026
b103943
Checkpoint projection exception audit
mkaring Apr 15, 2026
7436ff4
Audit transformation exceptions
mkaring Apr 15, 2026
538a1f8
Audit coordinate factory exceptions
mkaring Apr 15, 2026
b83280f
Audit coordinate type exceptions
mkaring Apr 15, 2026
fc09fd2
Remove paramless argument guards
mkaring Apr 15, 2026
0b16998
Verify full exception audit
mkaring Apr 15, 2026
198d820
Review full exception audit
mkaring Apr 15, 2026
eaea5fc
Finalize exception audit
mkaring Apr 15, 2026
1dfe52c
Checkpoint exception audit
mkaring Apr 15, 2026
2444b36
Replace projection activator path
mkaring Apr 15, 2026
27cfc7f
Review projection factory delegates
mkaring Apr 15, 2026
ccab39e
Finalize projection factory delegates
mkaring Apr 15, 2026
291fccd
Checkpoint projection factory delegates
mkaring Apr 15, 2026
f38730e
Avoid FindChild params allocation
mkaring Apr 15, 2026
cb47ed7
Cache GeoTIFF metadata regex
mkaring Apr 15, 2026
c1cfce5
Add M106 performance benchmarks
mkaring Apr 15, 2026
d140509
Clean up GeoTIFF metadata guards
mkaring Apr 15, 2026
3d63096
Simplify deformation double bit casts
mkaring Apr 15, 2026
eb133b9
Document cache manifest fallback
mkaring Apr 15, 2026
9ff57ed
Clean up info clone dispatch
mkaring Apr 15, 2026
d2145cb
Verify M106 quality gates
mkaring Apr 15, 2026
26ad919
Review M106 quality cleanup
mkaring Apr 15, 2026
5dfec1e
Finalize M106 quality cleanup
mkaring Apr 15, 2026
4081d2e
Checkpoint M106 quality cleanup
mkaring Apr 15, 2026
1b4190b
Add defmodel time-function tests
mkaring Apr 15, 2026
64ee8be
Add GeoTIFF hgrid runtime tests
mkaring Apr 15, 2026
0716f5b
Add exotic CRS WKT2 roundtrip tests
mkaring Apr 15, 2026
a847b1b
Expand MathTransform WKT reader tests
mkaring Apr 15, 2026
9492409
Expand derivative projection coverage
mkaring Apr 15, 2026
2466326
Add WKT tokenizer edgecase tests
mkaring Apr 15, 2026
b43930b
Uncap GIE builtins theory data
mkaring Apr 15, 2026
07ff12c
Add dedicated GIE failure theory
mkaring Apr 15, 2026
c8f6966
Require committed GIGS fixtures
mkaring Apr 15, 2026
394b388
Relocate NKG fixture provenance docs
mkaring Apr 15, 2026
36c67ff
Close remaining CODE_REVIEW_5 gaps
mkaring Apr 15, 2026
35eb199
Add configurable PostGIS test connection
mkaring Apr 16, 2026
f2e69bc
Close omerc, tpeqd, and ocea GIE gaps
mkaring Apr 16, 2026
dc1b431
Implement general stereographic projection
mkaring Apr 16, 2026
dd41b0a
Add exact PROJ-style transverse Mercator support
mkaring Apr 16, 2026
cdc2ce1
Close mercator and sterea domain skips
mkaring Apr 16, 2026
5aeb864
Close Krovak NZMG Loxim and Ortho fidelity gaps
mkaring Apr 16, 2026
bdec114
Close S2 HEALPix and rHEALPix fidelity gaps
mkaring Apr 16, 2026
38e005f
Close ISEA Lagrange and Van der Grinten gaps
mkaring Apr 16, 2026
44b7d6e
Replace temporary skip-status tests
mkaring Apr 16, 2026
e052670
Update changelog and migration notes
mkaring Apr 16, 2026
264da34
Make projection coverage doc self-contained
mkaring Apr 16, 2026
b7355c6
Fix repository-relative grid doc paths
mkaring Apr 16, 2026
0f7b28f
Rename PROJ MIT license file
mkaring Apr 16, 2026
cac4d30
Refresh EPSG catalog to 12.054
mkaring Apr 16, 2026
8267295
Support 3D projected WKT2 archive parsing
mkaring Apr 16, 2026
9460deb
Record M118 benchmark baseline
mkaring Apr 17, 2026
3806096
Document M118 SQL dependency analysis
mkaring Apr 17, 2026
6c20db1
Add EPSG PostgreSQL ZIP parser
mkaring Apr 17, 2026
7e436d0
Replace PROJ SQL input with pg-zip
mkaring Apr 17, 2026
12c0c95
Emit lazy concatenated operation paths
mkaring Apr 17, 2026
1aa1746
Add pg-zip parameter to generator wrapper
mkaring Apr 17, 2026
6fd5a7a
Regenerate operations catalog from EPSG PostgreSQL
mkaring Apr 17, 2026
5a9b305
Wire concatenated operation runtime resolution
mkaring Apr 17, 2026
7527b82
Verify M118 concat runtime test suite
mkaring Apr 17, 2026
071f316
Record M118 post-change benchmarks
mkaring Apr 17, 2026
a064ee7
Review M118 generator migration
mkaring Apr 17, 2026
4c88773
Finalize M118 generator migration
mkaring Apr 17, 2026
c3ff358
Checkpoint M118 completion
mkaring Apr 17, 2026
0d2aff5
test: add shared EPSG archive WKT provider
mkaring Apr 18, 2026
ecf5d81
Migrate WKT2 tests to shared EPSG fixtures
mkaring Apr 18, 2026
dcddc6e
Add EPSG bulk functional sweep test
mkaring Apr 18, 2026
16c39e3
Review M119 shared test data
mkaring Apr 18, 2026
21c5911
Finalize M119 shared test data
mkaring Apr 18, 2026
345b73b
Checkpoint M119 completion
mkaring Apr 18, 2026
109580a
test: consolidate shared cs helpers
mkaring Apr 18, 2026
492b77f
test: consolidate transform test base
mkaring Apr 18, 2026
7263f22
Review M120 helper consolidation
mkaring Apr 18, 2026
8251da2
Finalize M120 helper consolidation
mkaring Apr 18, 2026
b945fa7
Checkpoint M120 completion
mkaring Apr 18, 2026
270b94f
Migrate parser core EPSG WKTs to shared fixtures
mkaring Apr 18, 2026
f163d2b
Migrate EPSG equivalence tests to shared fixtures
mkaring Apr 18, 2026
de38619
Migrate regression EPSG WKTs to shared fixtures
mkaring Apr 18, 2026
5195f6a
Finish WKT2 EPSG fixture migration
mkaring Apr 18, 2026
4c0d1c3
Review M121 WKT migration
mkaring Apr 18, 2026
8827d06
Finalize M121 WKT migration
mkaring Apr 18, 2026
b4b4fca
Checkpoint M121 completion
mkaring Apr 18, 2026
5fc29ac
Move projection tests under CoordinateSystems/Projections
mkaring Apr 18, 2026
0f5ca10
Move data tests under Data
mkaring Apr 18, 2026
744a0a2
Move transform tests under CoordinateSystems/Transformations
mkaring Apr 18, 2026
eb356f9
Consolidate legacy WKT tests under IO/CoordinateSystems
mkaring Apr 18, 2026
0ef1104
Move remaining tests into organized directories
mkaring Apr 18, 2026
e342e7c
Review M122 test directory restructuring
mkaring Apr 18, 2026
2e71a75
Finalize M122 test directory restructuring
mkaring Apr 18, 2026
3266c1a
Checkpoint M122 completion
mkaring Apr 18, 2026
ece407a
Fix CA1814 suppression target in test project
mkaring Apr 18, 2026
eb0c1bd
Prepare v3 release housekeeping: version, gitattributes, remove unuse…
mkaring Apr 18, 2026
1dacf14
Optimize generated EPSG catalog lookups
mkaring Apr 18, 2026
dc4bda2
Harden EPSG generation wrapper
mkaring Apr 18, 2026
fd1a126
Fix public XML doc mismatches
mkaring Apr 19, 2026
dbe83c5
Document CreateTransformation exceptions
mkaring Apr 19, 2026
3bd0d20
Align 3D transform return docs
mkaring Apr 19, 2026
07d90b0
Review M126 XML doc corrections
mkaring Apr 19, 2026
994b6d5
Finalize M126 XML doc corrections
mkaring Apr 19, 2026
5c3529a
Checkpoint M126 XML doc corrections
mkaring Apr 19, 2026
2196868
Isolate MapProjection legacy aliases
mkaring Apr 19, 2026
6b47ef8
Review M127 legacy alias isolation
mkaring Apr 19, 2026
26a18d5
Finalize M127 legacy alias isolation
mkaring Apr 19, 2026
a048954
Checkpoint M127 legacy alias isolation
mkaring Apr 19, 2026
d35a819
Fix public API baseline guidance
mkaring Apr 19, 2026
1d53cac
Align changelog prerelease header
mkaring Apr 19, 2026
dc303c5
Correct baseline policy wording
mkaring Apr 19, 2026
1ccb667
Fix baseline test path in governance doc
mkaring Apr 19, 2026
1bf65b6
Fix changelog version source note
mkaring Apr 19, 2026
9ce4776
Review M128 governance and changelog docs
mkaring Apr 19, 2026
343988b
Finalize M128 governance and changelog docs
mkaring Apr 19, 2026
5949097
Checkpoint M128 governance and changelog docs
mkaring Apr 19, 2026
500519d
Modernize README quick usage
mkaring Apr 19, 2026
d69d2ec
Add README scope and non-goals
mkaring Apr 19, 2026
ad5f104
Add README format guidance
mkaring Apr 19, 2026
0cabf82
Deduplicate README projection coverage
mkaring Apr 19, 2026
d3245f0
Standardize ProjNET terminology
mkaring Apr 19, 2026
aec75d6
Fix README review follow-ups
mkaring Apr 19, 2026
f10ecf7
Fix README projection summary wording
mkaring Apr 19, 2026
d654ea4
Review M129 changes
mkaring Apr 19, 2026
077c494
Finalize M129 validation
mkaring Apr 19, 2026
64c32bd
Checkpoint M129 completion
mkaring Apr 19, 2026
9376d91
Add concepts documentation
mkaring Apr 19, 2026
c38119c
Add cookbook documentation
mkaring Apr 19, 2026
7716e4a
Add grid configuration documentation
mkaring Apr 19, 2026
c1d0f50
Add docs index
mkaring Apr 19, 2026
ee089be
Review M130 documentation
mkaring Apr 19, 2026
556c57e
Finalize M130 validation
mkaring Apr 19, 2026
bb9b6b6
Checkpoint M130 completion
mkaring Apr 19, 2026
b26f911
Expand Adams projection citations
mkaring Apr 19, 2026
c97390f
Expand map projection references
mkaring Apr 19, 2026
97bf312
Refine datum remarks voice
mkaring Apr 19, 2026
feb42f4
Clarify GeoTIFF notice rationale
mkaring Apr 19, 2026
2172317
Complete Guyou citation details
mkaring Apr 19, 2026
ab1141f
Correct Peirce citation pages
mkaring Apr 19, 2026
8444494
Correct Adams publication reference
mkaring Apr 19, 2026
a43e0c6
Neutralize disputed Adams citations
mkaring Apr 19, 2026
57c0050
Review M131 documentation polish
mkaring Apr 19, 2026
cfffccc
Finalize M131 validation
mkaring Apr 19, 2026
272c2fa
Checkpoint M131 completion
mkaring Apr 19, 2026
841032e
Link README to new docs
mkaring Apr 19, 2026
41565c1
Harden workflow default permissions
mkaring Apr 19, 2026
2b19dd5
Upgrade official workflow actions
mkaring Apr 19, 2026
5e0a457
Cache NuGet packages in workflows
mkaring Apr 19, 2026
d097320
Add workflow concurrency controls
mkaring Apr 19, 2026
eae5fba
Pin repository SDK via global.json
mkaring Apr 19, 2026
361d00e
Ignore local CI output directories
mkaring Apr 19, 2026
02d4287
Fix publish job SDK setup
mkaring Apr 19, 2026
68d177f
Broaden mutation workflow triggers
mkaring Apr 19, 2026
35941ee
Align mutation output paths
mkaring Apr 19, 2026
ab7a7a1
Review CI foundation changes
mkaring Apr 19, 2026
c81f36c
Finalize CI foundation milestone
mkaring Apr 19, 2026
5bf4e0e
Checkpoint CI foundation milestone
mkaring Apr 19, 2026
e6512e4
Collect coverage in CI test run
mkaring Apr 19, 2026
1218d68
Upload coverage artifacts from CI
mkaring Apr 19, 2026
508dcc2
Report coverage in CI and pull requests
mkaring Apr 19, 2026
868efd9
Verify coverage collection locally
mkaring Apr 19, 2026
60b285a
Guard coverage comments for external PRs
mkaring Apr 19, 2026
fc55f1b
Harden coverage reporting workflow
mkaring Apr 19, 2026
9ce886e
Separate coverage summary and comment jobs
mkaring Apr 19, 2026
d5b2a18
Track coverage summary artifact status
mkaring Apr 19, 2026
cc4c909
Handle missing coverage summaries in PR comments
mkaring Apr 19, 2026
e28418e
Review coverage reporting changes
mkaring Apr 19, 2026
1a8d0c5
Finalize coverage reporting milestone
mkaring Apr 19, 2026
062126c
Checkpoint coverage reporting milestone
mkaring Apr 19, 2026
328a3b4
Add benchmark monitoring workflow
mkaring Apr 19, 2026
9c2846b
Add benchmark regression tracking
mkaring Apr 19, 2026
2a5f081
Add explicit benchmark validation gate
mkaring Apr 19, 2026
afb09f1
Harden benchmark baseline persistence
mkaring Apr 19, 2026
cb6c962
Broaden benchmark smoke coverage
mkaring Apr 19, 2026
bc3071a
Share curated benchmark orchestration
mkaring Apr 19, 2026
f6e0429
Validate curated benchmark completeness
mkaring Apr 19, 2026
7c04717
Require exact curated benchmark entries
mkaring Apr 19, 2026
e97b26a
Validate exact curated benchmark set
mkaring Apr 19, 2026
b1d4610
Fix curated parity benchmark validation
mkaring Apr 19, 2026
acde34e
Review benchmark pipeline milestone
mkaring Apr 19, 2026
c4e6ad2
Finalize benchmark pipeline milestone
mkaring Apr 19, 2026
a0c84b9
Checkpoint benchmark pipeline milestone
mkaring Apr 19, 2026
043be73
Add CodeQL scanning workflow
mkaring Apr 19, 2026
d15cf18
Review CodeQL workflow milestone
mkaring Apr 19, 2026
2dc055e
Finalize CodeQL workflow milestone
mkaring Apr 19, 2026
0eda77f
Checkpoint CodeQL workflow milestone
mkaring Apr 19, 2026
1ca9d5b
Add Dependabot configuration
mkaring Apr 19, 2026
2920bab
Add dependency review gate
mkaring Apr 19, 2026
f99d215
Review dependency automation milestone
mkaring Apr 19, 2026
402898b
Finalize dependency automation milestone
mkaring Apr 19, 2026
93b9b04
Checkpoint dependency automation milestone
mkaring Apr 19, 2026
ca00028
Document CI governance
mkaring Apr 19, 2026
29cc9f4
Update Copilot CI instructions
mkaring Apr 19, 2026
f31c574
Review CI documentation milestone
mkaring Apr 19, 2026
38c059d
Finalize CI documentation milestone
mkaring Apr 19, 2026
38a213f
Checkpoint CI documentation milestone
mkaring Apr 19, 2026
4f69c3f
Fix missing StyleCop config in CI
mkaring Apr 20, 2026
e5f60a0
Fix CI-only path and fixture handling
mkaring Apr 20, 2026
ec8a2b4
Fix xUnit filter usage in CI gates
mkaring Apr 20, 2026
508f3b4
Fix package validation baseline suppressions
mkaring Apr 20, 2026
d16a272
Update pinned GitHub Actions versions
mkaring Apr 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
29 changes: 28 additions & 1 deletion .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,31 @@ dotnet_style_predefined_type_for_locals_parameters_members = true:error
dotnet_style_predefined_type_for_member_access = true:error
csharp_style_var_for_built_in_types = false:error
csharp_style_var_when_type_is_apparent = true:error
csharp_style_var_elsewhere = true:error
csharp_style_var_elsewhere = false:error
csharp_using_directive_placement = inside_namespace:error
csharp_style_namespace_declarations = file_scoped:error
dotnet_diagnostic.IDE0041.severity = error

dotnet_style_qualification_for_event = true:error
dotnet_style_qualification_for_field = true:error
dotnet_style_qualification_for_method = true:error
dotnet_style_qualification_for_property = true:error
dotnet_diagnostic.SA1633.severity = none
dotnet_diagnostic.SA1634.severity = none
dotnet_diagnostic.SA1635.severity = none
dotnet_diagnostic.SA1636.severity = none
dotnet_diagnostic.SA1637.severity = none
dotnet_diagnostic.SA1638.severity = none

[{test/ProjNet.Tests/*.cs,test/ProjNet.Tests/**/*.cs}]
dotnet_diagnostic.SA1611.severity = none
dotnet_diagnostic.CA1707.severity = none
dotnet_diagnostic.CS1591.severity = none

[src/ProjNet/CoordinateSystems/Projections/AiroceanProjection.cs]
dotnet_diagnostic.SA1117.severity = none
dotnet_diagnostic.SA1201.severity = none

[{src/ProjNet.Benchmark/*.cs,src/ProjNet.Benchmark/**/*.cs}]
dotnet_diagnostic.CA1822.severity = none
dotnet_diagnostic.CS1591.severity = none
27 changes: 26 additions & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
@@ -1,2 +1,27 @@
# Auto-detect text files and normalize line endings
* text=auto
*.cs text=auto diff=csharp

# Source code
*.cs text diff=csharp
*.csproj text diff=xml
*.props text diff=xml
*.targets text diff=xml
*.sln text eol=crlf

# Generated catalog — collapse in GitHub PRs
*.g.cs linguist-generated=true

# Scripts and config
*.py text diff=python
*.ps1 text
*.json text
*.xml text diff=xml
*.md text diff=markdown
*.txt text
*.yml text
*.yaml text
*.editorconfig text

# Archives
*.zip binary
*.nupkg binary
14 changes: 14 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Copilot instructions

## Repository context

- Build and test from the repository root.
- Build with `dotnet build .\ProjNet4GeoAPI.sln -c Release --tl:off -v minimal`.
- Test with `dotnet test --project .\test\ProjNet.Tests\ProjNET.Tests.csproj`.
- The main CI workflow is `.github/workflows/full-ci.yml`; benchmark monitoring lives in `.github/workflows/benchmarks.yml`; CodeQL uses `.github/workflows/codeql.yml`; mutation testing uses `.github/workflows/mutation-tests.yml`.
- Coverage generation mirrors CI after a Release build: run `dotnet tool restore`, then `dotnet build .\ProjNet4GeoAPI.sln -c Release --tl:off -v minimal`, then `dotnet dotnet-coverage collect --output .\coverage-out\coverage.cobertura.xml --output-format cobertura -- dotnet test --project .\test\ProjNet.Tests\ProjNET.Tests.csproj -c Release --no-build`.
- Curated benchmark runs mirror CI after a Release build: use `.\.github\scripts\Invoke-CuratedBenchmarks.ps1 -Mode Smoke -NoBuild` or `.\.github\scripts\Invoke-CuratedBenchmarks.ps1 -Mode Full -NoBuild`; keep `Get-CuratedBenchmarkConfiguration.ps1` as the single source of truth and validate converted datasets with `Convert-BenchmarkReports.ps1` plus `Assert-CuratedBenchmarkDataset.ps1`.
- The library ships `netstandard2.0`, `netstandard2.1`, and `net8.0`.
- Public API changes must update `src/ProjNet/PublicAPI.Shipped.txt` intentionally.
- In touched C# code, prefer `is null` / `is not null` checks and avoid broad warning suppressions.

26 changes: 26 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
version: 2

updates:
- package-ecosystem: nuget
directory: /
schedule:
interval: weekly
labels:
- dependencies
- nuget
commit-message:
prefix: 'deps(nuget):'
include: scope
ignore:
- dependency-name: StyleCop.Analyzers

- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
labels:
- dependencies
- github-actions
commit-message:
prefix: 'deps(actions):'
include: scope
14 changes: 14 additions & 0 deletions .github/instructions/csharp.instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# C# specific copilot instructions

## Mandatory quality gates

### Code analysis and code style

- Null checks must use pattern syntax: use `is null` and `is not null` instead of `== null` and `!= null`.

### Code Warnings and StyleCop warnings

- StyleCop warnings are blocking: fix them before task completion.
- Keep exceptions narrow and only for clearly generated code (for example `*.g.cs` files or files with a standard `<auto-generated>` header).
- Do not add broad suppressions (global, project-wide, or blanket pragmas). Any suppression change must be explicitly approved and scoped to a specific diagnostic.
- Any suppression must be accompanied by a justification comment that explains why the suppression is necessary and what the intended fix is (if applicable). The justification should be clear and concise, providing enough context for reviewers to understand the reasoning behind the suppression.
18 changes: 18 additions & 0 deletions .github/problem-matchers/dotnet.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"problemMatcher": [
{
"owner": "dotnet-msbuild",
"pattern": [
{
"regexp": "^(.*)\\((\\d+),(\\d+)\\):\\s+(warning|error)(?:\\s+([A-Za-z]+\\d+))?:\\s+(.*?)(?:\\s+\\[(.*)\\])?$",
"file": 1,
"line": 2,
"column": 3,
"severity": 4,
"code": 5,
"message": 6
}
]
}
]
}
72 changes: 72 additions & 0 deletions .github/scripts/Assert-CuratedBenchmarkDataset.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[string]$DatasetPath
)

. "$PSScriptRoot/Get-CuratedBenchmarkConfiguration.ps1"

$doubleStyles = [System.Globalization.NumberStyles]::Float -bor [System.Globalization.NumberStyles]::AllowThousands
$culture = [System.Globalization.CultureInfo]::InvariantCulture

[object[]]$entries = Get-Content -Path $DatasetPath -Raw | ConvertFrom-Json
$entryNames = @($entries | ForEach-Object { $_.name } | Sort-Object)
$configuration = Get-CuratedBenchmarkConfiguration
$expectedNames = @($configuration.RequiredDatasetPatterns | Sort-Object)

if ($entryNames.Count -ne $expectedNames.Count)
{
throw "Curated benchmark dataset contains $($entryNames.Count) entries but expected $($expectedNames.Count)."
}

$missingEntries = $expectedNames | Where-Object { $_ -notin $entryNames }
if ($missingEntries.Count -gt 0)
{
throw "Curated benchmark dataset is missing expected entries: $($missingEntries -join ', ')."
}

$unexpectedEntries = $entryNames | Where-Object { $_ -notin $expectedNames }
if ($unexpectedEntries.Count -gt 0)
{
throw "Curated benchmark dataset contains unexpected entries: $($unexpectedEntries -join ', ')."
}

foreach ($entry in $entries)
{
if ([string]::IsNullOrWhiteSpace($entry.name))
{
throw 'Curated benchmark dataset contains an entry without a valid name.'
}

if ($entry.unit -ne 'ns')
{
throw "Curated benchmark dataset entry '$($entry.name)' does not use the expected 'ns' unit."
}

$value = 0d
if ($null -eq $entry.value -or -not [double]::TryParse([string]$entry.value, $doubleStyles, $culture, [ref]$value))
{
throw "Curated benchmark dataset entry '$($entry.name)' does not contain a valid numeric value."
}

if ([double]::IsNaN($value) -or [double]::IsInfinity($value) -or $value -lt 0)
{
throw "Curated benchmark dataset entry '$($entry.name)' does not contain a finite non-negative numeric value."
}

$range = 0d
if ($null -eq $entry.range -or -not [double]::TryParse([string]$entry.range, $doubleStyles, $culture, [ref]$range))
{
throw "Curated benchmark dataset entry '$($entry.name)' does not contain a valid numeric range."
}

if ([double]::IsNaN($range) -or [double]::IsInfinity($range) -or $range -lt 0)
{
throw "Curated benchmark dataset entry '$($entry.name)' does not contain a finite non-negative numeric range."
}

if ($entry.extra -isnot [string] -or [string]::IsNullOrWhiteSpace($entry.extra))
{
throw "Curated benchmark dataset entry '$($entry.name)' does not contain explanatory extra metadata."
}
}
63 changes: 63 additions & 0 deletions .github/scripts/Convert-BenchmarkReports.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
param(
[Parameter(Mandatory = $true)]
[string]$InputDirectory,

[Parameter(Mandatory = $true)]
[string]$OutputFile
)

$reportFiles = Get-ChildItem -Path $InputDirectory -Filter '*-report-full-compressed.json' -File | Sort-Object Name
if ($reportFiles.Count -eq 0)
{
throw "No BenchmarkDotNet JSON reports were found in '$InputDirectory'."
}

$entries = foreach ($reportFile in $reportFiles)
{
$report = Get-Content -Path $reportFile.FullName -Raw | ConvertFrom-Json
foreach ($benchmark in @($report.Benchmarks))
{
if ($null -eq $benchmark.Statistics)
{
throw "Benchmark '$($benchmark.FullName)' did not produce statistics."
}

$allocatedMetric = @($benchmark.Metrics) |
Where-Object { $_.Descriptor.Id -eq 'Allocated Memory' } |
Select-Object -First 1

$extraLines = @(
"Type: $($benchmark.Type)",
"Runtime: $($report.HostEnvironmentInfo.RuntimeVersion)",
"Mean: $([double]$benchmark.Statistics.Mean) ns",
"StdDev: $([double]$benchmark.Statistics.StandardDeviation) ns"
)

if ($null -ne $allocatedMetric)
{
$extraLines += "Allocated: $([double]$allocatedMetric.Value) B/op"
}

[pscustomobject]@{
name = $benchmark.FullName
unit = 'ns'
value = [double]$benchmark.Statistics.Mean
range = [string]([math]::Round([double]$benchmark.Statistics.StandardDeviation, 4))
extra = $extraLines -join [Environment]::NewLine
}
}
}

$outputDirectory = Split-Path -Parent $OutputFile
if (-not [string]::IsNullOrWhiteSpace($outputDirectory) -and -not (Test-Path $outputDirectory))
{
New-Item -ItemType Directory -Path $outputDirectory -Force | Out-Null
}

$sortedEntries = @($entries | Sort-Object name)

$sortedEntries |
ConvertTo-Json -Depth 5 -AsArray |
Set-Content -Path $OutputFile -Encoding utf8NoBOM

Write-Host "Wrote $($sortedEntries.Count) benchmark entries to '$OutputFile'."
74 changes: 74 additions & 0 deletions .github/scripts/Get-CuratedBenchmarkConfiguration.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
function Get-CuratedBenchmarkConfiguration
{
$catalogFirstBenchmarks = @(
'ProjNet.Benchmark.CatalogFirstTransformationLookupBenchmarks.FirstCreateTransformation4326To3857'
)

$wktParsingBenchmarks = @(
'ProjNet.Benchmark.WktParsingBenchmarks.ParseSimpleGeographicCs',
'ProjNet.Benchmark.WktParsingBenchmarks.ParseProjectedCs',
'ProjNet.Benchmark.WktParsingBenchmarks.ParseCompoundCs',
'ProjNet.Benchmark.WktParsingBenchmarks.ParseGeodeticWkt2',
'ProjNet.Benchmark.WktParsingBenchmarks.ParseProjectedWkt2',
'ProjNet.Benchmark.WktParsingBenchmarks.ParseBoundWkt2'
)

$projectionTransformBenchmarks = @(
'ProjNet.Benchmark.ProjectionTransformBenchmarks.TransformBatchMercator',
'ProjNet.Benchmark.ProjectionTransformBenchmarks.TransformBatchUtm32N',
'ProjNet.Benchmark.ProjectionTransformBenchmarks.TransformBatchLambert93'
)

$projParityBenchmarks = @(
'ProjNet.Benchmark.ProjParityBenchmarks.Wgs84ToWebMercatorBatched(PointCount: 10000)',
'ProjNet.Benchmark.ProjParityBenchmarks.Wgs84ToWebMercatorOneByOne(PointCount: 10000)',
'ProjNet.Benchmark.ProjParityBenchmarks.Wgs84ToUtm32NBatched(PointCount: 10000)',
'ProjNet.Benchmark.ProjParityBenchmarks.Wgs84ToUtm31NBatched(PointCount: 10000)',
'ProjNet.Benchmark.ProjParityBenchmarks.Utm31NToWgs84Batched(PointCount: 10000)',
'ProjNet.Benchmark.ProjParityBenchmarks.Wgs84ToLambert93Batched(PointCount: 10000)',
'ProjNet.Benchmark.ProjParityBenchmarks.Lambert93ToWgs84Batched(PointCount: 10000)',
'ProjNet.Benchmark.ProjParityBenchmarks.WebMercatorToWgs84Batched(PointCount: 10000)',
'ProjNet.Benchmark.ProjParityBenchmarks.Wgs84ToWebMercatorBatchedWithNoise(PointCount: 10000)'
)

$transformationFactoryBenchmarks = @(
'ProjNet.Benchmark.TransformationFactoryBenchmarks.CreateTransformWgs84ToMercator',
'ProjNet.Benchmark.TransformationFactoryBenchmarks.CreateTransformWgs84ToUtm32N',
'ProjNet.Benchmark.TransformationFactoryBenchmarks.CreateTransformUtm32NToLambert93'
)

$allCuratedBenchmarks =
$catalogFirstBenchmarks +
$wktParsingBenchmarks +
$projectionTransformBenchmarks +
$projParityBenchmarks +
$transformationFactoryBenchmarks

return @{
FullRuns = @(
@{
Filters = $catalogFirstBenchmarks + $wktParsingBenchmarks
Overrides = @()
},
@{
Filters = $projectionTransformBenchmarks + $projParityBenchmarks + $transformationFactoryBenchmarks
Overrides = @('--launchCount', '1', '--warmupCount', '1', '--iterationCount', '3')
}
)
SmokeRuns = @(
@{
Filters = $catalogFirstBenchmarks
Overrides = @('--launchCount', '1', '--warmupCount', '0', '--iterationCount', '1')
},
@{
Filters = $wktParsingBenchmarks
Overrides = @('--launchCount', '1', '--warmupCount', '1', '--iterationCount', '1')
},
@{
Filters = $projectionTransformBenchmarks + $projParityBenchmarks + $transformationFactoryBenchmarks
Overrides = @('--launchCount', '1', '--warmupCount', '1', '--iterationCount', '1')
}
)
RequiredDatasetPatterns = $allCuratedBenchmarks
}
}
Loading