tango-python 0.1.0a1__tar.gz → 0.2.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.
Files changed (272) hide show
  1. tango_python-0.2.0/.env.example +16 -0
  2. tango_python-0.2.0/.github/workflows/lint.yml +31 -0
  3. tango_python-0.2.0/.github/workflows/publish.yml +28 -0
  4. tango_python-0.2.0/.github/workflows/test.yml +44 -0
  5. tango_python-0.2.0/.gitignore +148 -0
  6. tango_python-0.2.0/CHANGELOG.md +10 -0
  7. tango_python-0.2.0/LICENSE +21 -0
  8. tango_python-0.2.0/PKG-INFO +532 -0
  9. tango_python-0.2.0/README.md +477 -0
  10. tango_python-0.2.0/ROADMAP.md +29 -0
  11. tango_python-0.2.0/docs/API_REFERENCE.md +855 -0
  12. tango_python-0.2.0/docs/DEVELOPERS.md +639 -0
  13. tango_python-0.2.0/docs/SHAPES.md +459 -0
  14. tango_python-0.2.0/docs/quick_start.ipynb +926 -0
  15. tango_python-0.2.0/pyproject.toml +121 -0
  16. tango_python-0.2.0/scripts/README.md +13 -0
  17. tango_python-0.2.0/scripts/fetch_api_schema.py +122 -0
  18. tango_python-0.2.0/scripts/generate_schemas_from_api.py +145 -0
  19. tango_python-0.2.0/tango/__init__.py +38 -0
  20. tango_python-0.2.0/tango/client.py +860 -0
  21. tango_python-0.2.0/tango/exceptions.py +100 -0
  22. tango_python-0.2.0/tango/models.py +447 -0
  23. tango_python-0.2.0/tango/shapes/__init__.py +41 -0
  24. tango_python-0.2.0/tango/shapes/explicit_schemas.py +752 -0
  25. tango_python-0.2.0/tango/shapes/factory.py +881 -0
  26. tango_python-0.2.0/tango/shapes/generator.py +617 -0
  27. tango_python-0.2.0/tango/shapes/models.py +93 -0
  28. tango_python-0.2.0/tango/shapes/parser.py +689 -0
  29. tango_python-0.2.0/tango/shapes/schema.py +383 -0
  30. tango_python-0.2.0/tango/shapes/types.py +46 -0
  31. tango_python-0.2.0/tests/__init__.py +1 -0
  32. tango_python-0.2.0/tests/cassettes/TestAgenciesIntegration.test_get_agency +85 -0
  33. tango_python-0.2.0/tests/cassettes/TestAgenciesIntegration.test_list_agencies +98 -0
  34. tango_python-0.2.0/tests/cassettes/TestBusinessTypesIntegration.test_business_type_field_type_validation +83 -0
  35. tango_python-0.2.0/tests/cassettes/TestBusinessTypesIntegration.test_business_type_parsing_consistency +91 -0
  36. tango_python-0.2.0/tests/cassettes/TestBusinessTypesIntegration.test_list_business_types +81 -0
  37. tango_python-0.2.0/tests/cassettes/TestContractsIntegration.test_combined_filters_work_together +92 -0
  38. tango_python-0.2.0/tests/cassettes/TestContractsIntegration.test_contract_data_object_parsing +92 -0
  39. tango_python-0.2.0/tests/cassettes/TestContractsIntegration.test_contract_field_types +102 -0
  40. tango_python-0.2.0/tests/cassettes/TestContractsIntegration.test_filter_parameter_mappings[keyword-software] +180 -0
  41. tango_python-0.2.0/tests/cassettes/TestContractsIntegration.test_filter_parameter_mappings[psc_code-R425] +180 -0
  42. tango_python-0.2.0/tests/cassettes/TestContractsIntegration.test_list_contracts_with_awarding_agency_filter +182 -0
  43. tango_python-0.2.0/tests/cassettes/TestContractsIntegration.test_list_contracts_with_date_range_filter +174 -0
  44. tango_python-0.2.0/tests/cassettes/TestContractsIntegration.test_list_contracts_with_flat +92 -0
  45. tango_python-0.2.0/tests/cassettes/TestContractsIntegration.test_list_contracts_with_naics_code_filter +408 -0
  46. tango_python-0.2.0/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[custom-key,piid,recipient(display_name),total_contract_value,award_date] +83 -0
  47. tango_python-0.2.0/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[default-None] +92 -0
  48. tango_python-0.2.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 +218 -0
  49. tango_python-0.2.0/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[minimal-key,piid,award_date,recipient(display_name),description,total_contract_value] +92 -0
  50. tango_python-0.2.0/tests/cassettes/TestContractsIntegration.test_new_expiring_filters +88 -0
  51. tango_python-0.2.0/tests/cassettes/TestContractsIntegration.test_new_fiscal_year_range_filters +88 -0
  52. tango_python-0.2.0/tests/cassettes/TestContractsIntegration.test_new_identifier_filters +78 -0
  53. tango_python-0.2.0/tests/cassettes/TestContractsIntegration.test_search_contracts_with_filters +174 -0
  54. tango_python-0.2.0/tests/cassettes/TestContractsIntegration.test_search_filters_object_with_new_parameters +88 -0
  55. tango_python-0.2.0/tests/cassettes/TestContractsIntegration.test_sort_and_order_mapped_to_ordering[asc-] +88 -0
  56. tango_python-0.2.0/tests/cassettes/TestContractsIntegration.test_sort_and_order_mapped_to_ordering[desc--] +92 -0
  57. tango_python-0.2.0/tests/cassettes/TestEdgeCasesIntegration.test_api_schema_stability_detection_contracts +88 -0
  58. tango_python-0.2.0/tests/cassettes/TestEdgeCasesIntegration.test_api_schema_stability_detection_entities +142 -0
  59. tango_python-0.2.0/tests/cassettes/TestEdgeCasesIntegration.test_date_field_parsing_edge_cases +143 -0
  60. tango_python-0.2.0/tests/cassettes/TestEdgeCasesIntegration.test_decimal_field_parsing_edge_cases +128 -0
  61. tango_python-0.2.0/tests/cassettes/TestEdgeCasesIntegration.test_empty_list_responses +78 -0
  62. tango_python-0.2.0/tests/cassettes/TestEdgeCasesIntegration.test_entity_parsing_with_various_address_formats +228 -0
  63. tango_python-0.2.0/tests/cassettes/TestEdgeCasesIntegration.test_flattened_responses_with_flat_lists +92 -0
  64. tango_python-0.2.0/tests/cassettes/TestEdgeCasesIntegration.test_list_field_parsing_consistency +196 -0
  65. tango_python-0.2.0/tests/cassettes/TestEdgeCasesIntegration.test_parsing_nested_objects_with_missing_data +289 -0
  66. tango_python-0.2.0/tests/cassettes/TestEdgeCasesIntegration.test_parsing_null_missing_fields_in_contracts +128 -0
  67. tango_python-0.2.0/tests/cassettes/TestEdgeCasesIntegration.test_parsing_with_minimal_shape_sparse_data +88 -0
  68. tango_python-0.2.0/tests/cassettes/TestEntitiesIntegration.test_entity_field_types +228 -0
  69. tango_python-0.2.0/tests/cassettes/TestEntitiesIntegration.test_entity_location_parsing +196 -0
  70. tango_python-0.2.0/tests/cassettes/TestEntitiesIntegration.test_entity_parsing_with_business_types +196 -0
  71. tango_python-0.2.0/tests/cassettes/TestEntitiesIntegration.test_entity_with_various_identifiers +169 -0
  72. tango_python-0.2.0/tests/cassettes/TestEntitiesIntegration.test_get_entity_by_uei +254 -0
  73. tango_python-0.2.0/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_flat +90 -0
  74. tango_python-0.2.0/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_search +88 -0
  75. tango_python-0.2.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...95fcff7efcf320ecc846393dd484321d +115 -0
  76. tango_python-0.2.0/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[custom-uei,legal_business_name,cage_code] +84 -0
  77. tango_python-0.2.0/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[minimal-uei,legal_business_name,cage_code,business_types] +102 -0
  78. tango_python-0.2.0/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[with_address-uei,legal_business_name,cage_code,business_types,physical_address] +107 -0
  79. tango_python-0.2.0/tests/cassettes/TestForecastsIntegration.test_forecast_field_types +88 -0
  80. tango_python-0.2.0/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[custom-id,title,anticipated_award_date] +83 -0
  81. tango_python-0.2.0/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[default-None] +83 -0
  82. tango_python-0.2.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] +107 -0
  83. tango_python-0.2.0/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[minimal-id,title,anticipated_award_date,fiscal_year,naics_code,status] +83 -0
  84. tango_python-0.2.0/tests/cassettes/TestGrantsIntegration.test_grant_field_types +79 -0
  85. tango_python-0.2.0/tests/cassettes/TestGrantsIntegration.test_grant_pagination +171 -0
  86. tango_python-0.2.0/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[custom-grant_id,title,opportunity_number] +87 -0
  87. tango_python-0.2.0/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[default-None] +87 -0
  88. tango_python-0.2.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(-)] +179 -0
  89. tango_python-0.2.0/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[minimal-grant_id,opportunity_number,title,status(-),agency_code] +87 -0
  90. tango_python-0.2.0/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[custom-notice_id,title,solicitation_number] +83 -0
  91. tango_python-0.2.0/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[default-None] +83 -0
  92. tango_python-0.2.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(-)] +368 -0
  93. tango_python-0.2.0/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[minimal-notice_id,title,solicitation_number,posted_date] +83 -0
  94. tango_python-0.2.0/tests/cassettes/TestNoticesIntegration.test_notice_field_types +88 -0
  95. tango_python-0.2.0/tests/cassettes/TestNoticesIntegration.test_notice_pagination +164 -0
  96. tango_python-0.2.0/tests/cassettes/TestNoticesIntegration.test_notice_with_meta_fields +488 -0
  97. tango_python-0.2.0/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[custom-opportunity_id,title,solicitation_number] +82 -0
  98. tango_python-0.2.0/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[default-None] +82 -0
  99. tango_python-0.2.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 +129 -0
  100. tango_python-0.2.0/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[minimal-opportunity_id,title,solicitation_number,response_deadline,active] +82 -0
  101. tango_python-0.2.0/tests/cassettes/TestOpportunitiesIntegration.test_opportunity_field_types +83 -0
  102. tango_python-0.2.0/tests/cassettes/TestTypeHintsIntegration.test_contracts_dict_access[custom-key,piid,description] +87 -0
  103. tango_python-0.2.0/tests/cassettes/TestTypeHintsIntegration.test_contracts_dict_access[minimal-key,piid,award_date,recipient(display_name),description,total_contract_value] +92 -0
  104. tango_python-0.2.0/tests/cassettes/TestTypeHintsIntegration.test_contracts_dict_access[ultra_minimal-key,piid,recipient(display_name),total_contract_value] +83 -0
  105. tango_python-0.2.0/tests/cassettes/TestTypeHintsIntegration.test_entities_dict_access[minimal-uei,legal_business_name,cage_code,business_types] +102 -0
  106. tango_python-0.2.0/tests/cassettes/TestTypeHintsIntegration.test_entities_dict_access[with_address-uei,legal_business_name,cage_code,business_types,physical_address] +107 -0
  107. tango_python-0.2.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(-)] +368 -0
  108. tango_python-0.2.0/tests/cassettes/TestTypeHintsIntegration.test_notices_dict_access[minimal-notice_id,title,solicitation_number,posted_date] +83 -0
  109. tango_python-0.2.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(-)] +129 -0
  110. tango_python-0.2.0/tests/cassettes/TestTypeHintsIntegration.test_opportunities_dict_access[minimal-opportunity_id,title,solicitation_number,response_deadline,active] +82 -0
  111. tango_python-0.2.0/tests/conftest.py +68 -0
  112. tango_python-0.2.0/tests/integration/README.md +377 -0
  113. tango_python-0.2.0/tests/integration/__init__.py +1 -0
  114. tango_python-0.2.0/tests/integration/conftest.py +210 -0
  115. tango_python-0.2.0/tests/integration/test_agencies_integration.py +78 -0
  116. tango_python-0.2.0/tests/integration/test_contracts_integration.py +488 -0
  117. tango_python-0.2.0/tests/integration/test_edge_cases_integration.py +937 -0
  118. tango_python-0.2.0/tests/integration/test_entities_integration.py +431 -0
  119. tango_python-0.2.0/tests/integration/test_forecasts_integration.py +269 -0
  120. tango_python-0.2.0/tests/integration/test_grants_integration.py +211 -0
  121. tango_python-0.2.0/tests/integration/test_notices_integration.py +450 -0
  122. tango_python-0.2.0/tests/integration/test_opportunities_integration.py +313 -0
  123. tango_python-0.2.0/tests/integration/test_reference_data_integration.py +113 -0
  124. tango_python-0.2.0/tests/integration/validation.py +197 -0
  125. tango_python-0.2.0/tests/test_client.py +1158 -0
  126. tango_python-0.2.0/tests/test_models.py +429 -0
  127. tango_python-0.2.0/tests/test_shapes.py +1692 -0
  128. tango_python-0.2.0/uv.lock +2209 -0
  129. tango_python-0.1.0a1/.gitignore +0 -16
  130. tango_python-0.1.0a1/.release-please-manifest.json +0 -3
  131. tango_python-0.1.0a1/CHANGELOG.md +0 -18
  132. tango_python-0.1.0a1/CONTRIBUTING.md +0 -129
  133. tango_python-0.1.0a1/LICENSE +0 -201
  134. tango_python-0.1.0a1/PKG-INFO +0 -350
  135. tango_python-0.1.0a1/README.md +0 -319
  136. tango_python-0.1.0a1/SECURITY.md +0 -27
  137. tango_python-0.1.0a1/api.md +0 -210
  138. tango_python-0.1.0a1/bin/check-release-environment +0 -21
  139. tango_python-0.1.0a1/bin/publish-pypi +0 -9
  140. tango_python-0.1.0a1/examples/.keep +0 -4
  141. tango_python-0.1.0a1/mypy.ini +0 -50
  142. tango_python-0.1.0a1/noxfile.py +0 -9
  143. tango_python-0.1.0a1/pyproject.toml +0 -207
  144. tango_python-0.1.0a1/release-please-config.json +0 -66
  145. tango_python-0.1.0a1/requirements-dev.lock +0 -103
  146. tango_python-0.1.0a1/requirements.lock +0 -45
  147. tango_python-0.1.0a1/src/tango/__init__.py +0 -83
  148. tango_python-0.1.0a1/src/tango/_base_client.py +0 -2045
  149. tango_python-0.1.0a1/src/tango/_client.py +0 -528
  150. tango_python-0.1.0a1/src/tango/_compat.py +0 -219
  151. tango_python-0.1.0a1/src/tango/_constants.py +0 -14
  152. tango_python-0.1.0a1/src/tango/_exceptions.py +0 -108
  153. tango_python-0.1.0a1/src/tango/_files.py +0 -123
  154. tango_python-0.1.0a1/src/tango/_models.py +0 -788
  155. tango_python-0.1.0a1/src/tango/_qs.py +0 -150
  156. tango_python-0.1.0a1/src/tango/_resource.py +0 -43
  157. tango_python-0.1.0a1/src/tango/_response.py +0 -824
  158. tango_python-0.1.0a1/src/tango/_streaming.py +0 -333
  159. tango_python-0.1.0a1/src/tango/_types.py +0 -219
  160. tango_python-0.1.0a1/src/tango/_utils/__init__.py +0 -56
  161. tango_python-0.1.0a1/src/tango/_utils/_logs.py +0 -25
  162. tango_python-0.1.0a1/src/tango/_utils/_proxy.py +0 -62
  163. tango_python-0.1.0a1/src/tango/_utils/_reflection.py +0 -42
  164. tango_python-0.1.0a1/src/tango/_utils/_streams.py +0 -12
  165. tango_python-0.1.0a1/src/tango/_utils/_sync.py +0 -71
  166. tango_python-0.1.0a1/src/tango/_utils/_transform.py +0 -392
  167. tango_python-0.1.0a1/src/tango/_utils/_typing.py +0 -120
  168. tango_python-0.1.0a1/src/tango/_utils/_utils.py +0 -414
  169. tango_python-0.1.0a1/src/tango/_version.py +0 -4
  170. tango_python-0.1.0a1/src/tango/lib/.keep +0 -4
  171. tango_python-0.1.0a1/src/tango/py.typed +0 -0
  172. tango_python-0.1.0a1/src/tango/resources/__init__.py +0 -229
  173. tango_python-0.1.0a1/src/tango/resources/agencies.py +0 -255
  174. tango_python-0.1.0a1/src/tango/resources/assistance_listings.py +0 -214
  175. tango_python-0.1.0a1/src/tango/resources/bulk/__init__.py +0 -33
  176. tango_python-0.1.0a1/src/tango/resources/bulk/bulk.py +0 -102
  177. tango_python-0.1.0a1/src/tango/resources/bulk/entities.py +0 -152
  178. tango_python-0.1.0a1/src/tango/resources/business_types.py +0 -218
  179. tango_python-0.1.0a1/src/tango/resources/contracts.py +0 -381
  180. tango_python-0.1.0a1/src/tango/resources/departments.py +0 -210
  181. tango_python-0.1.0a1/src/tango/resources/entities.py +0 -325
  182. tango_python-0.1.0a1/src/tango/resources/idvs/__init__.py +0 -33
  183. tango_python-0.1.0a1/src/tango/resources/idvs/awards.py +0 -287
  184. tango_python-0.1.0a1/src/tango/resources/idvs/idvs.py +0 -413
  185. tango_python-0.1.0a1/src/tango/resources/naics.py +0 -317
  186. tango_python-0.1.0a1/src/tango/resources/notices.py +0 -391
  187. tango_python-0.1.0a1/src/tango/resources/offices.py +0 -281
  188. tango_python-0.1.0a1/src/tango/resources/opportunities.py +0 -420
  189. tango_python-0.1.0a1/src/tango/resources/pscs.py +0 -210
  190. tango_python-0.1.0a1/src/tango/resources/schemas.py +0 -398
  191. tango_python-0.1.0a1/src/tango/resources/subawards.py +0 -313
  192. tango_python-0.1.0a1/src/tango/resources/versions.py +0 -136
  193. tango_python-0.1.0a1/src/tango/types/__init__.py +0 -43
  194. tango_python-0.1.0a1/src/tango/types/agency.py +0 -17
  195. tango_python-0.1.0a1/src/tango/types/agency_list_params.py +0 -14
  196. tango_python-0.1.0a1/src/tango/types/agency_list_response.py +0 -10
  197. tango_python-0.1.0a1/src/tango/types/assistance_listing.py +0 -12
  198. tango_python-0.1.0a1/src/tango/types/assistance_listing_list_response.py +0 -10
  199. tango_python-0.1.0a1/src/tango/types/assistance_listing_retrieve_response.py +0 -26
  200. tango_python-0.1.0a1/src/tango/types/bulk/__init__.py +0 -3
  201. tango_python-0.1.0a1/src/tango/types/business_type.py +0 -14
  202. tango_python-0.1.0a1/src/tango/types/business_type_list_response.py +0 -10
  203. tango_python-0.1.0a1/src/tango/types/contract_list_params.py +0 -78
  204. tango_python-0.1.0a1/src/tango/types/contract_list_response.py +0 -55
  205. tango_python-0.1.0a1/src/tango/types/contract_retrieve_response.py +0 -51
  206. tango_python-0.1.0a1/src/tango/types/department.py +0 -16
  207. tango_python-0.1.0a1/src/tango/types/department_list_response.py +0 -10
  208. tango_python-0.1.0a1/src/tango/types/entity_list_params.py +0 -38
  209. tango_python-0.1.0a1/src/tango/types/entity_list_response.py +0 -37
  210. tango_python-0.1.0a1/src/tango/types/entity_retrieve_response.py +0 -116
  211. tango_python-0.1.0a1/src/tango/types/idv.py +0 -102
  212. tango_python-0.1.0a1/src/tango/types/idv_list_params.py +0 -78
  213. tango_python-0.1.0a1/src/tango/types/idv_list_response.py +0 -27
  214. tango_python-0.1.0a1/src/tango/types/idvs/__init__.py +0 -6
  215. tango_python-0.1.0a1/src/tango/types/idvs/award_list_params.py +0 -55
  216. tango_python-0.1.0a1/src/tango/types/idvs/award_list_response.py +0 -55
  217. tango_python-0.1.0a1/src/tango/types/naic_list_params.py +0 -47
  218. tango_python-0.1.0a1/src/tango/types/naic_list_response.py +0 -10
  219. tango_python-0.1.0a1/src/tango/types/naic_retrieve_response.py +0 -13
  220. tango_python-0.1.0a1/src/tango/types/naics_code.py +0 -13
  221. tango_python-0.1.0a1/src/tango/types/notice_list_params.py +0 -81
  222. tango_python-0.1.0a1/src/tango/types/notice_list_response.py +0 -60
  223. tango_python-0.1.0a1/src/tango/types/notice_retrieve_response.py +0 -93
  224. tango_python-0.1.0a1/src/tango/types/office.py +0 -15
  225. tango_python-0.1.0a1/src/tango/types/office_list_params.py +0 -18
  226. tango_python-0.1.0a1/src/tango/types/office_list_response.py +0 -18
  227. tango_python-0.1.0a1/src/tango/types/opportunity_list_params.py +0 -97
  228. tango_python-0.1.0a1/src/tango/types/opportunity_list_response.py +0 -101
  229. tango_python-0.1.0a1/src/tango/types/opportunity_retrieve_response.py +0 -123
  230. tango_python-0.1.0a1/src/tango/types/product_service_code.py +0 -21
  231. tango_python-0.1.0a1/src/tango/types/psc_list_response.py +0 -10
  232. tango_python-0.1.0a1/src/tango/types/schema_retrieve_params.py +0 -113
  233. tango_python-0.1.0a1/src/tango/types/schema_retrieve_response.py +0 -8
  234. tango_python-0.1.0a1/src/tango/types/subaward.py +0 -172
  235. tango_python-0.1.0a1/src/tango/types/subaward_list_params.py +0 -33
  236. tango_python-0.1.0a1/src/tango/types/subaward_list_response.py +0 -18
  237. tango_python-0.1.0a1/tests/__init__.py +0 -1
  238. tango_python-0.1.0a1/tests/api_resources/__init__.py +0 -1
  239. tango_python-0.1.0a1/tests/api_resources/bulk/__init__.py +0 -1
  240. tango_python-0.1.0a1/tests/api_resources/bulk/test_entities.py +0 -70
  241. tango_python-0.1.0a1/tests/api_resources/idvs/__init__.py +0 -1
  242. tango_python-0.1.0a1/tests/api_resources/idvs/test_awards.py +0 -151
  243. tango_python-0.1.0a1/tests/api_resources/test_agencies.py +0 -162
  244. tango_python-0.1.0a1/tests/api_resources/test_assistance_listings.py +0 -148
  245. tango_python-0.1.0a1/tests/api_resources/test_business_types.py +0 -148
  246. tango_python-0.1.0a1/tests/api_resources/test_contracts.py +0 -194
  247. tango_python-0.1.0a1/tests/api_resources/test_departments.py +0 -134
  248. tango_python-0.1.0a1/tests/api_resources/test_entities.py +0 -184
  249. tango_python-0.1.0a1/tests/api_resources/test_idvs.py +0 -194
  250. tango_python-0.1.0a1/tests/api_resources/test_naics.py +0 -162
  251. tango_python-0.1.0a1/tests/api_resources/test_notices.py +0 -192
  252. tango_python-0.1.0a1/tests/api_resources/test_offices.py +0 -166
  253. tango_python-0.1.0a1/tests/api_resources/test_opportunities.py +0 -201
  254. tango_python-0.1.0a1/tests/api_resources/test_pscs.py +0 -134
  255. tango_python-0.1.0a1/tests/api_resources/test_schemas.py +0 -88
  256. tango_python-0.1.0a1/tests/api_resources/test_subawards.py +0 -164
  257. tango_python-0.1.0a1/tests/api_resources/test_versions.py +0 -70
  258. tango_python-0.1.0a1/tests/conftest.py +0 -51
  259. tango_python-0.1.0a1/tests/sample_file.txt +0 -1
  260. tango_python-0.1.0a1/tests/test_client.py +0 -1657
  261. tango_python-0.1.0a1/tests/test_deepcopy.py +0 -58
  262. tango_python-0.1.0a1/tests/test_extract_files.py +0 -64
  263. tango_python-0.1.0a1/tests/test_files.py +0 -51
  264. tango_python-0.1.0a1/tests/test_models.py +0 -830
  265. tango_python-0.1.0a1/tests/test_qs.py +0 -78
  266. tango_python-0.1.0a1/tests/test_required_args.py +0 -111
  267. tango_python-0.1.0a1/tests/test_response.py +0 -277
  268. tango_python-0.1.0a1/tests/test_streaming.py +0 -248
  269. tango_python-0.1.0a1/tests/test_transform.py +0 -425
  270. tango_python-0.1.0a1/tests/test_utils/test_proxy.py +0 -23
  271. tango_python-0.1.0a1/tests/test_utils/test_typing.py +0 -73
  272. tango_python-0.1.0a1/tests/utils.py +0 -155
