tango-python 1.16.0__tar.gz → 1.17.0__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-1.16.0 → tango_python-1.17.0}/CHANGELOG.md +10 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/PKG-INFO +1 -1
- {tango_python-1.16.0 → tango_python-1.17.0}/docs/API_REFERENCE.md +5 -1
- {tango_python-1.16.0 → tango_python-1.17.0}/pyproject.toml +1 -1
- {tango_python-1.16.0 → tango_python-1.17.0}/tango/__init__.py +1 -1
- {tango_python-1.16.0 → tango_python-1.17.0}/tango/client.py +7 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/test_client.py +27 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/.gitignore +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/LICENSE +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/README.md +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/docs/CLIENT.md +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/docs/DYNAMIC_MODELS.md +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/docs/ERRORS.md +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/docs/PAGINATION.md +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/docs/SHAPES.md +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/docs/WEBHOOKS.md +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/scripts/README.md +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/scripts/check_filter_shape_conformance.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/scripts/check_shape_coverage.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/scripts/fetch_api_schema.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/scripts/generate_schemas_from_api.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/scripts/generate_shape_overlay.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/scripts/pr_review.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/scripts/probe_shape_types.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/scripts/refresh_contract.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/scripts/smoke_api_parity.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/scripts/test_production.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tango/exceptions.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tango/models.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tango/shapes/__init__.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tango/shapes/explicit_schemas.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tango/shapes/factory.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tango/shapes/generated_overlay.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tango/shapes/generator.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tango/shapes/models.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tango/shapes/parser.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tango/shapes/schema.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tango/shapes/types.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tango/webhooks/__init__.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tango/webhooks/cli.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tango/webhooks/receiver.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tango/webhooks/signing.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tango/webhooks/simulate.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/__init__.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestAgenciesIntegration.test_get_agency +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestAgenciesIntegration.test_list_agencies +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestBusinessTypesIntegration.test_business_type_field_type_validation +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestBusinessTypesIntegration.test_business_type_parsing_consistency +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestBusinessTypesIntegration.test_list_business_types +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestContractsIntegration.test_combined_filters_work_together +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestContractsIntegration.test_contract_cursor_pagination +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestContractsIntegration.test_contract_data_object_parsing +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestContractsIntegration.test_contract_field_types +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestContractsIntegration.test_filter_parameter_mappings[keyword-software] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestContractsIntegration.test_filter_parameter_mappings[psc_code-R425] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_awarding_agency_filter +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_date_range_filter +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_flat +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_naics_code_filter +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[custom-key,piid,recipient(display_name),total_contract_value,award_date] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[default-None] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/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 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[minimal-key,piid,award_date,recipient(display_name),description,total_contract_value] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestContractsIntegration.test_new_expiring_filters +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestContractsIntegration.test_new_fiscal_year_range_filters +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestContractsIntegration.test_new_identifier_filters +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestContractsIntegration.test_search_contracts_with_filters +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestContractsIntegration.test_search_filters_object_with_new_parameters +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestContractsIntegration.test_sort_and_order_mapped_to_ordering[asc-] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestContractsIntegration.test_sort_and_order_mapped_to_ordering[desc--] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestEdgeCasesIntegration.test_api_schema_stability_detection_contracts +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestEdgeCasesIntegration.test_api_schema_stability_detection_entities +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestEdgeCasesIntegration.test_date_field_parsing_edge_cases +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestEdgeCasesIntegration.test_decimal_field_parsing_edge_cases +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestEdgeCasesIntegration.test_empty_list_responses +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestEdgeCasesIntegration.test_entity_parsing_with_various_address_formats +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestEdgeCasesIntegration.test_flattened_responses_with_flat_lists +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestEdgeCasesIntegration.test_list_field_parsing_consistency +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestEdgeCasesIntegration.test_parsing_nested_objects_with_missing_data +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestEdgeCasesIntegration.test_parsing_null_missing_fields_in_contracts +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestEdgeCasesIntegration.test_parsing_with_minimal_shape_sparse_data +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestEntitiesIntegration.test_entity_field_types +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestEntitiesIntegration.test_entity_location_parsing +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestEntitiesIntegration.test_entity_parsing_with_business_types +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestEntitiesIntegration.test_entity_with_various_identifiers +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestEntitiesIntegration.test_get_entity_budget_flows +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestEntitiesIntegration.test_get_entity_by_uei +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_flat +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_search +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/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 +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[custom-uei,legal_business_name,cage_code] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[minimal-uei,legal_business_name,cage_code,business_types] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[with_address-uei,legal_business_name,cage_code,business_types,physical_address] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestForecastsIntegration.test_forecast_field_types +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[custom-id,title,anticipated_award_date] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[default-None] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/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 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[minimal-id,title,anticipated_award_date,fiscal_year,naics_code,status] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestGrantsIntegration.test_grant_field_types +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestGrantsIntegration.test_grant_pagination +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[custom-grant_id,title,opportunity_number] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[default-None] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/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 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[minimal-grant_id,opportunity_number,title,status(-),agency_code] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestIDVsIntegration.test_get_idv_uses_default_shape +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestIDVsIntegration.test_list_idv_awards_uses_default_shape +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestIDVsIntegration.test_list_idv_child_idvs_uses_default_shape +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestIDVsIntegration.test_list_idv_transactions +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestIDVsIntegration.test_list_idvs_uses_default_shape_and_keyset_params +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestITDashboardIntegration.test_filter_by_agency_code +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestITDashboardIntegration.test_filter_by_agency_name_text +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestITDashboardIntegration.test_filter_by_cio_rating +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestITDashboardIntegration.test_filter_by_cio_rating_max +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestITDashboardIntegration.test_filter_by_performance_risk +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestITDashboardIntegration.test_filter_by_type_of_investment +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestITDashboardIntegration.test_filter_by_updated_time_range +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestITDashboardIntegration.test_funding_and_cio_evaluation_expansions +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestITDashboardIntegration.test_get_itdashboard_investment_by_uii +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestITDashboardIntegration.test_itdashboard_pagination +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestITDashboardIntegration.test_list_itdashboard_investments_with_search +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestITDashboardIntegration.test_list_itdashboard_investments_with_shapes[custom-uii,agency_name,investment_title,updated_time] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestITDashboardIntegration.test_list_itdashboard_investments_with_shapes[default-None] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestITDashboardIntegration.test_list_itdashboard_investments_with_shapes[minimal-uii,agency_name,bureau_name,investment_title,type_of_investment,part_of_it_portfolio,updated_time,url] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestNaicsIntegration.test_list_naics +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[custom-notice_id,title,solicitation_number] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[default-None] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/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(-)] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[minimal-notice_id,title,solicitation_number,posted_date] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestNoticesIntegration.test_notice_field_types +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestNoticesIntegration.test_notice_pagination +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestNoticesIntegration.test_notice_with_meta_fields +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestOTAsIntegration.test_get_ota +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestOTAsIntegration.test_list_otas +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestOTIDVsIntegration.test_get_otidv +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestOTIDVsIntegration.test_list_otidvs +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestOfficesIntegration.test_get_office +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestOfficesIntegration.test_list_offices +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[custom-opportunity_id,title,solicitation_number] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[default-None] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/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 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[minimal-opportunity_id,title,solicitation_number,response_deadline,active] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestOpportunitiesIntegration.test_opportunity_field_types +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestOrganizationsIntegration.test_get_organization +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestOrganizationsIntegration.test_list_organizations +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestProtestsIntegration.test_get_protest_by_case_id +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestProtestsIntegration.test_list_protests_with_filter +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestProtestsIntegration.test_list_protests_with_shapes[custom-case_id,title,source_system,outcome] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestProtestsIntegration.test_list_protests_with_shapes[default-None] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestProtestsIntegration.test_list_protests_with_shapes[minimal-case_id,case_number,title,source_system,outcome,filed_date] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestProtestsIntegration.test_list_protests_with_shapes[with_dockets-case_id,case_number,title,outcome,filed_date,dockets(docket_number,filed_date,outcome)] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestProtestsIntegration.test_protest_pagination +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestSubawardsIntegration.test_list_subawards +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestTypeHintsIntegration.test_contracts_dict_access[custom-key,piid,description] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestTypeHintsIntegration.test_contracts_dict_access[minimal-key,piid,award_date,recipient(display_name),description,total_contract_value] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestTypeHintsIntegration.test_contracts_dict_access[ultra_minimal-key,piid,recipient(display_name),total_contract_value] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestTypeHintsIntegration.test_entities_dict_access[minimal-uei,legal_business_name,cage_code,business_types] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestTypeHintsIntegration.test_entities_dict_access[with_address-uei,legal_business_name,cage_code,business_types,physical_address] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestTypeHintsIntegration.test_notices_dict_access[detailed-notice_id,title,description,solicitation_number,posted_date,naics_code,set_aside,office(-),place_of_performance(-)] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestTypeHintsIntegration.test_notices_dict_access[minimal-notice_id,title,solicitation_number,posted_date] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/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 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestTypeHintsIntegration.test_opportunities_dict_access[minimal-opportunity_id,title,solicitation_number,response_deadline,active] +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestVehiclesIntegration.test_get_vehicle_supports_joiner_and_flat_lists +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestVehiclesIntegration.test_get_vehicle_with_metrics_expansion +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestVehiclesIntegration.test_list_vehicle_awardees_uses_default_shape +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestVehiclesIntegration.test_list_vehicle_orders_uses_default_shape +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestVehiclesIntegration.test_list_vehicles_uses_default_shape_and_search +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestVehiclesIntegration.test_list_vehicles_with_ordering +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/conftest.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/README.md +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/__init__.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/conftest.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_agencies_integration.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_contracts_integration.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_edge_cases_integration.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_entities_integration.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_forecasts_integration.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_grants_integration.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_itdashboard_integration.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_naics_integration.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_notices_integration.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_offices_integration.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_opportunities_integration.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_organizations_integration.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_otas_otidvs_integration.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_protests_integration.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_reference_data_integration.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_subawards_integration.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_vehicles_idvs_integration.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/validation.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/production/__init__.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/production/conftest.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/production/test_production_smoke.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/test_api_parity.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/test_contract_appeals.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/test_dibbs_exclusions_sbir.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/test_ebuy.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/test_federal_register.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/test_models.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/test_opportunity_attachments.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/test_opportunity_awards.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/test_organization_scope.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/test_shape_coverage_gate.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/test_shapes.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/test_sled.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/test_webhooks_cli.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/test_webhooks_receiver.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/test_webhooks_signing.py +0 -0
- {tango_python-1.16.0 → tango_python-1.17.0}/tests/test_webhooks_simulate.py +0 -0
|
@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [1.17.0] - 2026-10-16
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **`commercial_item_acquisition_procedures` filter on `list_contracts()` and `list_idvs()`** (Tango API 5.10.0). Filters by the FPDS commercial item acquisition procedures code: `A` (commercial products/services), `B` (products or services pursuant to FAR 12.102(f)), `C` (services pursuant to FAR 12.102(g)), `D` (commercial procedures not used) or `E` (DoD Section 803 Commercial Solutions Opening). Codes are case-insensitive and pipe-separated for OR, e.g. `"A|E"`; an unknown or multi-character code matches nothing. The API does not offer it on OTAs or OTIDVs, so `list_otas()` and `list_otidvs()` do not take it. The field itself was already returned in responses.
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
|
|
18
|
+
- Re-vendored `contracts/filter_shape_contract.json` (Tango API 5.10.0).
|
|
19
|
+
|
|
10
20
|
## [1.16.0] - 2026-10-10
|
|
11
21
|
|
|
12
22
|
### Added
|
|
@@ -244,6 +244,7 @@ contracts = client.list_contracts(
|
|
|
244
244
|
naics_code=None, # Mapped to 'naics' API param
|
|
245
245
|
psc_code=None, # Mapped to 'psc' API param
|
|
246
246
|
set_aside_type=None, # Mapped to 'set_aside' API param
|
|
247
|
+
commercial_item_acquisition_procedures=None, # FPDS code A-E, e.g. "A|E"
|
|
247
248
|
# Type filters
|
|
248
249
|
fiscal_year=None,
|
|
249
250
|
fiscal_year_gte=None,
|
|
@@ -290,6 +291,7 @@ contracts = client.list_contracts(
|
|
|
290
291
|
- `naics_code` - NAICS industry code (mapped to 'naics' API param)
|
|
291
292
|
- `psc_code` - Product/Service code (mapped to 'psc' API param)
|
|
292
293
|
- `set_aside_type` - Set-aside type (mapped to 'set_aside' API param)
|
|
294
|
+
- `commercial_item_acquisition_procedures` - FPDS commercial item acquisition procedures code, case-insensitive: `A` (commercial products/services), `B` (products or services pursuant to FAR 12.102(f)), `C` (services pursuant to FAR 12.102(g)), `D` (commercial procedures not used) or `E` (DoD Section 803 Commercial Solutions Opening). Multi-value OR via `|`, e.g. `"A|E"`. An unknown or multi-character code matches nothing.
|
|
293
295
|
|
|
294
296
|
**Type Filters:**
|
|
295
297
|
- `fiscal_year` - Federal fiscal year (exact match)
|
|
@@ -420,7 +422,7 @@ otas = client.list_otas(
|
|
|
420
422
|
|
|
421
423
|
**Notes:**
|
|
422
424
|
- Uses **keyset pagination** (`cursor` + `limit`) rather than page numbers.
|
|
423
|
-
- Filter parameters mirror those on `list_contracts
|
|
425
|
+
- Filter parameters mirror those on `list_contracts`, except `commercial_item_acquisition_procedures`, which the API does not offer on OTAs or OTIDVs.
|
|
424
426
|
|
|
425
427
|
**Returns:** [PaginatedResponse](#paginatedresponse) with OTA dictionaries
|
|
426
428
|
|
|
@@ -638,12 +640,14 @@ idvs = client.list_idvs(
|
|
|
638
640
|
cursor=None,
|
|
639
641
|
shape=ShapeConfig.IDVS_MINIMAL,
|
|
640
642
|
awarding_agency="4700",
|
|
643
|
+
commercial_item_acquisition_procedures="E", # DoD Section 803 CSO
|
|
641
644
|
)
|
|
642
645
|
```
|
|
643
646
|
|
|
644
647
|
Notes:
|
|
645
648
|
|
|
646
649
|
- This endpoint uses **keyset pagination** (`cursor` + `limit`) rather than page numbers.
|
|
650
|
+
- `commercial_item_acquisition_procedures` takes the same FPDS codes `A`–`E` as on `list_contracts()`, with `|` for OR.
|
|
647
651
|
|
|
648
652
|
### get_idv()
|
|
649
653
|
|
|
@@ -632,6 +632,7 @@ class TangoClient:
|
|
|
632
632
|
award_date_lte: str | None = None,
|
|
633
633
|
award_type: str | None = None,
|
|
634
634
|
awarding_agency: str | None = None,
|
|
635
|
+
commercial_item_acquisition_procedures: str | None = None,
|
|
635
636
|
expiring_gte: str | None = None,
|
|
636
637
|
expiring_lte: str | None = None,
|
|
637
638
|
fiscal_year: int | None = None,
|
|
@@ -674,6 +675,7 @@ class TangoClient:
|
|
|
674
675
|
award_date_lte: Award date <= (YYYY-MM-DD)
|
|
675
676
|
award_type: Award type code
|
|
676
677
|
awarding_agency: Awarding agency code (e.g., "4700" for GSA)
|
|
678
|
+
commercial_item_acquisition_procedures: FPDS commercial item acquisition procedures code, case-insensitive: "A" (commercial products/services), "B" (products or services pursuant to FAR 12.102(f)), "C" (services pursuant to FAR 12.102(g)), "D" (commercial procedures not used) or "E" (DoD Section 803 Commercial Solutions Opening). Pipe-separate codes for OR, e.g. "A|E"; an unknown code matches nothing.
|
|
677
679
|
expiring_gte: Expiring on or after date
|
|
678
680
|
expiring_lte: Expiring on or before date
|
|
679
681
|
fiscal_year: Fiscal year (exact match)
|
|
@@ -751,6 +753,7 @@ class TangoClient:
|
|
|
751
753
|
("award_date_lte", award_date_lte),
|
|
752
754
|
("award_type", award_type),
|
|
753
755
|
("awarding_agency", awarding_agency),
|
|
756
|
+
("commercial_item_acquisition_procedures", commercial_item_acquisition_procedures),
|
|
754
757
|
("expiring_gte", expiring_gte),
|
|
755
758
|
("expiring_lte", expiring_lte),
|
|
756
759
|
("fiscal_year", fiscal_year),
|
|
@@ -915,6 +918,7 @@ class TangoClient:
|
|
|
915
918
|
award_date_gte: str | None = None,
|
|
916
919
|
award_date_lte: str | None = None,
|
|
917
920
|
awarding_agency: str | None = None,
|
|
921
|
+
commercial_item_acquisition_procedures: str | None = None,
|
|
918
922
|
expiring_gte: str | None = None,
|
|
919
923
|
expiring_lte: str | None = None,
|
|
920
924
|
fiscal_year: int | None = None,
|
|
@@ -941,6 +945,8 @@ class TangoClient:
|
|
|
941
945
|
|
|
942
946
|
This mirrors `/api/idvs/` and supports the same filter parameters as the API,
|
|
943
947
|
plus shaping via `shape`.
|
|
948
|
+
|
|
949
|
+
`commercial_item_acquisition_procedures` takes an FPDS commercial item acquisition procedures code `A`–`E` (case-insensitive; `E` is DoD Section 803 Commercial Solutions Opening), pipe-separated for OR, e.g. `"A|E"`; an unknown code matches nothing.
|
|
944
950
|
"""
|
|
945
951
|
params: dict[str, Any] = {"limit": min(limit, 100)}
|
|
946
952
|
if cursor:
|
|
@@ -962,6 +968,7 @@ class TangoClient:
|
|
|
962
968
|
("award_date_gte", award_date_gte),
|
|
963
969
|
("award_date_lte", award_date_lte),
|
|
964
970
|
("awarding_agency", awarding_agency),
|
|
971
|
+
("commercial_item_acquisition_procedures", commercial_item_acquisition_procedures),
|
|
965
972
|
("expiring_gte", expiring_gte),
|
|
966
973
|
("expiring_lte", expiring_lte),
|
|
967
974
|
("fiscal_year", fiscal_year),
|
|
@@ -2247,6 +2247,33 @@ class TestEntityFilters:
|
|
|
2247
2247
|
assert "socioeconomic" not in mock_request.call_args[1]["params"]
|
|
2248
2248
|
|
|
2249
2249
|
|
|
2250
|
+
class TestCommercialItemAcquisitionProceduresFilter:
|
|
2251
|
+
@pytest.mark.parametrize("method", ["list_contracts", "list_idvs"])
|
|
2252
|
+
@patch("tango.client.httpx.Client.request")
|
|
2253
|
+
def test_forwards_pipe_separated_codes_verbatim(self, mock_request, method):
|
|
2254
|
+
_stub_empty_page(mock_request)
|
|
2255
|
+
getattr(TangoClient(api_key="test-key"), method)(
|
|
2256
|
+
commercial_item_acquisition_procedures="a|E"
|
|
2257
|
+
)
|
|
2258
|
+
assert (
|
|
2259
|
+
mock_request.call_args[1]["params"]["commercial_item_acquisition_procedures"] == "a|E"
|
|
2260
|
+
)
|
|
2261
|
+
|
|
2262
|
+
@pytest.mark.parametrize("method", ["list_contracts", "list_idvs"])
|
|
2263
|
+
@patch("tango.client.httpx.Client.request")
|
|
2264
|
+
def test_omits_unset_filter(self, mock_request, method):
|
|
2265
|
+
_stub_empty_page(mock_request)
|
|
2266
|
+
getattr(TangoClient(api_key="test-key"), method)()
|
|
2267
|
+
assert "commercial_item_acquisition_procedures" not in mock_request.call_args[1]["params"]
|
|
2268
|
+
|
|
2269
|
+
@pytest.mark.parametrize("method", ["list_otas", "list_otidvs"])
|
|
2270
|
+
def test_not_accepted_on_other_transaction_lists(self, method):
|
|
2271
|
+
with pytest.raises(TypeError, match="commercial_item_acquisition_procedures"):
|
|
2272
|
+
getattr(TangoClient(api_key="test-key"), method)(
|
|
2273
|
+
commercial_item_acquisition_procedures="E"
|
|
2274
|
+
)
|
|
2275
|
+
|
|
2276
|
+
|
|
2250
2277
|
class TestAgencyFilterDiagnostics:
|
|
2251
2278
|
"""`meta` from the API's agency-filter diagnostics.
|
|
2252
2279
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestAgenciesIntegration.test_get_agency
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestNaicsIntegration.test_list_naics
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestOTAsIntegration.test_get_ota
RENAMED
|
File without changes
|
{tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestOTAsIntegration.test_list_otas
RENAMED
|
File without changes
|
{tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestOTIDVsIntegration.test_get_otidv
RENAMED
|
File without changes
|
{tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestOTIDVsIntegration.test_list_otidvs
RENAMED
|
File without changes
|
{tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestOfficesIntegration.test_get_office
RENAMED
|
File without changes
|
{tango_python-1.16.0 → tango_python-1.17.0}/tests/cassettes/TestOfficesIntegration.test_list_offices
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_edge_cases_integration.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_itdashboard_integration.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_opportunities_integration.py
RENAMED
|
File without changes
|
{tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_organizations_integration.py
RENAMED
|
File without changes
|
{tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_otas_otidvs_integration.py
RENAMED
|
File without changes
|
|
File without changes
|
{tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_reference_data_integration.py
RENAMED
|
File without changes
|
|
File without changes
|
{tango_python-1.16.0 → tango_python-1.17.0}/tests/integration/test_vehicles_idvs_integration.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|