Skip to content

Commit 6ffe7b9

Browse files
authored
Release v0.4.2 (#14)
1 parent c44ab9a commit 6ffe7b9

132 files changed

Lines changed: 5395 additions & 10305 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/lint.yml

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
name: Linting
22

3+
# Disabled: requires checkout of private makegov/tango repo for filter_shape conformance check.
4+
# Re-enable when that repo is accessible (e.g. add TANGO_API_REPO_ACCESS_TOKEN secret).
35
on:
4-
push:
5-
branches: [ main, develop ]
6-
pull_request:
7-
branches: [ main, develop ]
6+
workflow_dispatch:
7+
# push:
8+
# branches: [ main, develop ]
9+
# pull_request:
10+
# branches: [ main, develop ]
811

912
jobs:
1013
lint:

CHANGELOG.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.4.2] - 2026-03-04
11+
12+
### Added
13+
- Protests endpoints: `list_protests`, `get_protest` with shaping and filter params (`source_system`, `outcome`, `case_type`, `agency`, `case_number`, `solicitation_number`, `protester`, `filed_date_after`, `filed_date_before`, `decision_date_after`, `decision_date_before`, `search`).
14+
15+
### Changed
16+
- Lint CI workflow disabled for push/PR (runs only on manual trigger) until the private `makegov/tango` repo is accessible to the workflow.
17+
- Updated documents to reflect changes since v0.4.0
18+
- Entities: `ENTITIES_COMPREHENSIVE` now uses `federal_obligations(*)` expansion; the API treats federal obligations as an expansion rather than a plain shape field.
19+
- Docs: `SHAPES.md` documents `federal_obligations(*)` as an expansion for entity shaping.
20+
- Integration tests: `test_parsing_nested_objects_with_missing_data` accepts award office fields (`office_code`, `agency_code`, `department_code`) and empty nested objects when the API returns partial data.
21+
22+
### Removed
23+
- Assistance: `list_assistance` endpoint and all related tests, docs, and references.
24+
- IDV summaries: `get_idv_summary` and `list_idv_summary_awards` endpoints and related integration tests, cassettes, and API reference section.
25+
1026
## [0.4.1] - 2026-03-03
1127

1228
### Added

README.md

