tango-python 0.4.1__tar.gz → 0.4.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {tango_python-0.4.1 → tango_python-0.4.2}/.github/workflows/lint.yml +7 -4
- {tango_python-0.4.1 → tango_python-0.4.2}/CHANGELOG.md +16 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/PKG-INFO +57 -29
- {tango_python-0.4.1 → tango_python-0.4.2}/README.md +56 -28
- {tango_python-0.4.1 → tango_python-0.4.2}/docs/API_REFERENCE.md +528 -26
- {tango_python-0.4.1 → tango_python-0.4.2}/docs/SHAPES.md +1 -1
- {tango_python-0.4.1 → tango_python-0.4.2}/docs/quick_start.ipynb +66 -51
- {tango_python-0.4.1 → tango_python-0.4.2}/pyproject.toml +1 -1
- {tango_python-0.4.1 → tango_python-0.4.2}/scripts/check_filter_shape_conformance.py +0 -1
- {tango_python-0.4.1 → tango_python-0.4.2}/scripts/pr_review.py +24 -5
- {tango_python-0.4.1 → tango_python-0.4.2}/tango/client.py +124 -67
- {tango_python-0.4.1 → tango_python-0.4.2}/tango/models.py +31 -1
- {tango_python-0.4.1 → tango_python-0.4.2}/tango/shapes/explicit_schemas.py +53 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestAgenciesIntegration.test_get_agency +15 -23
- tango_python-0.4.2/tests/cassettes/TestAgenciesIntegration.test_list_agencies +89 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestBusinessTypesIntegration.test_business_type_field_type_validation +15 -17
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestBusinessTypesIntegration.test_business_type_parsing_consistency +15 -17
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestBusinessTypesIntegration.test_list_business_types +15 -17
- tango_python-0.4.1/tests/cassettes/TestOfficesIntegration.test_get_office → tango_python-0.4.2/tests/cassettes/TestContractsIntegration.test_combined_filters_work_together +16 -18
- tango_python-0.4.2/tests/cassettes/TestContractsIntegration.test_contract_cursor_pagination +174 -0
- tango_python-0.4.2/tests/cassettes/TestContractsIntegration.test_contract_data_object_parsing +86 -0
- tango_python-0.4.2/tests/cassettes/TestContractsIntegration.test_contract_field_types +100 -0
- tango_python-0.4.2/tests/cassettes/TestContractsIntegration.test_filter_parameter_mappings[keyword-software] +94 -0
- tango_python-0.4.2/tests/cassettes/TestContractsIntegration.test_filter_parameter_mappings[psc_code-R425] +86 -0
- tango_python-0.4.2/tests/cassettes/TestContractsIntegration.test_list_contracts_with_awarding_agency_filter +91 -0
- tango_python-0.4.2/tests/cassettes/TestContractsIntegration.test_list_contracts_with_date_range_filter +86 -0
- tango_python-0.4.2/tests/cassettes/TestContractsIntegration.test_list_contracts_with_flat +86 -0
- tango_python-0.4.2/tests/cassettes/TestContractsIntegration.test_list_contracts_with_naics_code_filter +196 -0
- tango_python-0.4.2/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[custom-key,piid,recipient(display_name),total_contract_value,award_date] +81 -0
- tango_python-0.4.2/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[default-None] +86 -0
- tango_python-0.4.2/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[detailed-key,piid,award_date,description,total_contract_value,obligated,fiscal_year,set_aside,recipient(display_name,uei),awarding_office(-),place_of_performa...ce114a3c47e2037aaa3c15d00b7031bd +100 -0
- tango_python-0.4.2/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[minimal-key,piid,award_date,recipient(display_name),description,total_contract_value] +86 -0
- tango_python-0.4.2/tests/cassettes/TestContractsIntegration.test_new_expiring_filters +86 -0
- tango_python-0.4.1/tests/cassettes/TestAssistanceIntegration.test_list_assistance → tango_python-0.4.2/tests/cassettes/TestContractsIntegration.test_new_fiscal_year_range_filters +11 -11
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestContractsIntegration.test_new_identifier_filters +13 -15
- tango_python-0.4.2/tests/cassettes/TestContractsIntegration.test_search_contracts_with_filters +86 -0
- tango_python-0.4.2/tests/cassettes/TestContractsIntegration.test_search_filters_object_with_new_parameters +89 -0
- tango_python-0.4.2/tests/cassettes/TestContractsIntegration.test_sort_and_order_mapped_to_ordering[asc-] +86 -0
- tango_python-0.4.2/tests/cassettes/TestContractsIntegration.test_sort_and_order_mapped_to_ordering[desc--] +86 -0
- tango_python-0.4.2/tests/cassettes/TestEdgeCasesIntegration.test_api_schema_stability_detection_contracts +86 -0
- tango_python-0.4.2/tests/cassettes/TestEdgeCasesIntegration.test_api_schema_stability_detection_entities +141 -0
- tango_python-0.4.2/tests/cassettes/TestEdgeCasesIntegration.test_date_field_parsing_edge_cases +131 -0
- tango_python-0.4.2/tests/cassettes/TestEdgeCasesIntegration.test_decimal_field_parsing_edge_cases +126 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestEdgeCasesIntegration.test_empty_list_responses +13 -15
- tango_python-0.4.2/tests/cassettes/TestEdgeCasesIntegration.test_entity_parsing_with_various_address_formats +217 -0
- tango_python-0.4.2/tests/cassettes/TestEdgeCasesIntegration.test_flattened_responses_with_flat_lists +86 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestEdgeCasesIntegration.test_list_field_parsing_consistency +73 -91
- tango_python-0.4.2/tests/cassettes/TestEdgeCasesIntegration.test_parsing_nested_objects_with_missing_data +224 -0
- tango_python-0.4.2/tests/cassettes/TestEdgeCasesIntegration.test_parsing_null_missing_fields_in_contracts +126 -0
- tango_python-0.4.2/tests/cassettes/TestEdgeCasesIntegration.test_parsing_with_minimal_shape_sparse_data +86 -0
- tango_python-0.4.2/tests/cassettes/TestEntitiesIntegration.test_entity_field_types +217 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestEntitiesIntegration.test_entity_location_parsing +73 -91
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestEntitiesIntegration.test_entity_parsing_with_business_types +73 -91
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestEntitiesIntegration.test_entity_with_various_identifiers +59 -77
- tango_python-0.4.2/tests/cassettes/TestEntitiesIntegration.test_get_entity_by_uei +231 -0
- tango_python-0.4.2/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_flat +86 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_search +22 -20
- tango_python-0.4.2/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[comprehensive-uei,legal_business_name,dba_name,cage_code,business_types,primary_naics,naics_codes,psc_codes,email_address,entity_url,description,capabilities,ke...1603a7d52e211cf2b3bc7d32080238aa +116 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[custom-uei,legal_business_name,cage_code] +17 -20
- tango_python-0.4.2/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[minimal-uei,legal_business_name,cage_code,business_types] +99 -0
- tango_python-0.4.2/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[with_address-uei,legal_business_name,cage_code,business_types,physical_address] +105 -0
- tango_python-0.4.2/tests/cassettes/TestForecastsIntegration.test_forecast_field_types +86 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[custom-id,title,anticipated_award_date] +17 -19
- tango_python-0.4.1/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[minimal-id,title,anticipated_award_date,fiscal_year,naics_code,status] → tango_python-0.4.2/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[default-None] +16 -18
- tango_python-0.4.2/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[detailed-id,source_system,external_id,title,description,anticipated_award_date,fiscal_year,naics_code,status,is_active] +140 -0
- tango_python-0.4.1/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[default-None] → tango_python-0.4.2/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[minimal-id,title,anticipated_award_date,fiscal_year,naics_code,status] +17 -19
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestGrantsIntegration.test_grant_field_types +13 -15
- tango_python-0.4.2/tests/cassettes/TestGrantsIntegration.test_grant_pagination +160 -0
- tango_python-0.4.2/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[custom-grant_id,title,opportunity_number] +81 -0
- tango_python-0.4.2/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[default-None] +81 -0
- tango_python-0.4.2/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[detailed-grant_id,opportunity_number,title,status(-),agency_code,description,last_updated,cfda_numbers(number,title),applicant_types(-),funding_categories(-)] +244 -0
- tango_python-0.4.2/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[minimal-grant_id,opportunity_number,title,status(-),agency_code] +81 -0
- tango_python-0.4.2/tests/cassettes/TestIDVsIntegration.test_get_idv_uses_default_shape +174 -0
- tango_python-0.4.2/tests/cassettes/TestIDVsIntegration.test_list_idv_awards_uses_default_shape +155 -0
- tango_python-0.4.2/tests/cassettes/TestIDVsIntegration.test_list_idv_child_idvs_uses_default_shape +155 -0
- tango_python-0.4.2/tests/cassettes/TestIDVsIntegration.test_list_idv_transactions +159 -0
- tango_python-0.4.2/tests/cassettes/TestIDVsIntegration.test_list_idvs_uses_default_shape_and_keyset_params +96 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestNaicsIntegration.test_list_naics +15 -15
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[custom-notice_id,title,solicitation_number] +12 -14
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[default-None] +12 -14
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[detailed-notice_id,title,description,solicitation_number,posted_date,naics_code,set_aside,office(-),place_of_performance(-)] +12 -14
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[minimal-notice_id,title,solicitation_number,posted_date] +12 -14
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestNoticesIntegration.test_notice_field_types +12 -14
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestNoticesIntegration.test_notice_pagination +24 -28
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestNoticesIntegration.test_notice_with_meta_fields +24 -26
- tango_python-0.4.2/tests/cassettes/TestOTAsIntegration.test_get_ota +154 -0
- tango_python-0.4.2/tests/cassettes/TestOTAsIntegration.test_list_otas +87 -0
- tango_python-0.4.2/tests/cassettes/TestOTIDVsIntegration.test_get_otidv +154 -0
- tango_python-0.4.2/tests/cassettes/TestOTIDVsIntegration.test_list_otidvs +88 -0
- tango_python-0.4.2/tests/cassettes/TestOfficesIntegration.test_get_office +154 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestOfficesIntegration.test_list_offices +15 -15
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[custom-opportunity_id,title,solicitation_number] +17 -18
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[default-None] +17 -18
- tango_python-0.4.2/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[detailed-opportunity_id,title,description,solicitation_number,response_deadline,first_notice_date,last_notice_date,active,naics_code,psc_code,set_asid...23b6b4502ddd665b7184afcff6c6d8d9 +138 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[minimal-opportunity_id,title,solicitation_number,response_deadline,active] +17 -18
- tango_python-0.4.2/tests/cassettes/TestOpportunitiesIntegration.test_opportunity_field_types +87 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestOrganizationsIntegration.test_get_organization +30 -30
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestOrganizationsIntegration.test_list_organizations +22 -22
- tango_python-0.4.2/tests/cassettes/TestProtestsIntegration.test_get_protest_by_case_id +152 -0
- tango_python-0.4.2/tests/cassettes/TestProtestsIntegration.test_list_protests_with_filter +81 -0
- tango_python-0.4.2/tests/cassettes/TestProtestsIntegration.test_list_protests_with_shapes[custom-case_id,title,source_system,outcome] +81 -0
- tango_python-0.4.2/tests/cassettes/TestProtestsIntegration.test_list_protests_with_shapes[default-None] +81 -0
- tango_python-0.4.2/tests/cassettes/TestProtestsIntegration.test_list_protests_with_shapes[minimal-case_id,case_number,title,source_system,outcome,filed_date] +81 -0
- tango_python-0.4.2/tests/cassettes/TestProtestsIntegration.test_list_protests_with_shapes[with_dockets-case_id,case_number,title,outcome,filed_date,dockets(docket_number,filed_date,outcome)] +81 -0
- tango_python-0.4.2/tests/cassettes/TestProtestsIntegration.test_protest_pagination +160 -0
- tango_python-0.4.2/tests/cassettes/TestSubawardsIntegration.test_list_subawards +95 -0
- tango_python-0.4.2/tests/cassettes/TestTypeHintsIntegration.test_contracts_dict_access[custom-key,piid,description] +81 -0
- tango_python-0.4.2/tests/cassettes/TestTypeHintsIntegration.test_contracts_dict_access[minimal-key,piid,award_date,recipient(display_name),description,total_contract_value] +86 -0
- tango_python-0.4.2/tests/cassettes/TestTypeHintsIntegration.test_contracts_dict_access[ultra_minimal-key,piid,recipient(display_name),total_contract_value] +81 -0
- tango_python-0.4.2/tests/cassettes/TestTypeHintsIntegration.test_entities_dict_access[minimal-uei,legal_business_name,cage_code,business_types] +99 -0
- tango_python-0.4.2/tests/cassettes/TestTypeHintsIntegration.test_entities_dict_access[with_address-uei,legal_business_name,cage_code,business_types,physical_address] +105 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestTypeHintsIntegration.test_notices_dict_access[detailed-notice_id,title,description,solicitation_number,posted_date,naics_code,set_aside,office(-),place_of_performance(-)] +12 -14
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestTypeHintsIntegration.test_notices_dict_access[minimal-notice_id,title,solicitation_number,posted_date] +12 -14
- tango_python-0.4.2/tests/cassettes/TestTypeHintsIntegration.test_opportunities_dict_access[detailed-opportunity_id,title,description,solicitation_number,response_deadline,first_notice_date,last_notice_date,active,naics_code,psc_code,set_aside,sam_url,office(-),place_of_performance(-)] +138 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/cassettes/TestTypeHintsIntegration.test_opportunities_dict_access[minimal-opportunity_id,title,solicitation_number,response_deadline,active] +17 -18
- tango_python-0.4.2/tests/cassettes/TestVehiclesIntegration.test_get_vehicle_supports_joiner_and_flat_lists +152 -0
- tango_python-0.4.2/tests/cassettes/TestVehiclesIntegration.test_list_vehicle_awardees_uses_default_shape +169 -0
- tango_python-0.4.2/tests/cassettes/TestVehiclesIntegration.test_list_vehicles_uses_default_shape_and_search +86 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/integration/conftest.py +20 -20
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/integration/test_contracts_integration.py +13 -5
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/integration/test_edge_cases_integration.py +12 -4
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/integration/test_entities_integration.py +0 -1
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/integration/test_grants_integration.py +0 -1
- tango_python-0.4.2/tests/integration/test_protests_integration.py +214 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/integration/test_vehicles_idvs_integration.py +3 -76
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/production/test_production_smoke.py +0 -21
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/test_client.py +0 -28
- {tango_python-0.4.1 → tango_python-0.4.2}/uv.lock +1 -1
- tango_python-0.4.1/tests/cassettes/TestAgenciesIntegration.test_list_agencies +0 -98
- tango_python-0.4.1/tests/cassettes/TestContractsIntegration.test_combined_filters_work_together +0 -92
- tango_python-0.4.1/tests/cassettes/TestContractsIntegration.test_contract_cursor_pagination +0 -169
- tango_python-0.4.1/tests/cassettes/TestContractsIntegration.test_contract_data_object_parsing +0 -92
- tango_python-0.4.1/tests/cassettes/TestContractsIntegration.test_contract_field_types +0 -102
- tango_python-0.4.1/tests/cassettes/TestContractsIntegration.test_filter_parameter_mappings[keyword-software] +0 -180
- tango_python-0.4.1/tests/cassettes/TestContractsIntegration.test_filter_parameter_mappings[psc_code-R425] +0 -180
- tango_python-0.4.1/tests/cassettes/TestContractsIntegration.test_list_contracts_with_awarding_agency_filter +0 -182
- tango_python-0.4.1/tests/cassettes/TestContractsIntegration.test_list_contracts_with_date_range_filter +0 -174
- tango_python-0.4.1/tests/cassettes/TestContractsIntegration.test_list_contracts_with_flat +0 -92
- tango_python-0.4.1/tests/cassettes/TestContractsIntegration.test_list_contracts_with_naics_code_filter +0 -408
- tango_python-0.4.1/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[custom-key,piid,recipient(display_name),total_contract_value,award_date] +0 -83
- tango_python-0.4.1/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[default-None] +0 -92
- tango_python-0.4.1/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[detailed-key,piid,award_date,description,total_contract_value,obligated,fiscal_year,set_aside,recipient(display_name,uei),awarding_office(-),place_of_performa...ce114a3c47e2037aaa3c15d00b7031bd +0 -218
- tango_python-0.4.1/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[minimal-key,piid,award_date,recipient(display_name),description,total_contract_value] +0 -92
- tango_python-0.4.1/tests/cassettes/TestContractsIntegration.test_new_expiring_filters +0 -88
- tango_python-0.4.1/tests/cassettes/TestContractsIntegration.test_new_fiscal_year_range_filters +0 -88
- tango_python-0.4.1/tests/cassettes/TestContractsIntegration.test_search_contracts_with_filters +0 -174
- tango_python-0.4.1/tests/cassettes/TestContractsIntegration.test_search_filters_object_with_new_parameters +0 -88
- tango_python-0.4.1/tests/cassettes/TestContractsIntegration.test_sort_and_order_mapped_to_ordering[asc-] +0 -88
- tango_python-0.4.1/tests/cassettes/TestContractsIntegration.test_sort_and_order_mapped_to_ordering[desc--] +0 -92
- tango_python-0.4.1/tests/cassettes/TestEdgeCasesIntegration.test_api_schema_stability_detection_contracts +0 -88
- tango_python-0.4.1/tests/cassettes/TestEdgeCasesIntegration.test_api_schema_stability_detection_entities +0 -142
- tango_python-0.4.1/tests/cassettes/TestEdgeCasesIntegration.test_date_field_parsing_edge_cases +0 -143
- tango_python-0.4.1/tests/cassettes/TestEdgeCasesIntegration.test_decimal_field_parsing_edge_cases +0 -128
- tango_python-0.4.1/tests/cassettes/TestEdgeCasesIntegration.test_entity_parsing_with_various_address_formats +0 -228
- tango_python-0.4.1/tests/cassettes/TestEdgeCasesIntegration.test_flattened_responses_with_flat_lists +0 -92
- tango_python-0.4.1/tests/cassettes/TestEdgeCasesIntegration.test_parsing_nested_objects_with_missing_data +0 -289
- tango_python-0.4.1/tests/cassettes/TestEdgeCasesIntegration.test_parsing_null_missing_fields_in_contracts +0 -128
- tango_python-0.4.1/tests/cassettes/TestEdgeCasesIntegration.test_parsing_with_minimal_shape_sparse_data +0 -88
- tango_python-0.4.1/tests/cassettes/TestEntitiesIntegration.test_entity_field_types +0 -228
- tango_python-0.4.1/tests/cassettes/TestEntitiesIntegration.test_get_entity_by_uei +0 -254
- tango_python-0.4.1/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_flat +0 -90
- tango_python-0.4.1/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[comprehensive-uei,legal_business_name,dba_name,cage_code,business_types,primary_naics,naics_codes,psc_codes,email_address,entity_url,description,capabilities,ke...95fcff7efcf320ecc846393dd484321d +0 -115
- tango_python-0.4.1/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[minimal-uei,legal_business_name,cage_code,business_types] +0 -102
- tango_python-0.4.1/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[with_address-uei,legal_business_name,cage_code,business_types,physical_address] +0 -107
- tango_python-0.4.1/tests/cassettes/TestForecastsIntegration.test_forecast_field_types +0 -88
- tango_python-0.4.1/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[detailed-id,source_system,external_id,title,description,anticipated_award_date,fiscal_year,naics_code,status,is_active] +0 -107
- tango_python-0.4.1/tests/cassettes/TestGrantsIntegration.test_grant_pagination +0 -171
- tango_python-0.4.1/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[custom-grant_id,title,opportunity_number] +0 -87
- tango_python-0.4.1/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[default-None] +0 -87
- tango_python-0.4.1/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[detailed-grant_id,opportunity_number,title,status(-),agency_code,description,last_updated,cfda_numbers(number,title),applicant_types(-),funding_categories(-)] +0 -179
- tango_python-0.4.1/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[minimal-grant_id,opportunity_number,title,status(-),agency_code] +0 -87
- tango_python-0.4.1/tests/cassettes/TestIDVsIntegration.test_get_idv_summary +0 -252
- tango_python-0.4.1/tests/cassettes/TestIDVsIntegration.test_get_idv_uses_default_shape +0 -494
- tango_python-0.4.1/tests/cassettes/TestIDVsIntegration.test_list_idv_awards_uses_default_shape +0 -302
- tango_python-0.4.1/tests/cassettes/TestIDVsIntegration.test_list_idv_child_idvs_uses_default_shape +0 -302
- tango_python-0.4.1/tests/cassettes/TestIDVsIntegration.test_list_idv_summary_awards +0 -256
- tango_python-0.4.1/tests/cassettes/TestIDVsIntegration.test_list_idv_transactions +0 -304
- tango_python-0.4.1/tests/cassettes/TestIDVsIntegration.test_list_idvs_uses_default_shape_and_keyset_params +0 -284
- tango_python-0.4.1/tests/cassettes/TestOTAsIntegration.test_get_ota +0 -306
- tango_python-0.4.1/tests/cassettes/TestOTAsIntegration.test_list_otas +0 -170
- tango_python-0.4.1/tests/cassettes/TestOTIDVsIntegration.test_get_otidv +0 -310
- tango_python-0.4.1/tests/cassettes/TestOTIDVsIntegration.test_list_otidvs +0 -176
- tango_python-0.4.1/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[detailed-opportunity_id,title,description,solicitation_number,response_deadline,first_notice_date,last_notice_date,active,naics_code,psc_code,set_asid...23b6b4502ddd665b7184afcff6c6d8d9 +0 -129
- tango_python-0.4.1/tests/cassettes/TestOpportunitiesIntegration.test_opportunity_field_types +0 -83
- tango_python-0.4.1/tests/cassettes/TestProductionSmokeWithCassettes.test_contract_cursor_pagination +0 -169
- tango_python-0.4.1/tests/cassettes/TestSubawardsIntegration.test_list_subawards +0 -95
- tango_python-0.4.1/tests/cassettes/TestTypeHintsIntegration.test_contracts_dict_access[custom-key,piid,description] +0 -87
- tango_python-0.4.1/tests/cassettes/TestTypeHintsIntegration.test_contracts_dict_access[minimal-key,piid,award_date,recipient(display_name),description,total_contract_value] +0 -92
- tango_python-0.4.1/tests/cassettes/TestTypeHintsIntegration.test_contracts_dict_access[ultra_minimal-key,piid,recipient(display_name),total_contract_value] +0 -83
- tango_python-0.4.1/tests/cassettes/TestTypeHintsIntegration.test_entities_dict_access[minimal-uei,legal_business_name,cage_code,business_types] +0 -102
- tango_python-0.4.1/tests/cassettes/TestTypeHintsIntegration.test_entities_dict_access[with_address-uei,legal_business_name,cage_code,business_types,physical_address] +0 -107
- tango_python-0.4.1/tests/cassettes/TestTypeHintsIntegration.test_opportunities_dict_access[detailed-opportunity_id,title,description,solicitation_number,response_deadline,first_notice_date,last_notice_date,active,naics_code,psc_code,set_aside,sam_url,office(-),place_of_performance(-)] +0 -129
- tango_python-0.4.1/tests/cassettes/TestVehiclesIntegration.test_get_vehicle_supports_joiner_and_flat_lists +0 -1352
- tango_python-0.4.1/tests/cassettes/TestVehiclesIntegration.test_list_vehicle_awardees_uses_default_shape +0 -1505
- tango_python-0.4.1/tests/cassettes/TestVehiclesIntegration.test_list_vehicles_uses_default_shape_and_search +0 -812
- tango_python-0.4.1/tests/integration/test_assistance_integration.py +0 -46
- {tango_python-0.4.1 → tango_python-0.4.2}/.env.example +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/.github/workflows/publish.yml +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/.github/workflows/test.yml +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/.gitignore +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/LICENSE +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/ROADMAP.md +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/docs/DEVELOPERS.md +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/scripts/README.md +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/scripts/fetch_api_schema.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/scripts/generate_schemas_from_api.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/scripts/test_production.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tango/__init__.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tango/exceptions.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tango/shapes/__init__.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tango/shapes/factory.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tango/shapes/generator.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tango/shapes/models.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tango/shapes/parser.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tango/shapes/schema.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tango/shapes/types.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/__init__.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/conftest.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/integration/README.md +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/integration/__init__.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/integration/test_agencies_integration.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/integration/test_forecasts_integration.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/integration/test_naics_integration.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/integration/test_notices_integration.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/integration/test_offices_integration.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/integration/test_opportunities_integration.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/integration/test_organizations_integration.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/integration/test_otas_otidvs_integration.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/integration/test_reference_data_integration.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/integration/test_subawards_integration.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/integration/validation.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/production/__init__.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/production/conftest.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/test_models.py +0 -0
- {tango_python-0.4.1 → tango_python-0.4.2}/tests/test_shapes.py +0 -0
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
name: Linting
|
|
2
2
|
|
|
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).
|
|
3
5
|
on:
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
# push:
|
|
8
|
+
# branches: [ main, develop ]
|
|
9
|
+
# pull_request:
|
|
10
|
+
# branches: [ main, develop ]
|
|
8
11
|
|
|
9
12
|
jobs:
|
|
10
13
|
lint:
|
|
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
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
|
+
|
|
10
26
|
## [0.4.1] - 2026-03-03
|
|
11
27
|
|
|
12
28
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tango-python
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.2
|
|
4
4
|
Summary: Python SDK for the Tango API
|
|
5
5
|
Project-URL: Homepage, https://github.com/makegov/tango-python
|
|
6
6
|
Project-URL: Documentation, https://docs.makegov.com/tango-python
|
|
@@ -61,7 +61,7 @@ A modern Python SDK for the [Tango API](https://tango.makegov.com) by MakeGov, f
|
|
|
61
61
|
|
|
62
62
|
- **Dynamic Response Shaping** - Request only the fields you need, reducing payload sizes by 60-80%
|
|
63
63
|
- **Full Type Safety** - Runtime-generated TypedDict types with accurate type hints for IDE autocomplete
|
|
64
|
-
- **Comprehensive API Coverage** - All major Tango API endpoints (contracts, entities, forecasts, opportunities, notices, grants, webhooks
|
|
64
|
+
- **Comprehensive API Coverage** - All major Tango API endpoints (contracts, IDVs, OTAs, entities, forecasts, opportunities, notices, grants, protests, webhooks, and more)
|
|
65
65
|
- **Flexible Data Access** - Dictionary-based response objects with validation
|
|
66
66
|
- **Modern Python** - Built for Python 3.12+ using modern async-ready patterns
|
|
67
67
|
- **Production-Ready** - Comprehensive test suite with VCR.py-based integration tests
|
|
@@ -207,14 +207,33 @@ contracts = client.list_contracts(
|
|
|
207
207
|
**Response Options:**
|
|
208
208
|
- `shape`, `flat`, `flat_lists` - Response shaping options
|
|
209
209
|
|
|
210
|
+
### IDVs, OTAs, OTIDVs
|
|
211
|
+
|
|
212
|
+
```python
|
|
213
|
+
# List IDVs (keyset pagination)
|
|
214
|
+
idvs = client.list_idvs(limit=25, awarding_agency="4700")
|
|
215
|
+
|
|
216
|
+
# Get single IDV with shaping
|
|
217
|
+
idv = client.get_idv("IDV_KEY", shape=ShapeConfig.IDVS_COMPREHENSIVE)
|
|
218
|
+
|
|
219
|
+
# OTAs and OTIDVs follow the same pattern
|
|
220
|
+
otas = client.list_otas(limit=25)
|
|
221
|
+
otidvs = client.list_otidvs(limit=25)
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Vehicles
|
|
225
|
+
|
|
226
|
+
```python
|
|
227
|
+
vehicles = client.list_vehicles(search="GSA schedule", shape=ShapeConfig.VEHICLES_MINIMAL)
|
|
228
|
+
vehicle = client.get_vehicle("UUID", shape=ShapeConfig.VEHICLES_COMPREHENSIVE)
|
|
229
|
+
awardees = client.list_vehicle_awardees("UUID")
|
|
230
|
+
```
|
|
231
|
+
|
|
210
232
|
### Entities (Vendors/Recipients)
|
|
211
233
|
|
|
212
234
|
```python
|
|
213
|
-
# List entities
|
|
214
|
-
entities = client.list_entities(
|
|
215
|
-
page=1,
|
|
216
|
-
limit=25
|
|
217
|
-
)
|
|
235
|
+
# List entities with filters
|
|
236
|
+
entities = client.list_entities(search="Booz Allen", state="VA", limit=25)
|
|
218
237
|
|
|
219
238
|
# Get specific entity by UEI or CAGE code
|
|
220
239
|
entity = client.get_entity("ZQGGHJH74DW7")
|
|
@@ -223,47 +242,49 @@ entity = client.get_entity("ZQGGHJH74DW7")
|
|
|
223
242
|
### Forecasts
|
|
224
243
|
|
|
225
244
|
```python
|
|
226
|
-
|
|
227
|
-
forecasts = client.list_forecasts(
|
|
228
|
-
agency="GSA",
|
|
229
|
-
limit=25
|
|
230
|
-
)
|
|
245
|
+
forecasts = client.list_forecasts(agency="GSA", fiscal_year=2025, limit=25)
|
|
231
246
|
```
|
|
232
247
|
|
|
233
248
|
### Opportunities
|
|
234
249
|
|
|
235
250
|
```python
|
|
236
|
-
|
|
237
|
-
opportunities = client.list_opportunities(
|
|
238
|
-
agency="DOD",
|
|
239
|
-
limit=25
|
|
240
|
-
)
|
|
251
|
+
opportunities = client.list_opportunities(agency="DOD", active=True, limit=25)
|
|
241
252
|
```
|
|
242
253
|
|
|
243
254
|
### Notices
|
|
244
255
|
|
|
245
256
|
```python
|
|
246
|
-
|
|
247
|
-
notices = client.list_notices(
|
|
248
|
-
agency="DOD",
|
|
249
|
-
limit=25
|
|
250
|
-
)
|
|
257
|
+
notices = client.list_notices(agency="DOD", notice_type="award", limit=25)
|
|
251
258
|
```
|
|
252
259
|
|
|
253
260
|
### Grants
|
|
254
261
|
|
|
255
262
|
```python
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
263
|
+
grants = client.list_grants(agency="HHS", status="forecasted", limit=25)
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### Protests
|
|
267
|
+
|
|
268
|
+
```python
|
|
269
|
+
protests = client.list_protests(source_system="gao", outcome="Sustained", limit=25)
|
|
270
|
+
protest = client.get_protest("CASE_UUID")
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### GSA eLibrary Contracts
|
|
274
|
+
|
|
275
|
+
```python
|
|
276
|
+
contracts = client.list_gsa_elibrary_contracts(schedule="MAS", limit=25)
|
|
277
|
+
contract = client.get_gsa_elibrary_contract("UUID")
|
|
261
278
|
```
|
|
262
279
|
|
|
263
|
-
###
|
|
280
|
+
### Reference Data
|
|
264
281
|
|
|
265
282
|
```python
|
|
266
|
-
#
|
|
283
|
+
# Offices, organizations, NAICS, subawards, business types
|
|
284
|
+
offices = client.list_offices(search="acquisitions")
|
|
285
|
+
organizations = client.list_organizations(level=1)
|
|
286
|
+
naics = client.list_naics(search="software")
|
|
287
|
+
subawards = client.list_subawards(prime_uei="UEI123")
|
|
267
288
|
business_types = client.list_business_types()
|
|
268
289
|
```
|
|
269
290
|
|
|
@@ -476,9 +497,16 @@ tango-python/
|
|
|
476
497
|
│ ├── test_entities_integration.py
|
|
477
498
|
│ ├── test_forecasts_integration.py
|
|
478
499
|
│ ├── test_grants_integration.py
|
|
500
|
+
│ ├── test_naics_integration.py
|
|
479
501
|
│ ├── test_notices_integration.py
|
|
502
|
+
│ ├── test_offices_integration.py
|
|
480
503
|
│ ├── test_opportunities_integration.py
|
|
504
|
+
│ ├── test_organizations_integration.py
|
|
505
|
+
│ ├── test_otas_otidvs_integration.py
|
|
506
|
+
│ ├── test_protests_integration.py
|
|
481
507
|
│ ├── test_reference_data_integration.py
|
|
508
|
+
│ ├── test_subawards_integration.py
|
|
509
|
+
│ ├── test_vehicles_idvs_integration.py
|
|
482
510
|
│ └── test_edge_cases_integration.py
|
|
483
511
|
├── docs/ # Documentation
|
|
484
512
|
│ ├── API_REFERENCE.md # Complete API reference
|
|
@@ -6,7 +6,7 @@ A modern Python SDK for the [Tango API](https://tango.makegov.com) by MakeGov, f
|
|
|
6
6
|
|
|
7
7
|
- **Dynamic Response Shaping** - Request only the fields you need, reducing payload sizes by 60-80%
|
|
8
8
|
- **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
|
|
9
|
+
- **Comprehensive API Coverage** - All major Tango API endpoints (contracts, IDVs, OTAs, entities, forecasts, opportunities, notices, grants, protests, webhooks, and more)
|
|
10
10
|
- **Flexible Data Access** - Dictionary-based response objects with validation
|
|
11
11
|
- **Modern Python** - Built for Python 3.12+ using modern async-ready patterns
|
|
12
12
|
- **Production-Ready** - Comprehensive test suite with VCR.py-based integration tests
|
|
@@ -152,14 +152,33 @@ contracts = client.list_contracts(
|
|
|
152
152
|
**Response Options:**
|
|
153
153
|
- `shape`, `flat`, `flat_lists` - Response shaping options
|
|
154
154
|
|
|
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
|
+
|
|
155
177
|
### Entities (Vendors/Recipients)
|
|
156
178
|
|
|
157
179
|
```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)
|
|
163
182
|
|
|
164
183
|
# Get specific entity by UEI or CAGE code
|
|
165
184
|
entity = client.get_entity("ZQGGHJH74DW7")
|
|
@@ -168,47 +187,49 @@ entity = client.get_entity("ZQGGHJH74DW7")
|
|
|
168
187
|
### Forecasts
|
|
169
188
|
|
|
170
189
|
```python
|
|
171
|
-
|
|
172
|
-
forecasts = client.list_forecasts(
|
|
173
|
-
agency="GSA",
|
|
174
|
-
limit=25
|
|
175
|
-
)
|
|
190
|
+
forecasts = client.list_forecasts(agency="GSA", fiscal_year=2025, limit=25)
|
|
176
191
|
```
|
|
177
192
|
|
|
178
193
|
### Opportunities
|
|
179
194
|
|
|
180
195
|
```python
|
|
181
|
-
|
|
182
|
-
opportunities = client.list_opportunities(
|
|
183
|
-
agency="DOD",
|
|
184
|
-
limit=25
|
|
185
|
-
)
|
|
196
|
+
opportunities = client.list_opportunities(agency="DOD", active=True, limit=25)
|
|
186
197
|
```
|
|
187
198
|
|
|
188
199
|
### Notices
|
|
189
200
|
|
|
190
201
|
```python
|
|
191
|
-
|
|
192
|
-
notices = client.list_notices(
|
|
193
|
-
agency="DOD",
|
|
194
|
-
limit=25
|
|
195
|
-
)
|
|
202
|
+
notices = client.list_notices(agency="DOD", notice_type="award", limit=25)
|
|
196
203
|
```
|
|
197
204
|
|
|
198
205
|
### Grants
|
|
199
206
|
|
|
200
207
|
```python
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
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")
|
|
206
223
|
```
|
|
207
224
|
|
|
208
|
-
###
|
|
225
|
+
### Reference Data
|
|
209
226
|
|
|
210
227
|
```python
|
|
211
|
-
#
|
|
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")
|
|
212
233
|
business_types = client.list_business_types()
|
|
213
234
|
```
|
|
214
235
|
|
|
@@ -421,9 +442,16 @@ tango-python/
|
|
|
421
442
|
│ ├── test_entities_integration.py
|
|
422
443
|
│ ├── test_forecasts_integration.py
|
|
423
444
|
│ ├── test_grants_integration.py
|
|
445
|
+
│ ├── test_naics_integration.py
|
|
424
446
|
│ ├── test_notices_integration.py
|
|
447
|
+
│ ├── test_offices_integration.py
|
|
425
448
|
│ ├── test_opportunities_integration.py
|
|
449
|
+
│ ├── test_organizations_integration.py
|
|
450
|
+
│ ├── test_otas_otidvs_integration.py
|
|
451
|
+
│ ├── test_protests_integration.py
|
|
426
452
|
│ ├── test_reference_data_integration.py
|
|
453
|
+
│ ├── test_subawards_integration.py
|
|
454
|
+
│ ├── test_vehicles_idvs_integration.py
|
|
427
455
|
│ └── test_edge_cases_integration.py
|
|
428
456
|
├── docs/ # Documentation
|
|
429
457
|
│ ├── API_REFERENCE.md # Complete API reference
|