tango-python 1.5.0__tar.gz → 1.5.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.
Files changed (205) hide show
  1. {tango_python-1.5.0 → tango_python-1.5.1}/CHANGELOG.md +8 -0
  2. {tango_python-1.5.0 → tango_python-1.5.1}/PKG-INFO +1 -1
  3. {tango_python-1.5.0 → tango_python-1.5.1}/docs/API_REFERENCE.md +1 -1
  4. {tango_python-1.5.0 → tango_python-1.5.1}/pyproject.toml +3 -2
  5. {tango_python-1.5.0 → tango_python-1.5.1}/tango/__init__.py +1 -1
  6. {tango_python-1.5.0 → tango_python-1.5.1}/tango/client.py +1 -1
  7. {tango_python-1.5.0 → tango_python-1.5.1}/tests/test_client.py +16 -0
  8. tango_python-1.5.0/.github/workflows/docs-dispatch.yml +0 -58
  9. tango_python-1.5.0/.github/workflows/lint.yml +0 -110
  10. tango_python-1.5.0/.github/workflows/publish.yml +0 -29
  11. tango_python-1.5.0/.github/workflows/test.yml +0 -44
  12. {tango_python-1.5.0 → tango_python-1.5.1}/.gitignore +0 -0
  13. {tango_python-1.5.0 → tango_python-1.5.1}/LICENSE +0 -0
  14. {tango_python-1.5.0 → tango_python-1.5.1}/README.md +0 -0
  15. {tango_python-1.5.0 → tango_python-1.5.1}/docs/CLIENT.md +0 -0
  16. {tango_python-1.5.0 → tango_python-1.5.1}/docs/DYNAMIC_MODELS.md +0 -0
  17. {tango_python-1.5.0 → tango_python-1.5.1}/docs/ERRORS.md +0 -0
  18. {tango_python-1.5.0 → tango_python-1.5.1}/docs/PAGINATION.md +0 -0
  19. {tango_python-1.5.0 → tango_python-1.5.1}/docs/SHAPES.md +0 -0
  20. {tango_python-1.5.0 → tango_python-1.5.1}/docs/WEBHOOKS.md +0 -0
  21. {tango_python-1.5.0 → tango_python-1.5.1}/scripts/README.md +0 -0
  22. {tango_python-1.5.0 → tango_python-1.5.1}/scripts/check_filter_shape_conformance.py +0 -0
  23. {tango_python-1.5.0 → tango_python-1.5.1}/scripts/check_shape_coverage.py +0 -0
  24. {tango_python-1.5.0 → tango_python-1.5.1}/scripts/fetch_api_schema.py +0 -0
  25. {tango_python-1.5.0 → tango_python-1.5.1}/scripts/generate_schemas_from_api.py +0 -0
  26. {tango_python-1.5.0 → tango_python-1.5.1}/scripts/generate_shape_overlay.py +0 -0
  27. {tango_python-1.5.0 → tango_python-1.5.1}/scripts/pr_review.py +0 -0
  28. {tango_python-1.5.0 → tango_python-1.5.1}/scripts/probe_shape_types.py +0 -0
  29. {tango_python-1.5.0 → tango_python-1.5.1}/scripts/refresh_contract.py +0 -0
  30. {tango_python-1.5.0 → tango_python-1.5.1}/scripts/smoke_api_parity.py +0 -0
  31. {tango_python-1.5.0 → tango_python-1.5.1}/scripts/test_production.py +0 -0
  32. {tango_python-1.5.0 → tango_python-1.5.1}/tango/exceptions.py +0 -0
  33. {tango_python-1.5.0 → tango_python-1.5.1}/tango/models.py +0 -0
  34. {tango_python-1.5.0 → tango_python-1.5.1}/tango/shapes/__init__.py +0 -0
  35. {tango_python-1.5.0 → tango_python-1.5.1}/tango/shapes/explicit_schemas.py +0 -0
  36. {tango_python-1.5.0 → tango_python-1.5.1}/tango/shapes/factory.py +0 -0
  37. {tango_python-1.5.0 → tango_python-1.5.1}/tango/shapes/generated_overlay.py +0 -0
  38. {tango_python-1.5.0 → tango_python-1.5.1}/tango/shapes/generator.py +0 -0
  39. {tango_python-1.5.0 → tango_python-1.5.1}/tango/shapes/models.py +0 -0
  40. {tango_python-1.5.0 → tango_python-1.5.1}/tango/shapes/parser.py +0 -0
  41. {tango_python-1.5.0 → tango_python-1.5.1}/tango/shapes/schema.py +0 -0
  42. {tango_python-1.5.0 → tango_python-1.5.1}/tango/shapes/types.py +0 -0
  43. {tango_python-1.5.0 → tango_python-1.5.1}/tango/webhooks/__init__.py +0 -0
  44. {tango_python-1.5.0 → tango_python-1.5.1}/tango/webhooks/cli.py +0 -0
  45. {tango_python-1.5.0 → tango_python-1.5.1}/tango/webhooks/receiver.py +0 -0
  46. {tango_python-1.5.0 → tango_python-1.5.1}/tango/webhooks/signing.py +0 -0
  47. {tango_python-1.5.0 → tango_python-1.5.1}/tango/webhooks/simulate.py +0 -0
  48. {tango_python-1.5.0 → tango_python-1.5.1}/tests/__init__.py +0 -0
  49. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestAgenciesIntegration.test_get_agency +0 -0
  50. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestAgenciesIntegration.test_list_agencies +0 -0
  51. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestBusinessTypesIntegration.test_business_type_field_type_validation +0 -0
  52. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestBusinessTypesIntegration.test_business_type_parsing_consistency +0 -0
  53. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestBusinessTypesIntegration.test_list_business_types +0 -0
  54. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestContractsIntegration.test_combined_filters_work_together +0 -0
  55. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestContractsIntegration.test_contract_cursor_pagination +0 -0
  56. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestContractsIntegration.test_contract_data_object_parsing +0 -0
  57. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestContractsIntegration.test_contract_field_types +0 -0
  58. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestContractsIntegration.test_filter_parameter_mappings[keyword-software] +0 -0
  59. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestContractsIntegration.test_filter_parameter_mappings[psc_code-R425] +0 -0
  60. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_awarding_agency_filter +0 -0
  61. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_date_range_filter +0 -0
  62. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_flat +0 -0
  63. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_naics_code_filter +0 -0
  64. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[custom-key,piid,recipient(display_name),total_contract_value,award_date] +0 -0
  65. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[default-None] +0 -0
  66. {tango_python-1.5.0 → tango_python-1.5.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
  67. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[minimal-key,piid,award_date,recipient(display_name),description,total_contract_value] +0 -0
  68. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestContractsIntegration.test_new_expiring_filters +0 -0
  69. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestContractsIntegration.test_new_fiscal_year_range_filters +0 -0
  70. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestContractsIntegration.test_new_identifier_filters +0 -0
  71. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestContractsIntegration.test_search_contracts_with_filters +0 -0
  72. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestContractsIntegration.test_search_filters_object_with_new_parameters +0 -0
  73. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestContractsIntegration.test_sort_and_order_mapped_to_ordering[asc-] +0 -0
  74. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestContractsIntegration.test_sort_and_order_mapped_to_ordering[desc--] +0 -0
  75. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestEdgeCasesIntegration.test_api_schema_stability_detection_contracts +0 -0
  76. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestEdgeCasesIntegration.test_api_schema_stability_detection_entities +0 -0
  77. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestEdgeCasesIntegration.test_date_field_parsing_edge_cases +0 -0
  78. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestEdgeCasesIntegration.test_decimal_field_parsing_edge_cases +0 -0
  79. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestEdgeCasesIntegration.test_empty_list_responses +0 -0
  80. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestEdgeCasesIntegration.test_entity_parsing_with_various_address_formats +0 -0
  81. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestEdgeCasesIntegration.test_flattened_responses_with_flat_lists +0 -0
  82. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestEdgeCasesIntegration.test_list_field_parsing_consistency +0 -0
  83. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestEdgeCasesIntegration.test_parsing_nested_objects_with_missing_data +0 -0
  84. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestEdgeCasesIntegration.test_parsing_null_missing_fields_in_contracts +0 -0
  85. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestEdgeCasesIntegration.test_parsing_with_minimal_shape_sparse_data +0 -0
  86. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestEntitiesIntegration.test_entity_field_types +0 -0
  87. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestEntitiesIntegration.test_entity_location_parsing +0 -0
  88. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestEntitiesIntegration.test_entity_parsing_with_business_types +0 -0
  89. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestEntitiesIntegration.test_entity_with_various_identifiers +0 -0
  90. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestEntitiesIntegration.test_get_entity_budget_flows +0 -0
  91. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestEntitiesIntegration.test_get_entity_by_uei +0 -0
  92. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_flat +0 -0
  93. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_search +0 -0
  94. {tango_python-1.5.0 → tango_python-1.5.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...1603a7d52e211cf2b3bc7d32080238aa +0 -0
  95. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[custom-uei,legal_business_name,cage_code] +0 -0
  96. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[minimal-uei,legal_business_name,cage_code,business_types] +0 -0
  97. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[with_address-uei,legal_business_name,cage_code,business_types,physical_address] +0 -0
  98. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestForecastsIntegration.test_forecast_field_types +0 -0
  99. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[custom-id,title,anticipated_award_date] +0 -0
  100. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[default-None] +0 -0
  101. {tango_python-1.5.0 → tango_python-1.5.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
  102. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[minimal-id,title,anticipated_award_date,fiscal_year,naics_code,status] +0 -0
  103. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestGrantsIntegration.test_grant_field_types +0 -0
  104. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestGrantsIntegration.test_grant_pagination +0 -0
  105. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[custom-grant_id,title,opportunity_number] +0 -0
  106. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[default-None] +0 -0
  107. {tango_python-1.5.0 → tango_python-1.5.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
  108. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[minimal-grant_id,opportunity_number,title,status(-),agency_code] +0 -0
  109. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestIDVsIntegration.test_get_idv_uses_default_shape +0 -0
  110. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestIDVsIntegration.test_list_idv_awards_uses_default_shape +0 -0
  111. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestIDVsIntegration.test_list_idv_child_idvs_uses_default_shape +0 -0
  112. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestIDVsIntegration.test_list_idv_transactions +0 -0
  113. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestIDVsIntegration.test_list_idvs_uses_default_shape_and_keyset_params +0 -0
  114. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestITDashboardIntegration.test_filter_by_agency_code +0 -0
  115. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestITDashboardIntegration.test_filter_by_agency_name_text +0 -0
  116. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestITDashboardIntegration.test_filter_by_cio_rating +0 -0
  117. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestITDashboardIntegration.test_filter_by_cio_rating_max +0 -0
  118. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestITDashboardIntegration.test_filter_by_performance_risk +0 -0
  119. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestITDashboardIntegration.test_filter_by_type_of_investment +0 -0
  120. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestITDashboardIntegration.test_filter_by_updated_time_range +0 -0
  121. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestITDashboardIntegration.test_funding_and_cio_evaluation_expansions +0 -0
  122. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestITDashboardIntegration.test_get_itdashboard_investment_by_uii +0 -0
  123. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestITDashboardIntegration.test_itdashboard_pagination +0 -0
  124. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestITDashboardIntegration.test_list_itdashboard_investments_with_search +0 -0
  125. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestITDashboardIntegration.test_list_itdashboard_investments_with_shapes[custom-uii,agency_name,investment_title,updated_time] +0 -0
  126. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestITDashboardIntegration.test_list_itdashboard_investments_with_shapes[default-None] +0 -0
  127. {tango_python-1.5.0 → tango_python-1.5.1}/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
  128. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestNaicsIntegration.test_list_naics +0 -0
  129. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[custom-notice_id,title,solicitation_number] +0 -0
  130. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[default-None] +0 -0
  131. {tango_python-1.5.0 → tango_python-1.5.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
  132. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[minimal-notice_id,title,solicitation_number,posted_date] +0 -0
  133. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestNoticesIntegration.test_notice_field_types +0 -0
  134. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestNoticesIntegration.test_notice_pagination +0 -0
  135. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestNoticesIntegration.test_notice_with_meta_fields +0 -0
  136. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestOTAsIntegration.test_get_ota +0 -0
  137. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestOTAsIntegration.test_list_otas +0 -0
  138. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestOTIDVsIntegration.test_get_otidv +0 -0
  139. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestOTIDVsIntegration.test_list_otidvs +0 -0
  140. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestOfficesIntegration.test_get_office +0 -0
  141. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestOfficesIntegration.test_list_offices +0 -0
  142. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[custom-opportunity_id,title,solicitation_number] +0 -0
  143. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[default-None] +0 -0
  144. {tango_python-1.5.0 → tango_python-1.5.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
  145. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[minimal-opportunity_id,title,solicitation_number,response_deadline,active] +0 -0
  146. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestOpportunitiesIntegration.test_opportunity_field_types +0 -0
  147. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestOrganizationsIntegration.test_get_organization +0 -0
  148. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestOrganizationsIntegration.test_list_organizations +0 -0
  149. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestProtestsIntegration.test_get_protest_by_case_id +0 -0
  150. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestProtestsIntegration.test_list_protests_with_filter +0 -0
  151. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestProtestsIntegration.test_list_protests_with_shapes[custom-case_id,title,source_system,outcome] +0 -0
  152. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestProtestsIntegration.test_list_protests_with_shapes[default-None] +0 -0
  153. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestProtestsIntegration.test_list_protests_with_shapes[minimal-case_id,case_number,title,source_system,outcome,filed_date] +0 -0
  154. {tango_python-1.5.0 → tango_python-1.5.1}/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
  155. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestProtestsIntegration.test_protest_pagination +0 -0
  156. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestSubawardsIntegration.test_list_subawards +0 -0
  157. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestTypeHintsIntegration.test_contracts_dict_access[custom-key,piid,description] +0 -0
  158. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestTypeHintsIntegration.test_contracts_dict_access[minimal-key,piid,award_date,recipient(display_name),description,total_contract_value] +0 -0
  159. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestTypeHintsIntegration.test_contracts_dict_access[ultra_minimal-key,piid,recipient(display_name),total_contract_value] +0 -0
  160. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestTypeHintsIntegration.test_entities_dict_access[minimal-uei,legal_business_name,cage_code,business_types] +0 -0
  161. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestTypeHintsIntegration.test_entities_dict_access[with_address-uei,legal_business_name,cage_code,business_types,physical_address] +0 -0
  162. {tango_python-1.5.0 → tango_python-1.5.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
  163. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestTypeHintsIntegration.test_notices_dict_access[minimal-notice_id,title,solicitation_number,posted_date] +0 -0
  164. {tango_python-1.5.0 → tango_python-1.5.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
  165. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestTypeHintsIntegration.test_opportunities_dict_access[minimal-opportunity_id,title,solicitation_number,response_deadline,active] +0 -0
  166. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestVehiclesIntegration.test_get_vehicle_supports_joiner_and_flat_lists +0 -0
  167. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestVehiclesIntegration.test_get_vehicle_with_metrics_expansion +0 -0
  168. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestVehiclesIntegration.test_list_vehicle_awardees_uses_default_shape +0 -0
  169. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestVehiclesIntegration.test_list_vehicle_orders_uses_default_shape +0 -0
  170. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestVehiclesIntegration.test_list_vehicles_uses_default_shape_and_search +0 -0
  171. {tango_python-1.5.0 → tango_python-1.5.1}/tests/cassettes/TestVehiclesIntegration.test_list_vehicles_with_ordering +0 -0
  172. {tango_python-1.5.0 → tango_python-1.5.1}/tests/conftest.py +0 -0
  173. {tango_python-1.5.0 → tango_python-1.5.1}/tests/integration/README.md +0 -0
  174. {tango_python-1.5.0 → tango_python-1.5.1}/tests/integration/__init__.py +0 -0
  175. {tango_python-1.5.0 → tango_python-1.5.1}/tests/integration/conftest.py +0 -0
  176. {tango_python-1.5.0 → tango_python-1.5.1}/tests/integration/test_agencies_integration.py +0 -0
  177. {tango_python-1.5.0 → tango_python-1.5.1}/tests/integration/test_contracts_integration.py +0 -0
  178. {tango_python-1.5.0 → tango_python-1.5.1}/tests/integration/test_edge_cases_integration.py +0 -0
  179. {tango_python-1.5.0 → tango_python-1.5.1}/tests/integration/test_entities_integration.py +0 -0
  180. {tango_python-1.5.0 → tango_python-1.5.1}/tests/integration/test_forecasts_integration.py +0 -0
  181. {tango_python-1.5.0 → tango_python-1.5.1}/tests/integration/test_grants_integration.py +0 -0
  182. {tango_python-1.5.0 → tango_python-1.5.1}/tests/integration/test_itdashboard_integration.py +0 -0
  183. {tango_python-1.5.0 → tango_python-1.5.1}/tests/integration/test_naics_integration.py +0 -0
  184. {tango_python-1.5.0 → tango_python-1.5.1}/tests/integration/test_notices_integration.py +0 -0
  185. {tango_python-1.5.0 → tango_python-1.5.1}/tests/integration/test_offices_integration.py +0 -0
  186. {tango_python-1.5.0 → tango_python-1.5.1}/tests/integration/test_opportunities_integration.py +0 -0
  187. {tango_python-1.5.0 → tango_python-1.5.1}/tests/integration/test_organizations_integration.py +0 -0
  188. {tango_python-1.5.0 → tango_python-1.5.1}/tests/integration/test_otas_otidvs_integration.py +0 -0
  189. {tango_python-1.5.0 → tango_python-1.5.1}/tests/integration/test_protests_integration.py +0 -0
  190. {tango_python-1.5.0 → tango_python-1.5.1}/tests/integration/test_reference_data_integration.py +0 -0
  191. {tango_python-1.5.0 → tango_python-1.5.1}/tests/integration/test_subawards_integration.py +0 -0
  192. {tango_python-1.5.0 → tango_python-1.5.1}/tests/integration/test_vehicles_idvs_integration.py +0 -0
  193. {tango_python-1.5.0 → tango_python-1.5.1}/tests/integration/validation.py +0 -0
  194. {tango_python-1.5.0 → tango_python-1.5.1}/tests/production/__init__.py +0 -0
  195. {tango_python-1.5.0 → tango_python-1.5.1}/tests/production/conftest.py +0 -0
  196. {tango_python-1.5.0 → tango_python-1.5.1}/tests/production/test_production_smoke.py +0 -0
  197. {tango_python-1.5.0 → tango_python-1.5.1}/tests/test_api_parity.py +0 -0
  198. {tango_python-1.5.0 → tango_python-1.5.1}/tests/test_dibbs_exclusions_sbir.py +0 -0
  199. {tango_python-1.5.0 → tango_python-1.5.1}/tests/test_models.py +0 -0
  200. {tango_python-1.5.0 → tango_python-1.5.1}/tests/test_shape_coverage_gate.py +0 -0
  201. {tango_python-1.5.0 → tango_python-1.5.1}/tests/test_shapes.py +0 -0
  202. {tango_python-1.5.0 → tango_python-1.5.1}/tests/test_webhooks_cli.py +0 -0
  203. {tango_python-1.5.0 → tango_python-1.5.1}/tests/test_webhooks_receiver.py +0 -0
  204. {tango_python-1.5.0 → tango_python-1.5.1}/tests/test_webhooks_signing.py +0 -0
  205. {tango_python-1.5.0 → tango_python-1.5.1}/tests/test_webhooks_simulate.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
+ ## [1.5.1] - 2026-08-10
11
+
12
+ ### Documentation
13
+ - Documented (and pinned with tests) the OR syntax `list_entities(socioeconomic=...)` has always supported: pipe-separated values match entities holding any of the listed designations, e.g. `socioeconomic="OY|A2"`; values are SAM business-type codes (e.g. `OY` Black American Owned, `A6` SBA-certified 8(a), `A2` Woman Owned), not set-aside codes.
14
+
15
+ ### Changed
16
+ - The sdist no longer packages `.github/workflows`, so CI-only commits stop changing the sdist hash. ([#58](https://github.com/makegov/tango-python/pull/58))
17
+
10
18
  ## [1.5.0] - 2026-08-04
11
19
 
12
20
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tango-python
3
- Version: 1.5.0
3
+ Version: 1.5.1
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
@@ -713,7 +713,7 @@ entities = client.list_entities(
713
713
  - `name` - Filter by entity name
714
714
  - `psc` - Filter by PSC code
715
715
  - `purpose_of_registration_code` - Filter by registration purpose
716
- - `socioeconomic` - Filter by socioeconomic status
716
+ - `socioeconomic` - Filter by socioeconomic status; takes SAM business-type codes (e.g. `OY` Black American Owned, `A6` SBA-certified 8(a), `A2` Woman Owned — see `GET /api/business_types/`), not set-aside codes; accepts pipe-separated values for OR semantics, e.g. `socioeconomic="OY|A2"`
717
717
  - `state` - Filter by state
718
718
  - `total_awards_obligated_gte` / `total_awards_obligated_lte` - Obligation amount range
719
719
  - `uei` - Filter by UEI
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "tango-python"
7
- version = "1.5.0"
7
+ version = "1.5.1"
8
8
  description = "Python SDK for the Tango API"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -126,13 +126,14 @@ packages = ["tango"]
126
126
  # diaries, scratch reports, etc.) when anyone runs `uv publish` locally.
127
127
  # The explicit whitelist is belt-and-suspenders for that foot-gun: even
128
128
  # from a developer laptop, only these paths can ever end up on PyPI.
129
+ #
130
+ # `.github/workflows` is excluded on purpose: shipping it moves the sdist hash on every CI-only commit, which breaks `--check-url`.
129
131
  [tool.hatch.build.targets.sdist]
130
132
  include = [
131
133
  "/tango",
132
134
  "/tests",
133
135
  "/docs",
134
136
  "/scripts",
135
- "/.github/workflows",
136
137
  "/README.md",
137
138
  "/LICENSE",
138
139
  "/CHANGELOG.md",
@@ -50,7 +50,7 @@ from .webhooks import (
50
50
  )
51
51
  from .webhooks.receiver import Delivery, WebhookReceiver
52
52
 
53
- __version__ = "1.5.0"
53
+ __version__ = "1.5.1"
54
54
  __all__ = [
55
55
  "TangoClient",
56
56
  "TangoAPIError",
@@ -2081,7 +2081,7 @@ class TangoClient:
2081
2081
  name: Entity name filter
2082
2082
  psc: PSC code filter
2083
2083
  purpose_of_registration_code: Purpose of registration code
2084
- socioeconomic: Socioeconomic status filter
2084
+ socioeconomic: Socioeconomic status filter; takes SAM business-type codes (e.g. "OY" Black American Owned, "A6" SBA-certified 8(a), "A2" Woman Owned — see `GET /api/business_types/`), not set-aside codes, and accepts pipe-separated values for OR semantics, e.g. ``socioeconomic="OY|A2"``
2085
2085
  state: State filter
2086
2086
  total_awards_obligated_gte: Total awards obligated >=
2087
2087
  total_awards_obligated_lte: Total awards obligated <=
@@ -1992,6 +1992,22 @@ class TestPscFilters:
1992
1992
  assert "has_awards" not in mock_request.call_args[1]["params"]
1993
1993
 
1994
1994
 
1995
+ class TestEntityFilters:
1996
+ """The server ORs pipe-separated `socioeconomic` values; the SDK's job is to forward the string verbatim."""
1997
+
1998
+ @patch("tango.client.httpx.Client.request")
1999
+ def test_list_entities_forwards_pipe_separated_socioeconomic(self, mock_request):
2000
+ _stub_empty_page(mock_request)
2001
+ TangoClient(api_key="test-key").list_entities(socioeconomic="OY|A2")
2002
+ assert mock_request.call_args[1]["params"]["socioeconomic"] == "OY|A2"
2003
+
2004
+ @patch("tango.client.httpx.Client.request")
2005
+ def test_list_entities_omits_unset_socioeconomic(self, mock_request):
2006
+ _stub_empty_page(mock_request)
2007
+ TangoClient(api_key="test-key").list_entities()
2008
+ assert "socioeconomic" not in mock_request.call_args[1]["params"]
2009
+
2010
+
1995
2011
  class TestAgencyFilterDiagnostics:
1996
2012
  """`meta` from the API's agency-filter diagnostics.
1997
2013
 
@@ -1,58 +0,0 @@
1
- name: Docs dispatch
2
-
3
- # Fires on push to main when content that affects the published docs site
4
- # changes (docs/, README, or CHANGELOG). Notifies makegov/docs via
5
- # repository_dispatch so the docs site rebuilds without waiting for someone
6
- # to push to the composer.
7
- #
8
- # tango-python is a `coloc-source` repo: its docs/ folder is the authoritative
9
- # source for the Python SDK pages on docs.makegov.com (see makegov/docs#15).
10
- #
11
- # Required secrets:
12
- # DOCS_DISPATCH_TOKEN — GitHub token with contents:write on makegov/docs.
13
- #
14
- # Required variables (optional):
15
- # DOCS_TARGET_REPO — override the dispatch target (default: makegov/docs).
16
-
17
- on:
18
- push:
19
- branches:
20
- - main
21
- paths:
22
- - "docs/**"
23
- - "README.md"
24
- - "CHANGELOG.md"
25
- workflow_dispatch:
26
-
27
- jobs:
28
- dispatch:
29
- runs-on: ubuntu-latest
30
- permissions:
31
- contents: read
32
- steps:
33
- - uses: actions/checkout@v6
34
- with:
35
- fetch-depth: 2
36
-
37
- - name: Detect changed paths
38
- id: changes
39
- run: |
40
- set -euo pipefail
41
- base=$(git rev-parse HEAD~1 2>/dev/null || git rev-parse HEAD)
42
- external=$(git diff --name-only "$base" HEAD -- 'docs' 'README.md' 'CHANGELOG.md' | paste -sd, -)
43
- {
44
- echo "external=$external"
45
- echo "has_external=$([ -n "$external" ] && echo true || echo false)"
46
- } >> "$GITHUB_OUTPUT"
47
-
48
- - name: Dispatch to docs composer (makegov/docs)
49
- if: steps.changes.outputs.has_external == 'true'
50
- env:
51
- GH_TOKEN: ${{ secrets.DOCS_DISPATCH_TOKEN }}
52
- TARGET: ${{ vars.DOCS_TARGET_REPO || 'makegov/docs' }}
53
- run: |
54
- gh api "repos/$TARGET/dispatches" \
55
- -f event_type=external_updated \
56
- -f "client_payload[source_repo]=${{ github.repository }}" \
57
- -f "client_payload[source_ref]=${{ github.sha }}" \
58
- -f "client_payload[changed_paths]=${{ steps.changes.outputs.external }}"
@@ -1,110 +0,0 @@
1
- name: Linting
2
-
3
- # Lint gate runs on every PR and push to main.
4
- #
5
- # - ruff format + ruff check are HARD gates (block the PR).
6
- # - mypy is a HARD gate: the package type-checks cleanly under strict mypy.
7
- # (The earlier ~28-error burn-down is complete.)
8
- # - The SDK filter/shape conformance check is a HARD gate: it runs against the
9
- # vendored contract at contracts/filter_shape_contract.json on every run (no
10
- # secrets needed, works on forks). A second, token-gated step compares the
11
- # vendored contract against the tango repo's HEAD and emits a staleness
12
- # notice (never a failure — tango HEAD may carry unreleased changes).
13
- # Refresh the vendored contract with scripts/refresh_contract.py.
14
- # - Reverse shape-coverage is a HARD gate: check_shape_coverage.py fails when
15
- # Tango's shape trees expose a field/expand the SDK schema doesn't capture and
16
- # it isn't in contracts/shape_coverage_baseline.json. Also offline (vendored
17
- # contract), so it runs on forks. Burn the baseline down with the generator.
18
- on:
19
- workflow_dispatch:
20
- push:
21
- branches: [ main ]
22
- pull_request:
23
- branches: [ main ]
24
-
25
- jobs:
26
- lint:
27
- runs-on: ubuntu-latest
28
-
29
- steps:
30
- - uses: actions/checkout@v6
31
-
32
- - name: Install uv
33
- uses: astral-sh/setup-uv@v8.1.0
34
- with:
35
- version: "latest"
36
-
37
- - name: Set up Python
38
- run: uv python install 3.12
39
-
40
- - name: Install dependencies
41
- run: uv sync --all-extras
42
-
43
- - name: Check formatting with ruff
44
- run: uv run ruff format --check tango/
45
-
46
- - name: Lint with ruff
47
- run: uv run ruff check tango/
48
-
49
- - name: Type check with mypy
50
- run: uv run mypy tango/
51
-
52
- conformance:
53
- # Hard gate against the vendored contract (contracts/filter_shape_contract.json).
54
- # Runs unconditionally — no secrets required, so forks and tokenless runs
55
- # get the full check instead of a silent skip.
56
- runs-on: ubuntu-latest
57
-
58
- steps:
59
- - uses: actions/checkout@v6
60
-
61
- - name: Install uv
62
- uses: astral-sh/setup-uv@v8.1.0
63
- with:
64
- version: "latest"
65
-
66
- - name: Set up Python
67
- run: uv python install 3.12
68
-
69
- - name: Install dependencies
70
- run: uv sync --all-extras
71
-
72
- - name: Check SDK filter/shape conformance (vendored contract)
73
- run: uv run python scripts/check_filter_shape_conformance.py
74
-
75
- - name: Check reverse shape coverage (Tango exposes -> SDK captures)
76
- # Complements the conformance check with the OTHER direction: fails when
77
- # Tango's shape trees expose a field/expand the SDK schema doesn't capture
78
- # and it isn't in contracts/shape_coverage_baseline.json. Also offline
79
- # against the vendored contract — no secrets, works on forks.
80
- run: uv run python scripts/check_shape_coverage.py
81
-
82
- # --- Staleness notice (best-effort, never fails the job) ---------------
83
- - name: Determine token availability
84
- id: gate
85
- env:
86
- TANGO_API_REPO_ACCESS_TOKEN: ${{ secrets.TANGO_API_REPO_ACCESS_TOKEN }}
87
- run: |
88
- if [ -n "$TANGO_API_REPO_ACCESS_TOKEN" ]; then
89
- echo "ready=true" >> "$GITHUB_OUTPUT"
90
- else
91
- echo "ready=false" >> "$GITHUB_OUTPUT"
92
- echo "::notice::Contract staleness check skipped — TANGO_API_REPO_ACCESS_TOKEN not configured."
93
- fi
94
-
95
- - name: Checkout tango API repo (contract source)
96
- if: steps.gate.outputs.ready == 'true'
97
- uses: actions/checkout@v6
98
- with:
99
- repository: makegov/tango
100
- path: tango-api
101
- token: ${{ secrets.TANGO_API_REPO_ACCESS_TOKEN }}
102
-
103
- - name: Compare vendored contract against tango HEAD
104
- if: steps.gate.outputs.ready == 'true'
105
- run: |
106
- if ! diff -q contracts/filter_shape_contract.json tango-api/contracts/filter_shape_contract.json >/dev/null; then
107
- echo "::warning::Vendored contract differs from makegov/tango HEAD. Refresh with: uv run python scripts/refresh_contract.py"
108
- else
109
- echo "Vendored contract matches makegov/tango HEAD."
110
- fi
@@ -1,29 +0,0 @@
1
- name: Publish to PyPI
2
-
3
- on:
4
- release:
5
- types: [published]
6
- workflow_dispatch:
7
-
8
- jobs:
9
- build-and-publish:
10
- runs-on: ubuntu-latest
11
-
12
- steps:
13
- - uses: actions/checkout@v6
14
-
15
- - name: Install uv
16
- uses: astral-sh/setup-uv@v8.1.0
17
- with:
18
- version: 'latest'
19
-
20
- - name: Set up Python
21
- run: uv python install 3.12
22
-
23
- - name: Build package
24
- run: uv build
25
-
26
- - name: Publish to PyPI
27
- env:
28
- UV_PUBLISH_TOKEN: ${{ secrets.TANGO_PYPI_TOKEN }}
29
- run: uv publish
@@ -1,44 +0,0 @@
1
- name: Tests
2
-
3
- on:
4
- push:
5
- branches: [ main, develop ]
6
- pull_request:
7
- branches: [ main, develop ]
8
-
9
- jobs:
10
- test:
11
- runs-on: ${{ matrix.os }}
12
- strategy:
13
- fail-fast: false
14
- matrix:
15
- os: [ubuntu-latest, macos-latest, windows-latest]
16
- python-version: ["3.12", "3.13"]
17
-
18
- steps:
19
- - name: Enable Git long paths (Windows)
20
- if: matrix.os == 'windows-latest'
21
- run: git config --global core.longpaths true
22
-
23
- - uses: actions/checkout@v6
24
-
25
- - name: Install uv
26
- uses: astral-sh/setup-uv@v8.1.0
27
- with:
28
- version: "latest"
29
-
30
- - name: Set up Python ${{ matrix.python-version }}
31
- run: uv python install ${{ matrix.python-version }}
32
-
33
- - name: Install dependencies
34
- run: uv sync --all-extras
35
-
36
- - name: Test with pytest
37
- run: uv run pytest
38
-
39
- - name: Upload coverage to Codecov
40
- uses: codecov/codecov-action@v5
41
- with:
42
- files: ./coverage.xml
43
- flags: unittests
44
- name: codecov-${{ matrix.os }}-py${{ matrix.python-version }}
File without changes
File without changes
File without changes