From 60ccf6cd9f164c378414f44e4aeeadfdf84774ec Mon Sep 17 00:00:00 2001 From: "V. David Zvenyach" Date: Tue, 4 Aug 2026 07:09:59 -0400 Subject: [PATCH] chore(release): v1.5.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Minor bump covering the two features that have accumulated on main since v1.4.0, both additive with no breaking SDK surface. `relationships(type, source)` on entities (#54) exposes the two keys the API added to each entity relationship entry, and carries a consumer-facing note worth reading: the `relation` value vocabulary changed upstream, so application code branching on `relation` should match on `type` instead. No SDK code change is required for that — `relation` was and remains a `str`. `PaginatedResponse.meta` (#55) surfaces the API's agency-filter diagnostics, which the SDK previously discarded because it built the response envelope key-by-key. Adds `unresolved_agency_tokens`, `resolved_agencies`, and `agency_warnings`. The second of those is the one that matters for a fuzzy match landing on the wrong organization — nothing is dropped in that case, so a dropped-token check cannot see it. Version bumped in pyproject.toml, tango/__init__.py and uv.lock; [Unreleased] promoted to [1.5.0] - 2026-08-04. Co-Authored-By: Claude Opus 5 (1M context) --- CHANGELOG.md | 2 ++ pyproject.toml | 2 +- tango/__init__.py | 2 +- uv.lock | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc08639..c562710 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.5.0] - 2026-08-04 + ### Added - **`relationships(type, source)` on entities.** Tango API 4.20.0 added two keys to each entry in the entity `relationships` expand: `type`, the stable relationship-type code (`prime_sub`, `parent_subsidiary`, `ultimate_parent`, `predecessor`), and `source`, where the tie came from (`sam`, `subawards`). Both are shape-selectable, so `shape="uei,relationships(type,source,uei)"` now resolves against the SDK's schema. Re-vendored the contract and regenerated the shape overlay; the coverage gate reports 0 gaps. - `PaginatedResponse.meta` now carries the response-level `meta` block the API returns, with three accessors over it: `unresolved_agency_tokens` (agency tokens that matched nothing, per filter), `resolved_agencies` (the organization each token *did* match), and `agency_warnings` (the API's human-readable notes). Agency values resolve fuzzily, so a token can match an organization the caller did not intend and quietly scope the query to that subtree — and a token that resolves to nothing was previously dropped with no signal at all. Both cases were indistinguishable from "no such records exist". The API now reports both; until now the SDK read the envelope key-by-key and dropped `meta` on the floor, so SDK users were the one group that could not see it. `resolved_agencies` is the accessor that matters for the wrong-organization case: nothing is dropped there, so an unresolved-token check cannot detect it. All accessors return empty rather than raising when `meta` is absent (most responses) or malformed. diff --git a/pyproject.toml b/pyproject.toml index 412809f..ee9e263 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "tango-python" -version = "1.4.0" +version = "1.5.0" description = "Python SDK for the Tango API" readme = "README.md" requires-python = ">=3.12" diff --git a/tango/__init__.py b/tango/__init__.py index 376c81e..47a3da3 100644 --- a/tango/__init__.py +++ b/tango/__init__.py @@ -50,7 +50,7 @@ ) from .webhooks.receiver import Delivery, WebhookReceiver -__version__ = "1.4.0" +__version__ = "1.5.0" __all__ = [ "TangoClient", "TangoAPIError", diff --git a/uv.lock b/uv.lock index 893ce71..8904f94 100644 --- a/uv.lock +++ b/uv.lock @@ -515,7 +515,7 @@ wheels = [ [[package]] name = "tango-python" -version = "1.4.0" +version = "1.5.0" source = { editable = "." } dependencies = [ { name = "httpx" },