Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
3b0518a
Only set AutomaticDecompression when the platform supports it
thelocalsim Aug 28, 2026
e1f36d1
ci: CalVer release automation + dev/master branch flow
seraphx2 Sep 9, 2026
3e0877a
ci: bump actions/checkout and actions/setup-dotnet to v5
seraphx2 Sep 9, 2026
7ba5131
Merge pull request #80 from seraphx2/ci/release-automation
seraphx2 Sep 9, 2026
45f390f
ci: bump the actions group with 5 updates
dependabot[bot] Sep 9, 2026
48bd592
ci: publish to NuGet via Trusted Publishing (OIDC)
seraphx2 Sep 10, 2026
f0fa3b3
Merge pull request #79 from thelocalsim/fix/blazor-wasm-automatic-dec…
seraphx2 Sep 10, 2026
f87d146
build: modernize target frameworks and dependencies
seraphx2 Sep 10, 2026
fcbec43
test: add SSO token-validation regression suite
seraphx2 Sep 10, 2026
5c9fa9a
fix(dogma): split the attribute/effect id-value pairs from the full r…
seraphx2 Sep 10, 2026
8a83864
refactor(response): build EsiResponse via an async factory
seraphx2 Sep 10, 2026
84a1aa2
refactor!: per-call EsiCallOptions; drop SetCharacterData and the sta…
seraphx2 Sep 10, 2026
2e83ee2
feat(di): AddEsi uses IHttpClientFactory + ESI header / error-limit h…
seraphx2 Sep 10, 2026
9646ca0
Merge pull request #81 from seraphx2/dependabot/github_actions/dev/ac…
seraphx2 Sep 10, 2026
95e05b9
docs+fix: CHANGELOG/README for the modernization; harden SsoLogic.Verify
seraphx2 Sep 10, 2026
f903453
feat(sso): transparent access-token refresh via EsiCallOptions.OnToke…
seraphx2 Sep 10, 2026
3c6fa07
refactor(sso): move token refresh into EsiTokenRefreshHandler; add IE…
seraphx2 Sep 10, 2026
c87be57
chore(tools): add MintToken utility for minting an SSO refresh token
seraphx2 Sep 10, 2026
cec7d38
feat(tools): add SpecCheck - Tier 1 spec coverage drift check
seraphx2 Sep 10, 2026
86455bd
feat(tools): SpecCheck Tier 2 - EsiResponse<T> vs 200 schema drift
seraphx2 Sep 10, 2026
c81f3e3
docs: reformat README (prettier-style markdown normalization)
seraphx2 Sep 10, 2026
835b618
ci: add spec-check workflow (weekly + on demand)
seraphx2 Sep 10, 2026
fddf50a
test(integration): add live ESI integration tests (Tier 3)
seraphx2 Sep 10, 2026
b25307f
chore: move ESI.NET.Tests under tests/
seraphx2 Sep 10, 2026
5491950
ci(release): rich Discord embed on release
seraphx2 Sep 10, 2026
9a64fa5
fix(EsiResponse): trim the body before the JSON sniff; accept bare sc…
seraphx2 Sep 10, 2026
dc04248
ci(release): dispatch = NuGet prerelease; add GitHub Packages mirror
seraphx2 Sep 10, 2026
1d52857
ci: rename Spec check workflow to SpecCheck
seraphx2 Sep 10, 2026
f22bb17
docs: happy-path README, split upgrade guide into MIGRATION.md
seraphx2 Sep 10, 2026
d092bc3
build(pack): add package icon, readme, tags, copyright
seraphx2 Sep 10, 2026
e1684e3
build(pack): blue->purple->pink gradient on the package icon
seraphx2 Sep 10, 2026
3dbdb79
fix(spec): remove dead endpoints, correct response shapes and enums
seraphx2 Sep 10, 2026
9e39558
refactor(models): widen integer response fields int -> long
seraphx2 Sep 10, 2026
3c479f5
refactor(logic): widen id method parameters int -> long
seraphx2 Sep 10, 2026
9159abc
refactor(models): drop 4 fields ESI no longer returns
seraphx2 Sep 10, 2026
0d13d65
fix(models): add 6 required fields the spec returns
seraphx2 Sep 10, 2026
b280b2e
refactor(speccheck): cross-endpoint awareness, drop audit categories,…
seraphx2 Sep 10, 2026
565b79f
ci(speccheck): run daily instead of weekly
seraphx2 Sep 10, 2026
3ebded3
feat!: adopt ESI compatibility-date versioning, target 2026-08-18
seraphx2 Sep 10, 2026
d7c27d1
feat(corporation): wrap Corporation Projects (4 endpoints)
seraphx2 Sep 10, 2026
99058a2
feat(freelance): wrap Freelance Jobs (6 endpoints)
seraphx2 Sep 10, 2026
3beb1e8
feat(military-campaigns): wrap Military Campaigns (6 endpoints)
seraphx2 Sep 10, 2026
97cfbff
feat(structures): wrap skyhooks, sovereignty hubs, mercenary dens (7 …
seraphx2 Sep 10, 2026
8104459
feat(cosmetics): wrap SKINR + Paragon Hub (8 endpoints)
seraphx2 Sep 10, 2026
5c57ab3
feat: wrap Access Lists, Mercenary Tactical Operations, and Meta (8 e…
seraphx2 Sep 10, 2026
446f3b7
docs+test: cover the 2026 snapshot adoption
seraphx2 Sep 10, 2026
40f964f
refactor(speccheck): target the latest published compatibility date
seraphx2 Sep 10, 2026
a7d1a8e
fix(universe): Bloodline.ShipTypeId is nullable
seraphx2 Sep 10, 2026
33c4cec
feat(speccheck): --probe live-deserializes every public GET
seraphx2 Sep 10, 2026
fe26837
feat(speccheck): --probe covers authenticated GETs too
seraphx2 Sep 10, 2026
59d21cc
feat(mint-token): ESI_SCOPES=all requests every scope
seraphx2 Sep 10, 2026
479053e
chore(speccheck): probe prints the access token's scope count
seraphx2 Sep 10, 2026
095fa72
feat(mint-token): --all-scopes flag (env-independent)
seraphx2 Sep 10, 2026
33c2cbd
build: turn on the full NetAnalyzers rule set repo-wide
seraphx2 Sep 12, 2026
18357a7
fix(sso,logic): ConfigureAwait(false) on every internal await
seraphx2 Sep 12, 2026
16e27e5
build(pack): symbol package + Source Link; MIT license expression
seraphx2 Sep 12, 2026
7d9f7ca
fix(response): drop the hand-maintained 204 message dictionary
seraphx2 Sep 12, 2026
1f11202
fix(response): header parsing is culture-invariant
seraphx2 Sep 12, 2026
af044b6
fix(core): ToEsiValue rewrite, missing enum converters, request dispo…
seraphx2 Sep 12, 2026
ab91538
fix(logic): CA1305 - InvariantCulture on every ToString() building UR…
seraphx2 Sep 12, 2026
9e8b2e4
fix(sso): two real security gaps found by the analyzer sweep, not sty…
seraphx2 Sep 12, 2026
b6340bb
revert(spec-check): drop the Probe.cs live-Verify() addition - alread…
seraphx2 Sep 12, 2026
5ccaa6c
fix(logic): restore UTF-8 BOM stripped by the CA1305 fix script
seraphx2 Sep 12, 2026
4ccee77
fix(logic): CA1707 - camelCase every parameter (was snake_case, mirro…
seraphx2 Sep 12, 2026
5787c8b
build: suppress CA2227/CA1002/CA1819/CA1724 where they don't apply
seraphx2 Sep 12, 2026
812c8c4
fix(core): CA1062 - real ArgumentNullException fixes for the 15 requi…
seraphx2 Sep 12, 2026
199efa9
build(logic): document CA1062 suppression for every EsiCallOptions op…
seraphx2 Sep 12, 2026
e98b267
build: consolidate all inline [SuppressMessage]s into GlobalSuppressi…
seraphx2 Sep 12, 2026
f284f48
fix: resolve the remaining analyzer long tail (44 warnings -> 0)
seraphx2 Sep 12, 2026
0f86d9a
feat: add net10.0 as an explicit target framework
seraphx2 Sep 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,11 @@
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain

###############################################################################
# Keep shell scripts and CI YAML LF-only for the Linux CI runners, regardless
# of the checkout platform's autocrlf setting.
###############################################################################
*.sh text eol=lf
*.yml text eol=lf
*.yaml text eol=lf
28 changes: 28 additions & 0 deletions .github/actions/ci-dotnet/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
name: CI — .NET
description: >
Restore, Release-build and test the solution. The library multi-targets
netstandard2.0, net8.0, and net10.0; netstandard2.0 covers .NET Framework
4.6.1+ consumers. Runs on Linux. Assumes the repo is already checked out.

runs:
using: composite
steps:
- name: Setup .NET SDK
uses: actions/setup-dotnet@v6
with:
# A 10.0.x SDK builds/tests net8.0 and netstandard2.0 targets fine too
# (a newer SDK always understands older TFMs) - the reverse isn't
# true, so this must stay at least as new as the highest TargetFramework.
dotnet-version: '10.0.x'

- name: Restore
shell: bash
run: dotnet restore ESI.NET.sln

- name: Build (Release)
shell: bash
run: dotnet build ESI.NET.sln --configuration Release --no-restore

- name: Test
shell: bash
run: dotnet test ESI.NET.sln --configuration Release --no-build --verbosity normal
36 changes: 36 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Dependabot version updates. Each ecosystem is grouped, so a run opens at most
# one PR per ecosystem (plus stragglers that can't be grouped). PRs target `dev`
# — the integration branch, where CI (ci-dev.yml) runs. Security alerts are a
# separate repo setting and open PRs only for actual advisories.
version: 2
updates:
- package-ecosystem: github-actions
directory: "/"
target-branch: dev
schedule:
interval: weekly
commit-message:
prefix: ci
groups:
actions:
patterns:
- "*"

- package-ecosystem: nuget
directory: "/ESI.NET"
target-branch: dev
schedule:
interval: weekly
commit-message:
prefix: deps
groups:
nuget:
patterns:
- "*"
# Majors (Microsoft.IdentityModel 7.x/8.x, Microsoft.Extensions.* 9.x, …)
# tend to need code changes — take those by hand; grouped minor/patch keep
# the package graph fresh in the meantime.
ignore:
- dependency-name: "*"
update-types:
- version-update:semver-major
29 changes: 0 additions & 29 deletions .github/workflows/build-check.yml

This file was deleted.

26 changes: 26 additions & 0 deletions .github/workflows/ci-dev.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: CI (dev)

# Per-commit coverage on the long-lived dev branch, so a break is pinned to the
# commit that caused it instead of surfacing across a whole delta at PR time.
# Separate workflow (not the `check` context) so it never touches the dev->master
# PR gate. Skips doc-only pushes.
on:
push:
branches: [dev]
paths-ignore:
- 'docs/**'
- '**.md'

concurrency:
group: ci-dev-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: ./.github/actions/ci-dotnet
29 changes: 29 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: CI

# PR gate for both branches: dev->master (the release gate) and feature->dev
# (contributor PRs). The `check` job aggregates the build and is the required
# status check on master (branch protection) — keep its name stable.
on:
pull_request:
branches: [master, dev]

# Newer commits on the PR branch supersede an in-flight run.
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: ./.github/actions/ci-dotnet

check:
needs: [build]
runs-on: ubuntu-latest
steps:
- run: echo "build passed"
96 changes: 0 additions & 96 deletions .github/workflows/deploy.yml

This file was deleted.

52 changes: 52 additions & 0 deletions .github/workflows/integration.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: Integration (live)

# Live tests against the real ESI API. Deliberately NOT a PR or push gate - it
# makes ~25 real calls and needs secrets. Runs weekly and on demand; a failed
# run emails the maintainer. Also the manual pre-release check: dispatch it,
# confirm green, then merge dev -> master.
#
# Public smoke tests always run. The auth probe self-skips unless ALL of
# ESI_CLIENT_ID / ESI_SECRET_KEY / ESI_REFRESH_TOKEN are set as repo secrets
# (mint the refresh token with tools/MintToken). Fork PRs never get secrets and
# this never runs on PRs, so that path does not arise.
on:
schedule:
- cron: '41 6 * * 1' # Mondays 06:41 UTC (after spec-check)
workflow_dispatch:

concurrency:
group: integration-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
integration:
runs-on: ubuntu-latest
env:
ESI_USER_AGENT: 'ESI.NET integration (github.com/seraphx2/ESI.NET)'
ESI_CLIENT_ID: ${{ secrets.ESI_CLIENT_ID }}
ESI_SECRET_KEY: ${{ secrets.ESI_SECRET_KEY }}
ESI_REFRESH_TOKEN: ${{ secrets.ESI_REFRESH_TOKEN }}
steps:
- uses: actions/checkout@v7

- uses: actions/setup-dotnet@v6
with:
dotnet-version: '8.0.x'

- name: Integration tests
shell: bash
run: >
dotnet test tests/ESI.NET.IntegrationTests/ESI.NET.IntegrationTests.csproj
--configuration Release --verbosity normal
--logger 'trx;LogFileName=integration.trx' --results-directory ./trx

- name: Upload test results
if: always()
uses: actions/upload-artifact@v7
with:
name: integration-trx
path: ./trx/*.trx
if-no-files-found: ignore
37 changes: 37 additions & 0 deletions .github/workflows/probe.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
name: probe (live deserialize)

# Fetches every reachable GET endpoint live and deserializes the real body into
# the wrapper's model - the check the OpenAPI document can't give us, because ESI
# barely declares nullability. Public endpoints always; authenticated endpoints
# when the SSO secrets are present.
#
# workflow_dispatch only. It exchanges ESI_REFRESH_TOKEN, which EVE rotates, so a
# run invalidates the stored token - re-mint with tools/MintToken afterwards (the
# scheduled integration workflow needs a valid one). That is why this is not on a
# schedule.

on:
workflow_dispatch:

concurrency:
group: probe-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
probe:
runs-on: ubuntu-latest
env:
ESI_USER_AGENT: 'ESI.NET probe (github.com/seraphx2/ESI.NET)'
ESI_CLIENT_ID: ${{ secrets.ESI_CLIENT_ID }}
ESI_SECRET_KEY: ${{ secrets.ESI_SECRET_KEY }}
ESI_REFRESH_TOKEN: ${{ secrets.ESI_REFRESH_TOKEN }}
steps:
- uses: actions/checkout@v7
- uses: actions/setup-dotnet@v6
with:
dotnet-version: '8.0.x'
- name: Probe
run: dotnet run --project tools/SpecCheck --configuration Release -- --probe --no-schema
Loading