tango-python 0.4.0__tar.gz → 0.4.1__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.0 → tango_python-0.4.1}/CHANGELOG.md +8 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/PKG-INFO +1 -1
- {tango_python-0.4.0 → tango_python-0.4.1}/pyproject.toml +1 -1
- {tango_python-0.4.0 → tango_python-0.4.1}/scripts/check_filter_shape_conformance.py +24 -19
- {tango_python-0.4.0 → tango_python-0.4.1}/tango/__init__.py +3 -1
- {tango_python-0.4.0 → tango_python-0.4.1}/tango/client.py +458 -151
- {tango_python-0.4.0 → tango_python-0.4.1}/tango/models.py +18 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tango/shapes/explicit_schemas.py +39 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/uv.lock +1 -1
- {tango_python-0.4.0 → tango_python-0.4.1}/.env.example +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/.github/workflows/lint.yml +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/.github/workflows/publish.yml +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/.github/workflows/test.yml +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/.gitignore +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/LICENSE +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/README.md +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/ROADMAP.md +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/docs/API_REFERENCE.md +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/docs/DEVELOPERS.md +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/docs/SHAPES.md +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/docs/quick_start.ipynb +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/scripts/README.md +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/scripts/fetch_api_schema.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/scripts/generate_schemas_from_api.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/scripts/pr_review.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/scripts/test_production.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tango/exceptions.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tango/shapes/__init__.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tango/shapes/factory.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tango/shapes/generator.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tango/shapes/models.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tango/shapes/parser.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tango/shapes/schema.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tango/shapes/types.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/__init__.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestAgenciesIntegration.test_get_agency +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestAgenciesIntegration.test_list_agencies +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestAssistanceIntegration.test_list_assistance +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestBusinessTypesIntegration.test_business_type_field_type_validation +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestBusinessTypesIntegration.test_business_type_parsing_consistency +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestBusinessTypesIntegration.test_list_business_types +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestContractsIntegration.test_combined_filters_work_together +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestContractsIntegration.test_contract_cursor_pagination +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestContractsIntegration.test_contract_data_object_parsing +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestContractsIntegration.test_contract_field_types +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestContractsIntegration.test_filter_parameter_mappings[keyword-software] +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestContractsIntegration.test_filter_parameter_mappings[psc_code-R425] +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_awarding_agency_filter +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_date_range_filter +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_flat +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_naics_code_filter +0 -0
- {tango_python-0.4.0 → 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 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[default-None] +0 -0
- {tango_python-0.4.0 → 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 -0
- {tango_python-0.4.0 → 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 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestContractsIntegration.test_new_expiring_filters +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestContractsIntegration.test_new_fiscal_year_range_filters +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestContractsIntegration.test_new_identifier_filters +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestContractsIntegration.test_search_contracts_with_filters +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestContractsIntegration.test_search_filters_object_with_new_parameters +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestContractsIntegration.test_sort_and_order_mapped_to_ordering[asc-] +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestContractsIntegration.test_sort_and_order_mapped_to_ordering[desc--] +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestEdgeCasesIntegration.test_api_schema_stability_detection_contracts +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestEdgeCasesIntegration.test_api_schema_stability_detection_entities +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestEdgeCasesIntegration.test_date_field_parsing_edge_cases +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestEdgeCasesIntegration.test_decimal_field_parsing_edge_cases +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestEdgeCasesIntegration.test_empty_list_responses +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestEdgeCasesIntegration.test_entity_parsing_with_various_address_formats +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestEdgeCasesIntegration.test_flattened_responses_with_flat_lists +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestEdgeCasesIntegration.test_list_field_parsing_consistency +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestEdgeCasesIntegration.test_parsing_nested_objects_with_missing_data +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestEdgeCasesIntegration.test_parsing_null_missing_fields_in_contracts +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestEdgeCasesIntegration.test_parsing_with_minimal_shape_sparse_data +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestEntitiesIntegration.test_entity_field_types +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestEntitiesIntegration.test_entity_location_parsing +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestEntitiesIntegration.test_entity_parsing_with_business_types +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestEntitiesIntegration.test_entity_with_various_identifiers +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestEntitiesIntegration.test_get_entity_by_uei +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_flat +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_search +0 -0
- {tango_python-0.4.0 → 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 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[custom-uei,legal_business_name,cage_code] +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[minimal-uei,legal_business_name,cage_code,business_types] +0 -0
- {tango_python-0.4.0 → 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 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestForecastsIntegration.test_forecast_field_types +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[custom-id,title,anticipated_award_date] +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[default-None] +0 -0
- {tango_python-0.4.0 → 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 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[minimal-id,title,anticipated_award_date,fiscal_year,naics_code,status] +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestGrantsIntegration.test_grant_field_types +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestGrantsIntegration.test_grant_pagination +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[custom-grant_id,title,opportunity_number] +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[default-None] +0 -0
- {tango_python-0.4.0 → 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 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[minimal-grant_id,opportunity_number,title,status(-),agency_code] +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestIDVsIntegration.test_get_idv_summary +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestIDVsIntegration.test_get_idv_uses_default_shape +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestIDVsIntegration.test_list_idv_awards_uses_default_shape +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestIDVsIntegration.test_list_idv_child_idvs_uses_default_shape +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestIDVsIntegration.test_list_idv_summary_awards +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestIDVsIntegration.test_list_idv_transactions +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestIDVsIntegration.test_list_idvs_uses_default_shape_and_keyset_params +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestNaicsIntegration.test_list_naics +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[custom-notice_id,title,solicitation_number] +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[default-None] +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/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-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[minimal-notice_id,title,solicitation_number,posted_date] +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestNoticesIntegration.test_notice_field_types +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestNoticesIntegration.test_notice_pagination +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestNoticesIntegration.test_notice_with_meta_fields +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestOTAsIntegration.test_get_ota +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestOTAsIntegration.test_list_otas +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestOTIDVsIntegration.test_get_otidv +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestOTIDVsIntegration.test_list_otidvs +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestOfficesIntegration.test_get_office +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestOfficesIntegration.test_list_offices +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[custom-opportunity_id,title,solicitation_number] +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[default-None] +0 -0
- {tango_python-0.4.0 → 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 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[minimal-opportunity_id,title,solicitation_number,response_deadline,active] +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestOpportunitiesIntegration.test_opportunity_field_types +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestOrganizationsIntegration.test_get_organization +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestOrganizationsIntegration.test_list_organizations +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestProductionSmokeWithCassettes.test_contract_cursor_pagination +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestSubawardsIntegration.test_list_subawards +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestTypeHintsIntegration.test_contracts_dict_access[custom-key,piid,description] +0 -0
- {tango_python-0.4.0 → 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 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestTypeHintsIntegration.test_contracts_dict_access[ultra_minimal-key,piid,recipient(display_name),total_contract_value] +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestTypeHintsIntegration.test_entities_dict_access[minimal-uei,legal_business_name,cage_code,business_types] +0 -0
- {tango_python-0.4.0 → 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 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/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-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestTypeHintsIntegration.test_notices_dict_access[minimal-notice_id,title,solicitation_number,posted_date] +0 -0
- {tango_python-0.4.0 → 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 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestTypeHintsIntegration.test_opportunities_dict_access[minimal-opportunity_id,title,solicitation_number,response_deadline,active] +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestVehiclesIntegration.test_get_vehicle_supports_joiner_and_flat_lists +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestVehiclesIntegration.test_list_vehicle_awardees_uses_default_shape +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/cassettes/TestVehiclesIntegration.test_list_vehicles_uses_default_shape_and_search +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/conftest.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/integration/README.md +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/integration/__init__.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/integration/conftest.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/integration/test_agencies_integration.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/integration/test_assistance_integration.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/integration/test_contracts_integration.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/integration/test_edge_cases_integration.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/integration/test_entities_integration.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/integration/test_forecasts_integration.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/integration/test_grants_integration.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/integration/test_naics_integration.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/integration/test_notices_integration.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/integration/test_offices_integration.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/integration/test_opportunities_integration.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/integration/test_organizations_integration.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/integration/test_otas_otidvs_integration.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/integration/test_reference_data_integration.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/integration/test_subawards_integration.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/integration/test_vehicles_idvs_integration.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/integration/validation.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/production/__init__.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/production/conftest.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/production/test_production_smoke.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/test_client.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/test_models.py +0 -0
- {tango_python-0.4.0 → tango_python-0.4.1}/tests/test_shapes.py +0 -0
|
@@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.4.1] - 2026-03-03
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- GSA eLibrary contracts: `list_gsa_elibrary_contracts`, `get_gsa_elibrary_contract` with shaping and filter params (`contract_number`, `key`, `piid`, `schedule`, `search`, `sin`, `uei`).
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
- Conformance: replaced `**kwargs`/`**filters` with explicit filter parameters on `list_contracts`, `list_idvs`, `list_entities`, `list_forecasts`, `list_grants`, `list_notices`, `list_opportunities` for full filter/shape conformance. Backward compatibility preserved for `list_contracts(filters=SearchFilters(...))`.
|
|
17
|
+
|
|
10
18
|
## [0.4.0] - 2026-02-24
|
|
11
19
|
|
|
12
20
|
### Added
|
|
@@ -21,7 +21,7 @@ import argparse
|
|
|
21
21
|
import ast
|
|
22
22
|
import json
|
|
23
23
|
from pathlib import Path
|
|
24
|
-
from typing import Any
|
|
24
|
+
from typing import Any
|
|
25
25
|
|
|
26
26
|
REPO_ROOT = Path(__file__).resolve().parents[1]
|
|
27
27
|
CLIENT_PATH = REPO_ROOT / "tango" / "client.py"
|
|
@@ -49,32 +49,34 @@ RESOURCE_TO_METHOD: dict[str, str] = {
|
|
|
49
49
|
"entities": "list_entities",
|
|
50
50
|
"agencies": "list_agencies",
|
|
51
51
|
"naics": "list_naics",
|
|
52
|
+
"gsa_elibrary_contracts": "list_gsa_elibrary_contracts",
|
|
52
53
|
# Resources not yet implemented in SDK
|
|
53
54
|
"assistance": None,
|
|
54
55
|
"offices": None,
|
|
55
56
|
}
|
|
56
57
|
|
|
57
58
|
|
|
58
|
-
def get_shape_config_entries() -> list[tuple[str, str,
|
|
59
|
+
def get_shape_config_entries() -> list[tuple[str, str, type[Any]]]:
|
|
59
60
|
"""Return (shape_name, shape_string, model_class) for every ShapeConfig constant."""
|
|
60
61
|
from tango.models import (
|
|
62
|
+
IDV,
|
|
63
|
+
OTA,
|
|
64
|
+
OTIDV,
|
|
61
65
|
Contract,
|
|
62
66
|
Entity,
|
|
63
67
|
Forecast,
|
|
64
68
|
Grant,
|
|
65
|
-
|
|
69
|
+
GsaElibraryContract,
|
|
66
70
|
Notice,
|
|
67
|
-
OTA,
|
|
68
|
-
Organization,
|
|
69
71
|
Opportunity,
|
|
70
|
-
|
|
72
|
+
Organization,
|
|
71
73
|
ShapeConfig,
|
|
72
74
|
Subaward,
|
|
73
75
|
Vehicle,
|
|
74
76
|
)
|
|
75
77
|
|
|
76
78
|
# ShapeConfig constant name -> (shape string, model class for validation)
|
|
77
|
-
entries: list[tuple[str, str,
|
|
79
|
+
entries: list[tuple[str, str, type[Any]]] = []
|
|
78
80
|
configs = [
|
|
79
81
|
("CONTRACTS_MINIMAL", ShapeConfig.CONTRACTS_MINIMAL, Contract),
|
|
80
82
|
("ENTITIES_MINIMAL", ShapeConfig.ENTITIES_MINIMAL, Entity),
|
|
@@ -92,6 +94,11 @@ def get_shape_config_entries() -> list[tuple[str, str, Type[Any]]]:
|
|
|
92
94
|
("OTAS_MINIMAL", ShapeConfig.OTAS_MINIMAL, OTA),
|
|
93
95
|
("OTIDVS_MINIMAL", ShapeConfig.OTIDVS_MINIMAL, OTIDV),
|
|
94
96
|
("SUBAWARDS_MINIMAL", ShapeConfig.SUBAWARDS_MINIMAL, Subaward),
|
|
97
|
+
(
|
|
98
|
+
"GSA_ELIBRARY_CONTRACTS_MINIMAL",
|
|
99
|
+
ShapeConfig.GSA_ELIBRARY_CONTRACTS_MINIMAL,
|
|
100
|
+
GsaElibraryContract,
|
|
101
|
+
),
|
|
95
102
|
]
|
|
96
103
|
for name, shape_str, model_cls in configs:
|
|
97
104
|
entries.append((name, shape_str, model_cls))
|
|
@@ -166,16 +173,12 @@ def run_check(manifest_path: Path) -> tuple[list[str], list[str]]:
|
|
|
166
173
|
# Explicitly marked as not implemented
|
|
167
174
|
runtime_filters = payload.get("runtime", {}).get("filter_params", [])
|
|
168
175
|
if runtime_filters:
|
|
169
|
-
warnings.append(
|
|
170
|
-
f"{resource_name}: no SDK method implemented for this resource"
|
|
171
|
-
)
|
|
176
|
+
warnings.append(f"{resource_name}: no SDK method implemented for this resource")
|
|
172
177
|
continue
|
|
173
178
|
|
|
174
179
|
if sdk_method not in methods:
|
|
175
180
|
# Method mapped but not found in client.py
|
|
176
|
-
errors.append(
|
|
177
|
-
f"{resource_name}: mapped method `{sdk_method}` not found in SDK client"
|
|
178
|
-
)
|
|
181
|
+
errors.append(f"{resource_name}: mapped method `{sdk_method}` not found in SDK client")
|
|
179
182
|
continue
|
|
180
183
|
|
|
181
184
|
runtime_filters = set(payload.get("runtime", {}).get("filter_params", []))
|
|
@@ -212,12 +215,14 @@ def get_unmapped_resources(manifest_path: Path) -> list[dict[str, Any]]:
|
|
|
212
215
|
# Check if unmapped or method doesn't exist
|
|
213
216
|
if sdk_method is None or sdk_method not in methods:
|
|
214
217
|
runtime = payload.get("runtime", {}) or {}
|
|
215
|
-
unmapped.append(
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
218
|
+
unmapped.append(
|
|
219
|
+
{
|
|
220
|
+
"resource": resource_name,
|
|
221
|
+
"expected_method": sdk_method,
|
|
222
|
+
"filter_params": runtime.get("filter_params", []),
|
|
223
|
+
"pagination_class": (runtime.get("pagination") or {}).get("class", ""),
|
|
224
|
+
}
|
|
225
|
+
)
|
|
221
226
|
return unmapped
|
|
222
227
|
|
|
223
228
|
|
|
@@ -9,6 +9,7 @@ from .exceptions import (
|
|
|
9
9
|
TangoValidationError,
|
|
10
10
|
)
|
|
11
11
|
from .models import (
|
|
12
|
+
GsaElibraryContract,
|
|
12
13
|
PaginatedResponse,
|
|
13
14
|
SearchFilters,
|
|
14
15
|
ShapeConfig,
|
|
@@ -26,7 +27,7 @@ from .shapes import (
|
|
|
26
27
|
TypeGenerator,
|
|
27
28
|
)
|
|
28
29
|
|
|
29
|
-
__version__ = "0.4.
|
|
30
|
+
__version__ = "0.4.1"
|
|
30
31
|
__all__ = [
|
|
31
32
|
"TangoClient",
|
|
32
33
|
"TangoAPIError",
|
|
@@ -34,6 +35,7 @@ __all__ = [
|
|
|
34
35
|
"TangoNotFoundError",
|
|
35
36
|
"TangoValidationError",
|
|
36
37
|
"TangoRateLimitError",
|
|
38
|
+
"GsaElibraryContract",
|
|
37
39
|
"PaginatedResponse",
|
|
38
40
|
"SearchFilters",
|
|
39
41
|
"ShapeConfig",
|