Lines changed: 56 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ A modern Python SDK for the [Tango API](https://tango.makegov.com) by MakeGov, f
66

77
- **Dynamic Response Shaping** - Request only the fields you need, reducing payload sizes by 60-80%
88
- **Full Type Safety** - Runtime-generated TypedDict types with accurate type hints for IDE autocomplete
9-
- **Comprehensive API Coverage** - All major Tango API endpoints (contracts, entities, forecasts, opportunities, notices, grants, webhooks) [Note: the current version does NOT implement all endpoints, we will be adding them incrementally]
9+
- **Comprehensive API Coverage** - All major Tango API endpoints (contracts, IDVs, OTAs, entities, forecasts, opportunities, notices, grants, protests, webhooks, and more)
1010
- **Flexible Data Access** - Dictionary-based response objects with validation
1111
- **Modern Python** - Built for Python 3.12+ using modern async-ready patterns
1212
- **Production-Ready** - Comprehensive test suite with VCR.py-based integration tests
@@ -152,14 +152,33 @@ contracts = client.list_contracts(
152152
**Response Options:**
153153
- `shape`, `flat`, `flat_lists` - Response shaping options
154154

155+
### IDVs, OTAs, OTIDVs
156+
157+
```python
158+
# List IDVs (keyset pagination)
159+
idvs = client.list_idvs(limit=25, awarding_agency="4700")
160+
161+
# Get single IDV with shaping
162+
idv = client.get_idv("IDV_KEY", shape=ShapeConfig.IDVS_COMPREHENSIVE)
163+
164+
# OTAs and OTIDVs follow the same pattern
165+
otas = client.list_otas(limit=25)
166+
otidvs = client.list_otidvs(limit=25)
167+
```
168+
169+
### Vehicles
170+
171+
```python
172+
vehicles = client.list_vehicles(search="GSA schedule", shape=ShapeConfig.VEHICLES_MINIMAL)
173+
vehicle = client.get_vehicle("UUID", shape=ShapeConfig.VEHICLES_COMPREHENSIVE)
174+
awardees = client.list_vehicle_awardees("UUID")
175+
```
176+
155177
### Entities (Vendors/Recipients)
156178

157179
```python
158-
# List entities
159-
entities = client.list_entities(
160-
page=1,
161-
limit=25
162-
)
180+
# List entities with filters
181+
entities = client.list_entities(search="Booz Allen", state="VA", limit=25)
163182

164183
# Get specific entity by UEI or CAGE code
165184
entity = client.get_entity("ZQGGHJH74DW7")
@@ -168,47 +187,49 @@ entity = client.get_entity("ZQGGHJH74DW7")
168187
### Forecasts
169188

170189
```python
171-
# List contract forecasts
172-
forecasts = client.list_forecasts(
173-
agency="GSA",
174-
limit=25
175-
)
190+
forecasts = client.list_forecasts(agency="GSA", fiscal_year=2025, limit=25)
176191
```
177192

178193
### Opportunities
179194

180195
```python
181-
# List opportunities/solicitations
182-
opportunities = client.list_opportunities(
183-
agency="DOD",
184-
limit=25
185-
)
196+
opportunities = client.list_opportunities(agency="DOD", active=True, limit=25)
186197
```
187198

188199
### Notices
189200

190201
```python
191-
# List contract notices
192-
notices = client.list_notices(
193-
agency="DOD",
194-
limit=25
195-
)
202+
notices = client.list_notices(agency="DOD", notice_type="award", limit=25)
196203
```
197204

198205
### Grants
199206

200207
```python
201-
# List grant opportunities
202-
grants = client.list_grants(
203-
agency_code="HHS",
204-
limit=25
205-
)
208+
grants = client.list_grants(agency="HHS", status="forecasted", limit=25)
209+
```
210+
211+
### Protests
212+
213+
```python
214+
protests = client.list_protests(source_system="gao", outcome="Sustained", limit=25)
215+
protest = client.get_protest("CASE_UUID")
216+
```
217+
218+
### GSA eLibrary Contracts
219+
220+
```python
221+
contracts = client.list_gsa_elibrary_contracts(schedule="MAS", limit=25)
222+
contract = client.get_gsa_elibrary_contract("UUID")
206223
```
207224

208-
### Business Types
225+
### Reference Data
209226

210227
```python
211-
# List business types
228+
# Offices, organizations, NAICS, subawards, business types
229+
offices = client.list_offices(search="acquisitions")
230+
organizations = client.list_organizations(level=1)
231+
naics = client.list_naics(search="software")
232+
subawards = client.list_subawards(prime_uei="UEI123")
212233
business_types = client.list_business_types()
213234
```
214235

@@ -421,9 +442,16 @@ tango-python/
421442
│ ├── test_entities_integration.py
422443
│ ├── test_forecasts_integration.py
423444
│ ├── test_grants_integration.py
445+
│ ├── test_naics_integration.py
424446
│ ├── test_notices_integration.py
447+
│ ├── test_offices_integration.py
425448
│ ├── test_opportunities_integration.py
449+
│ ├── test_organizations_integration.py
450+
│ ├── test_otas_otidvs_integration.py
451+
│ ├── test_protests_integration.py
426452
│ ├── test_reference_data_integration.py
453+
│ ├── test_subawards_integration.py
454+
│ ├── test_vehicles_idvs_integration.py
427455
│ └── test_edge_cases_integration.py
428456
├── docs/ # Documentation
429457
│ ├── API_REFERENCE.md # Complete API reference

0 commit comments

Comments
 (0)