@@ -0,0 +1,16 @@
1
+ # Tango API Configuration
2
+ # Copy this file to .env and fill in your actual values
3
+
4
+ # API Key for Tango API
5
+ TANGO_API_KEY=your_api_key_here
6
+
7
+ # Base URL for Tango API (optional, defaults to production)
8
+ # TANGO_BASE_URL=https://tango.makegov.com
9
+
10
+ # Integration Testing Configuration
11
+
12
+ # Set to 'true' to use live API instead of cassettes (requires TANGO_API_KEY)
13
+ TANGO_USE_LIVE_API=false
14
+
15
+ # Set to 'true' to refresh all cassettes (re-record from live API)
16
+ TANGO_REFRESH_CASSETTES=false
@@ -0,0 +1,31 @@
1
+ name: Linting
2
+
3
+ on:
4
+ push:
5
+ branches: [ main, develop ]
6
+ pull_request:
7
+ branches: [ main, develop ]
8
+
9
+ jobs:
10
+ lint:
11
+ runs-on: ubuntu-latest
12
+
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+
16
+ - name: Install uv
17
+ uses: astral-sh/setup-uv@v4
18
+ with:
19
+ version: "latest"
20
+
21
+ - name: Set up Python
22
+ run: uv python install 3.12
23
+
24
+ - name: Install dependencies
25
+ run: uv sync --all-extras
26
+
27
+ - name: Check formatting with ruff
28
+ run: uv run ruff format --check tango/
29
+
30
+ - name: Lint with ruff
31
+ run: uv run ruff check tango/
@@ -0,0 +1,28 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ jobs:
8
+ build-and-publish:
9
+ runs-on: ubuntu-latest
10
+
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+
14
+ - name: Install uv
15
+ uses: astral-sh/setup-uv@v4
16
+ with:
17
+ version: 'latest'
18
+
19
+ - name: Set up Python
20
+ run: uv python install 3.12
21
+
22
+ - name: Build package
23
+ run: uv build
24
+
25
+ - name: Publish to PyPI
26
+ env:
27
+ UV_PUBLISH_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
28
+ run: uv publish
@@ -0,0 +1,44 @@
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@v4
24
+
25
+ - name: Install uv
26
+ uses: astral-sh/setup-uv@v4
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@v3
41
+ with:
42
+ file: ./coverage.xml
43
+ flags: unittests
44
+ name: codecov-${{ matrix.os }}-py${{ matrix.python-version }}
@@ -0,0 +1,148 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ **/__pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ pip-wheel-metadata/
24
+ share/python-wheels/
25
+ *.egg-info/
26
+ .installed.cfg
27
+ *.egg
28
+ MANIFEST
29
+
30
+ # PyInstaller
31
+ *.manifest
32
+ *.spec
33
+
34
+ # Installer logs
35
+ pip-log.txt
36
+ pip-delete-this-directory.txt
37
+
38
+ # Unit test / coverage reports
39
+ htmlcov/
40
+ .tox/
41
+ .nox/
42
+ .coverage
43
+ .coverage.*
44
+ .cache
45
+ nosetests.xml
46
+ coverage.xml
47
+ *.cover
48
+ *.py,cover
49
+ .hypothesis/
50
+ .pytest_cache/
51
+
52
+ # Translations
53
+ *.mo
54
+ *.pot
55
+
56
+ # Django stuff:
57
+ *.log
58
+ local_settings.py
59
+ db.sqlite3
60
+ db.sqlite3-journal
61
+
62
+ # Flask stuff:
63
+ instance/
64
+ .webassets-cache
65
+
66
+ # Scrapy stuff:
67
+ .scrapy
68
+
69
+ # Sphinx documentation
70
+ docs/_build/
71
+
72
+ # PyBuilder
73
+ target/
74
+
75
+ # Jupyter Notebook
76
+ .ipynb_checkpoints
77
+
78
+ # IPython
79
+ profile_default/
80
+ ipython_config.py
81
+
82
+ # pyenv
83
+ .python-version
84
+
85
+ # pipenv
86
+ Pipfile.lock
87
+
88
+ # PEP 582
89
+ __pypackages__/
90
+
91
+ # Celery stuff
92
+ celerybeat-schedule
93
+ celerybeat.pid
94
+
95
+ # SageMath parsed files
96
+ *.sage.py
97
+
98
+ # Environments
99
+ .env
100
+ .venv
101
+ env/
102
+ venv/
103
+ ENV/
104
+ env.bak/
105
+ venv.bak/
106
+
107
+ # Generated API schema files (from scripts/)
108
+ api_schema_full.json
109
+ api_schema_extracted.json
110
+
111
+ # UV lock file (optional - comment out if you want to commit it)
112
+ # uv.lock
113
+
114
+ # Spyder project settings
115
+ .spyderproject
116
+ .spyproject
117
+
118
+ # Rope project settings
119
+ .ropeproject
120
+
121
+ # mkdocs documentation
122
+ /site
123
+
124
+ # mypy
125
+ .mypy_cache/
126
+ .dmypy.json
127
+ dmypy.json
128
+
129
+ # Ruff
130
+ .ruff_cache/
131
+
132
+ # Pyre type checker
133
+ .pyre/
134
+
135
+ # IDE
136
+ .vscode/
137
+ .idea/
138
+ .claude/
139
+ *.swp
140
+ *.swo
141
+ *~
142
+ .kiro
143
+
144
+ # OS
145
+ .DS_Store
146
+ Thumbs.db
147
+
148
+ .cursor/*
@@ -0,0 +1,10 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.2.0] - 2025-11-16
9
+
10
+ - Entirely refactored SDK
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 MakeGov
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.