What’s new in v0.11.0
A correctness and type-safety release. Nothing in the public API breaks.- Ships
py.typed(PEP 561) for both packages. Without the marker, type checkers ignore an installed package’s annotations entirely - every SDK call resolved toAnyin your project, however well annotated the SDK was. The SDK is now clean under bothmypy --strictandpyright. See Type checking. - SSE reconnect fixes. A misconfigured
sse_reconnect_cooldownused to kill the stream worker: the handler meant to fall back to the default schedule called a logger method that does not exist, and raised. The value is validated atcreate()now and rejected with a message naming the bad input. Separately,AsyncNexusClientignoredsse_reconnect_cooldownentirely and ended its stream permanently after three transient transport errors - it now reconnects on the configured schedule, matchingNexusClient. See SSE live updates. - The SSE client now has a connect timeout. Lifting the read deadline on a long-lived stream is right; lifting the connect deadline with it was not, and a connect to a black-holed endpoint hung indefinitely with no error and no reconnect.
- File-type secrets are written
0600, applied at creation. They were previously created under the process umask - typically0644in a shared temp directory, readable by any local user. Two clients holding the same secret also no longer share (and delete) one file. See File-type secret security. - A faulting stream observer is reported. Your observer still cannot break the SDK, but a callback that raises is logged with the hook name and the original exception instead of vanishing.
- No
assertin shipped code -python -Ostrips them, and the session-refresh precondition guard went with them. - CI gates on
ruff,mypy,pyrightandbandit, and the suite runs on Python 3.11 through 3.14 - every version this package advertises.
What’s new in v0.10.0
- Version alignment across the Westyx Nexus SDK suite.
What’s new in v0.9.0
aws_iamWIF provider (AWS IAM Caller Identity) - authenticates non-EKS AWS compute (ECS/Fargate, Lambda, plain EC2) that has IAM credentials but no OIDC token. The SDK SigV4-signs an STSGetCallerIdentityrequest (never sent to AWS) and posts it to/v1/auth/token-exchange; Nexus replays it against a pinned STS endpoint to prove your IAM role. The signedX-Nexus-Server-IDis your service’s own base-URL host - a captured request is valid for that one service only, and there is nothing to configure. Requires the optionalbotocoredependency (pip install 'westyx-nexus-sdk[aws-iam]'). See Workload identity.- Azure Workload Identity (AKS) - the
azureprovider now prefers the projected federated token file ($AZURE_FEDERATED_TOKEN_FILE) before falling back to IMDS; auto-detection probes the file too. - Probe-based auto-detection - auto-detect now stats the Kubernetes / AWS-IRSA / Azure token files and live-probes the GCP and Azure metadata servers (~1 s timeout), instead of keying on environment variables absent on real cloud nodes.
- Security hardening - both clients reject plain-http
base_urls (loopback excepted); the Azure IMDS path refuses the generic default audience (must beapi://<client-id>); the async client no longer blocks the event loop on metadata calls; thehttpx.Clientleak is fixed; metadata/exchange reads are bounded.
What’s new in v0.8.0
- OpenFeature provider - new
westyx-nexus-openfeaturesub-package shipsNexusProvider, anAbstractProviderfor the OpenFeature Python SDK. Wraps an existingNexusClient; booleans viaget_flag, string/integer/float/object viaget_config.EvaluationContextis ignored. See OpenFeature provider.
What’s new in v0.5.1
- Requires Python 3.11+ - Python 3.10 is EOL; minimum is now 3.11.
- Security improvements - exception messages contain only status codes; file-type secret paths are fully hashed; WIF tokens stripped of whitespace on all providers.
- WIF reliability - session refreshes before each SSE reconnect; expired sessions no longer cause permanent TTL-polling fallback.
- CI - tests run on merge requests; publish restricted to
main-branch tags.
What’s new in v0.5.0
- Write API -
set_secret,delete_secret,delete_secret_versionfor programmatic secret management. secret keys only; public keys raiseNexusPublicKeyErrorimmediately without a network call. NexusRateLimitedError- new error for HTTP 429 on write endpoints.
What’s new in v0.4.0
- Path prefix change - all API paths are now
/v1/(previously/api/v1/). Updatebase_urlto use<slug>.westyx.dev. NexusQuarantinedError- new typed error raised on429with quarantine body. Both sync and stream paths detect this.on_quarantined(reason, expires_at)observer callback -StreamObservergains a sixth callback; fires on quarantine events from both the stream and sync paths.- Quarantine backoff - stream sleeps until
expires_atbefore reconnecting; background sync is paused during the quarantine window. - Removed
ConfigEntry.is_public- the field is no longer populated.
Highlights
- Python 3.11+ - single runtime dependency (
httpx); the optionalaws_iamWIF provider addsbotocorevia the[aws-iam]extra - Both sync and async APIs -
NexusClientandAsyncNexusClientshare the same cache + SSE protocol; only the I/O model differs - Optional framework adapters - Django, FastAPI, Flask integrations via extras (
pip install "westyx-nexus-sdk[django]") - Thread-safe TTL cache with atomic snapshot replacement and ETag/304 support
- SSE live updates - propagates remote changes within milliseconds; falls back to TTL polling after 3 transport errors
- Typed error hierarchy -
NexusErrorbase + 13 subclasses forisinstance/exceptmatching - Workload Identity Federation (v0.2.0) - Kubernetes / AWS IRSA / GCP / Azure auto-detection; bearer JWT auth; AWS IAM (
aws_iam) for ECS/Fargate/Lambda/plain-EC2 (v0.9.0) - Stream observer hooks (v0.2.0) - structured callbacks for SSE lifecycle events
- AB Testing (v0.3.0) -
evaluate_abfor batch per-user flag evaluation - File-type secrets (v0.3.0) -
get_secret_file_pathmaterialisestype: "file"secrets to temp files - OpenFeature provider (v0.8.0) -
NexusProvidersub-package (westyx-nexus-openfeature) for the OpenFeature Python SDK - Fully typed (v0.11.0) - ships
py.typed; clean undermypy --strictandpyright
Package
Hosted on the GitLab PyPI Package Registry. Install:py.typed, SSE reconnect fixes, 0600 file secrets).
