tango-python 1.15.0__tar.gz → 1.16.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {tango_python-1.15.0 → tango_python-1.16.0}/CHANGELOG.md +10 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/PKG-INFO +1 -1
- {tango_python-1.15.0 → tango_python-1.16.0}/docs/API_REFERENCE.md +19 -1
- {tango_python-1.15.0 → tango_python-1.16.0}/pyproject.toml +1 -1
- {tango_python-1.15.0 → tango_python-1.16.0}/tango/__init__.py +1 -1
- {tango_python-1.15.0 → tango_python-1.16.0}/tango/models.py +6 -1
- {tango_python-1.15.0 → tango_python-1.16.0}/tango/shapes/explicit_schemas.py +2 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/test_ebuy.py +30 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/.gitignore +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/LICENSE +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/README.md +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/docs/CLIENT.md +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/docs/DYNAMIC_MODELS.md +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/docs/ERRORS.md +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/docs/PAGINATION.md +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/docs/SHAPES.md +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/docs/WEBHOOKS.md +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/scripts/README.md +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/scripts/check_filter_shape_conformance.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/scripts/check_shape_coverage.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/scripts/fetch_api_schema.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/scripts/generate_schemas_from_api.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/scripts/generate_shape_overlay.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/scripts/pr_review.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/scripts/probe_shape_types.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/scripts/refresh_contract.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/scripts/smoke_api_parity.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/scripts/test_production.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tango/client.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tango/exceptions.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tango/shapes/__init__.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tango/shapes/factory.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tango/shapes/generated_overlay.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tango/shapes/generator.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tango/shapes/models.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tango/shapes/parser.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tango/shapes/schema.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tango/shapes/types.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tango/webhooks/__init__.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tango/webhooks/cli.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tango/webhooks/receiver.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tango/webhooks/signing.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tango/webhooks/simulate.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/__init__.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestAgenciesIntegration.test_get_agency +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestAgenciesIntegration.test_list_agencies +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestBusinessTypesIntegration.test_business_type_field_type_validation +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestBusinessTypesIntegration.test_business_type_parsing_consistency +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestBusinessTypesIntegration.test_list_business_types +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestContractsIntegration.test_combined_filters_work_together +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestContractsIntegration.test_contract_cursor_pagination +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestContractsIntegration.test_contract_data_object_parsing +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestContractsIntegration.test_contract_field_types +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestContractsIntegration.test_filter_parameter_mappings[keyword-software] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestContractsIntegration.test_filter_parameter_mappings[psc_code-R425] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_awarding_agency_filter +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_date_range_filter +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_flat +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_naics_code_filter +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[custom-key,piid,recipient(display_name),total_contract_value,award_date] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[default-None] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[detailed-key,piid,award_date,description,total_contract_value,obligated,fiscal_year,set_aside,recipient(display_name,uei),awarding_office(-),place_of_performa...ce114a3c47e2037aaa3c15d00b7031bd +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestContractsIntegration.test_list_contracts_with_shapes[minimal-key,piid,award_date,recipient(display_name),description,total_contract_value] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestContractsIntegration.test_new_expiring_filters +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestContractsIntegration.test_new_fiscal_year_range_filters +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestContractsIntegration.test_new_identifier_filters +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestContractsIntegration.test_search_contracts_with_filters +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestContractsIntegration.test_search_filters_object_with_new_parameters +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestContractsIntegration.test_sort_and_order_mapped_to_ordering[asc-] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestContractsIntegration.test_sort_and_order_mapped_to_ordering[desc--] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestEdgeCasesIntegration.test_api_schema_stability_detection_contracts +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestEdgeCasesIntegration.test_api_schema_stability_detection_entities +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestEdgeCasesIntegration.test_date_field_parsing_edge_cases +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestEdgeCasesIntegration.test_decimal_field_parsing_edge_cases +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestEdgeCasesIntegration.test_empty_list_responses +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestEdgeCasesIntegration.test_entity_parsing_with_various_address_formats +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestEdgeCasesIntegration.test_flattened_responses_with_flat_lists +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestEdgeCasesIntegration.test_list_field_parsing_consistency +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestEdgeCasesIntegration.test_parsing_nested_objects_with_missing_data +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestEdgeCasesIntegration.test_parsing_null_missing_fields_in_contracts +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestEdgeCasesIntegration.test_parsing_with_minimal_shape_sparse_data +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestEntitiesIntegration.test_entity_field_types +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestEntitiesIntegration.test_entity_location_parsing +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestEntitiesIntegration.test_entity_parsing_with_business_types +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestEntitiesIntegration.test_entity_with_various_identifiers +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestEntitiesIntegration.test_get_entity_budget_flows +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestEntitiesIntegration.test_get_entity_by_uei +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_flat +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_search +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[comprehensive-uei,legal_business_name,dba_name,cage_code,business_types,primary_naics,naics_codes,psc_codes,email_address,entity_url,description,capabilities,ke...1603a7d52e211cf2b3bc7d32080238aa +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[custom-uei,legal_business_name,cage_code] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[minimal-uei,legal_business_name,cage_code,business_types] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestEntitiesIntegration.test_list_entities_with_shapes[with_address-uei,legal_business_name,cage_code,business_types,physical_address] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestForecastsIntegration.test_forecast_field_types +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[custom-id,title,anticipated_award_date] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[default-None] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[detailed-id,source_system,external_id,title,description,anticipated_award_date,fiscal_year,naics_code,status,is_active] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestForecastsIntegration.test_list_forecasts_with_shapes[minimal-id,title,anticipated_award_date,fiscal_year,naics_code,status] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestGrantsIntegration.test_grant_field_types +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestGrantsIntegration.test_grant_pagination +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[custom-grant_id,title,opportunity_number] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[default-None] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[detailed-grant_id,opportunity_number,title,status(-),agency_code,description,last_updated,cfda_numbers(number,title),applicant_types(-),funding_categories(-)] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestGrantsIntegration.test_list_grants_with_shapes[minimal-grant_id,opportunity_number,title,status(-),agency_code] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestIDVsIntegration.test_get_idv_uses_default_shape +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestIDVsIntegration.test_list_idv_awards_uses_default_shape +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestIDVsIntegration.test_list_idv_child_idvs_uses_default_shape +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestIDVsIntegration.test_list_idv_transactions +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestIDVsIntegration.test_list_idvs_uses_default_shape_and_keyset_params +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestITDashboardIntegration.test_filter_by_agency_code +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestITDashboardIntegration.test_filter_by_agency_name_text +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestITDashboardIntegration.test_filter_by_cio_rating +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestITDashboardIntegration.test_filter_by_cio_rating_max +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestITDashboardIntegration.test_filter_by_performance_risk +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestITDashboardIntegration.test_filter_by_type_of_investment +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestITDashboardIntegration.test_filter_by_updated_time_range +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestITDashboardIntegration.test_funding_and_cio_evaluation_expansions +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestITDashboardIntegration.test_get_itdashboard_investment_by_uii +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestITDashboardIntegration.test_itdashboard_pagination +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestITDashboardIntegration.test_list_itdashboard_investments_with_search +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestITDashboardIntegration.test_list_itdashboard_investments_with_shapes[custom-uii,agency_name,investment_title,updated_time] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestITDashboardIntegration.test_list_itdashboard_investments_with_shapes[default-None] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestITDashboardIntegration.test_list_itdashboard_investments_with_shapes[minimal-uii,agency_name,bureau_name,investment_title,type_of_investment,part_of_it_portfolio,updated_time,url] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestNaicsIntegration.test_list_naics +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[custom-notice_id,title,solicitation_number] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[default-None] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[detailed-notice_id,title,description,solicitation_number,posted_date,naics_code,set_aside,office(-),place_of_performance(-)] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestNoticesIntegration.test_list_notices_with_shapes[minimal-notice_id,title,solicitation_number,posted_date] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestNoticesIntegration.test_notice_field_types +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestNoticesIntegration.test_notice_pagination +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestNoticesIntegration.test_notice_with_meta_fields +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestOTAsIntegration.test_get_ota +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestOTAsIntegration.test_list_otas +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestOTIDVsIntegration.test_get_otidv +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestOTIDVsIntegration.test_list_otidvs +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestOfficesIntegration.test_get_office +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestOfficesIntegration.test_list_offices +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[custom-opportunity_id,title,solicitation_number] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[default-None] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[detailed-opportunity_id,title,description,solicitation_number,response_deadline,first_notice_date,last_notice_date,active,naics_code,psc_code,set_asid...23b6b4502ddd665b7184afcff6c6d8d9 +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestOpportunitiesIntegration.test_list_opportunities_with_shapes[minimal-opportunity_id,title,solicitation_number,response_deadline,active] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestOpportunitiesIntegration.test_opportunity_field_types +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestOrganizationsIntegration.test_get_organization +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestOrganizationsIntegration.test_list_organizations +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestProtestsIntegration.test_get_protest_by_case_id +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestProtestsIntegration.test_list_protests_with_filter +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestProtestsIntegration.test_list_protests_with_shapes[custom-case_id,title,source_system,outcome] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestProtestsIntegration.test_list_protests_with_shapes[default-None] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestProtestsIntegration.test_list_protests_with_shapes[minimal-case_id,case_number,title,source_system,outcome,filed_date] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestProtestsIntegration.test_list_protests_with_shapes[with_dockets-case_id,case_number,title,outcome,filed_date,dockets(docket_number,filed_date,outcome)] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestProtestsIntegration.test_protest_pagination +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestSubawardsIntegration.test_list_subawards +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestTypeHintsIntegration.test_contracts_dict_access[custom-key,piid,description] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestTypeHintsIntegration.test_contracts_dict_access[minimal-key,piid,award_date,recipient(display_name),description,total_contract_value] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestTypeHintsIntegration.test_contracts_dict_access[ultra_minimal-key,piid,recipient(display_name),total_contract_value] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestTypeHintsIntegration.test_entities_dict_access[minimal-uei,legal_business_name,cage_code,business_types] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestTypeHintsIntegration.test_entities_dict_access[with_address-uei,legal_business_name,cage_code,business_types,physical_address] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestTypeHintsIntegration.test_notices_dict_access[detailed-notice_id,title,description,solicitation_number,posted_date,naics_code,set_aside,office(-),place_of_performance(-)] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestTypeHintsIntegration.test_notices_dict_access[minimal-notice_id,title,solicitation_number,posted_date] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestTypeHintsIntegration.test_opportunities_dict_access[detailed-opportunity_id,title,description,solicitation_number,response_deadline,first_notice_date,last_notice_date,active,naics_code,psc_code,set_aside,sam_url,office(-),place_of_performance(-)] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestTypeHintsIntegration.test_opportunities_dict_access[minimal-opportunity_id,title,solicitation_number,response_deadline,active] +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestVehiclesIntegration.test_get_vehicle_supports_joiner_and_flat_lists +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestVehiclesIntegration.test_get_vehicle_with_metrics_expansion +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestVehiclesIntegration.test_list_vehicle_awardees_uses_default_shape +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestVehiclesIntegration.test_list_vehicle_orders_uses_default_shape +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestVehiclesIntegration.test_list_vehicles_uses_default_shape_and_search +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestVehiclesIntegration.test_list_vehicles_with_ordering +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/conftest.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/README.md +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/__init__.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/conftest.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_agencies_integration.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_contracts_integration.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_edge_cases_integration.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_entities_integration.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_forecasts_integration.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_grants_integration.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_itdashboard_integration.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_naics_integration.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_notices_integration.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_offices_integration.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_opportunities_integration.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_organizations_integration.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_otas_otidvs_integration.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_protests_integration.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_reference_data_integration.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_subawards_integration.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_vehicles_idvs_integration.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/validation.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/production/__init__.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/production/conftest.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/production/test_production_smoke.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/test_api_parity.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/test_client.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/test_contract_appeals.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/test_dibbs_exclusions_sbir.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/test_federal_register.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/test_models.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/test_opportunity_attachments.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/test_opportunity_awards.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/test_organization_scope.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/test_shape_coverage_gate.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/test_shapes.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/test_sled.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/test_webhooks_cli.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/test_webhooks_receiver.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/test_webhooks_signing.py +0 -0
- {tango_python-1.15.0 → tango_python-1.16.0}/tests/test_webhooks_simulate.py +0 -0
|
@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [1.16.0] - 2026-10-10
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Extracted text on eBuy request attachments** (Tango API 5.9.1). `attachments(extracted_text)` on eBuy requests returns the text extracted from an attachment's document. It is returned only when named: the default `get_ebuy_request()` shape and `attachments(*)` leave it out. An attachment with no text (an external link, an empty scan, or a document not yet extracted) is sent by the API without the key rather than with a null; the SDK's shaped result reads that as `None`.
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
|
|
18
|
+
- Re-vendored `contracts/filter_shape_contract.json` (Tango API 5.9.1).
|
|
19
|
+
|
|
10
20
|
## [1.15.0] - 2026-10-06
|
|
11
21
|
|
|
12
22
|
### Added
|
|
@@ -1758,6 +1758,24 @@ for attachment in request["attachments"]:
|
|
|
1758
1758
|
|
|
1759
1759
|
The default shape returns every field plus two expands: `organization` (the buyer office, with the same seven keys as other resources' `organization` expand) and `attachments`. Each attachment carries `doc_seq_num`, `doc_name`, `doc_type`, `doc_path`, `is_link` and `doc_session_date`. `is_link=True` means `doc_path` is an outbound URL with no stored document behind it. `amendments`, `line_items` and `addresses` are lists of objects, served as eBuy publishes them.
|
|
1760
1760
|
|
|
1761
|
+
**Reading a document's text — `attachments(extracted_text)`** (Tango API 5.9.1):
|
|
1762
|
+
|
|
1763
|
+
```python
|
|
1764
|
+
request = client.get_ebuy_request(
|
|
1765
|
+
"RFQ1835158",
|
|
1766
|
+
shape="rfq_id,attachments(doc_seq_num,doc_name,extracted_text)",
|
|
1767
|
+
)
|
|
1768
|
+
|
|
1769
|
+
for attachment in request["attachments"]:
|
|
1770
|
+
text = attachment.get("extracted_text")
|
|
1771
|
+
if text:
|
|
1772
|
+
print(attachment["doc_name"], len(text))
|
|
1773
|
+
```
|
|
1774
|
+
|
|
1775
|
+
- `extracted_text` is the text extracted from the attachment's document.
|
|
1776
|
+
- **It is returned only when you name it.** The default shape does not include it, and neither does `attachments(*)`.
|
|
1777
|
+
- **The API omits the key, rather than sending null**, for an attachment with no text: an external link, an empty scan, or a document that has not been extracted yet. The SDK's shaped result reads an omitted key as `None`, so treat `None` as "no text", not as an error.
|
|
1778
|
+
|
|
1761
1779
|
### get_ebuy_attachment_url()
|
|
1762
1780
|
|
|
1763
1781
|
Get a short-lived download URL for one stored attachment.
|
|
@@ -2606,7 +2624,7 @@ entity = client.get_entity("UEI_KEY", shape=ShapeConfig.ENTITIES_COMPREHENSIVE)
|
|
|
2606
2624
|
| `FEDERAL_REGISTER_MINIMAL` | `list_federal_register_documents` | uuid, document_number, publication_date, type, subtype, title, abstract, action, agencies, cfr_references, citation, significant, comments_close_on, effective_on, html_url, pdf_url |
|
|
2607
2625
|
| `FEDERAL_REGISTER_COMPREHENSIVE` | `get_federal_register_document` | The list fields plus dates, signing_date, start_page, end_page, volume, docket_ids, dockets, regulation_id_numbers, topics, correction_of, corrections, executive_order_number, presidential_document_number, proclamation_number, comment_url, regulations_dot_gov_url, raw_text_url, body_html_url (omits `full_text`) |
|
|
2608
2626
|
| `EBUY_REQUESTS_MINIMAL` | `list_ebuy_requests` | rfq_id, request_type, title, schedule, sin, status, buyer_name, buyer_agency, buyer_agency_code, reference_number, issue_date, close_date, attachment_count, link_count, last_seen |
|
|
2609
|
-
| `EBUY_REQUESTS_COMPREHENSIVE` | `get_ebuy_request` | Every field, plus the `organization` and `attachments` expands |
|
|
2627
|
+
| `EBUY_REQUESTS_COMPREHENSIVE` | `get_ebuy_request` | Every field, plus the `organization` and `attachments` expands (without `extracted_text`, which must be named) |
|
|
2610
2628
|
| `BUDGET_ACCOUNTS_MINIMAL` | `list_budget_accounts`, `get_budget_account` | id, federal_account_symbol, fiscal_year, data_through_period, agency_code/name, bureau_name, account_title, bea_category, on_off_budget, subfunction_code, account_category, lifecycle (requested/enacted/apportioned/obligated/outlayed/unobligated), contract & assistance rollups, key ratios, next-year growth, source_anomalies |
|
|
2611
2629
|
| `VEHICLE_ORDERS_MINIMAL` | `list_vehicle_orders` | key, piid, award_date, recipient(display_name,uei), total_contract_value, obligated |
|
|
2612
2630
|
| `ITDASHBOARD_INVESTMENTS_MINIMAL` | `list_itdashboard_investments` | Minimal IT Dashboard investment fields |
|
|
@@ -1365,6 +1365,10 @@ class EbuyAttachment:
|
|
|
1365
1365
|
"""Schema definition for one entry in an eBuy request's ``attachments`` (not used for instances).
|
|
1366
1366
|
|
|
1367
1367
|
``is_link=True`` means the entry is an outbound URL in ``doc_path`` with no stored document behind it, so ``get_ebuy_attachment_url()`` raises ``TangoAttachmentLinkError`` for it.
|
|
1368
|
+
|
|
1369
|
+
``extracted_text`` (Tango API 5.9.1) is the text extracted from the attachment's document.
|
|
1370
|
+
It must be named, e.g. ``attachments(doc_seq_num,doc_name,extracted_text)``, because neither the default response nor ``attachments(*)`` includes it.
|
|
1371
|
+
An attachment with no text (a link, an empty scan, or a document not yet extracted) omits the key from the API response rather than returning null; the SDK's shaped result reads that as ``None``.
|
|
1368
1372
|
"""
|
|
1369
1373
|
|
|
1370
1374
|
doc_seq_num: int | None = None
|
|
@@ -1373,6 +1377,7 @@ class EbuyAttachment:
|
|
|
1373
1377
|
doc_path: str | None = None
|
|
1374
1378
|
is_link: bool | None = None
|
|
1375
1379
|
doc_session_date: datetime | None = None
|
|
1380
|
+
extracted_text: str | None = None
|
|
1376
1381
|
|
|
1377
1382
|
|
|
1378
1383
|
class EbuyRequest:
|
|
@@ -1660,7 +1665,7 @@ class ShapeConfig:
|
|
|
1660
1665
|
"link_count,last_seen"
|
|
1661
1666
|
)
|
|
1662
1667
|
|
|
1663
|
-
# Default for get_ebuy_request(). Mirrors the API's own retrieve default; the attachment fields are named rather than `attachments(*)` so their dates parse.
|
|
1668
|
+
# Default for get_ebuy_request(). Mirrors the API's own retrieve default; the attachment fields are named rather than `attachments(*)` so their dates parse. `extracted_text` is left out because document bodies are large and the API serves them only when named.
|
|
1664
1669
|
EBUY_REQUESTS_COMPREHENSIVE: Final = (
|
|
1665
1670
|
"rfq_id,request_type,title,description,schedule,sin,status,buyer_name,"
|
|
1666
1671
|
"buyer_agency,buyer_agency_code,buyer_email,buyer_user_id,reference_number,"
|
|
@@ -886,6 +886,8 @@ EBUY_ATTACHMENT_SCHEMA: dict[str, FieldSchema] = {
|
|
|
886
886
|
"doc_session_date": FieldSchema(
|
|
887
887
|
name="doc_session_date", type=datetime, is_optional=True, is_list=False
|
|
888
888
|
),
|
|
889
|
+
# Only when named in the shape; the API omits the key for an attachment with no text.
|
|
890
|
+
"extracted_text": FieldSchema(name="extracted_text", type=str, is_optional=True, is_list=False),
|
|
889
891
|
}
|
|
890
892
|
|
|
891
893
|
|
|
@@ -212,6 +212,26 @@ class TestGetEbuyRequest:
|
|
|
212
212
|
assert row["attachments"][1]["is_link"] is True
|
|
213
213
|
assert isinstance(row["attachments"][0]["doc_session_date"], datetime)
|
|
214
214
|
|
|
215
|
+
@patch("tango.client.httpx.Client.request")
|
|
216
|
+
def test_extracted_text_is_read_when_named_and_none_without_text(self, mock_request):
|
|
217
|
+
shape = "rfq_id,attachments(doc_seq_num,is_link,extracted_text)"
|
|
218
|
+
_mock(
|
|
219
|
+
mock_request,
|
|
220
|
+
{
|
|
221
|
+
"rfq_id": RFQ_ID,
|
|
222
|
+
"attachments": [
|
|
223
|
+
{"doc_seq_num": 1, "is_link": False, "extracted_text": "Statement of work"},
|
|
224
|
+
{"doc_seq_num": 2, "is_link": True},
|
|
225
|
+
],
|
|
226
|
+
},
|
|
227
|
+
)
|
|
228
|
+
row = TangoClient(api_key="k").get_ebuy_request(RFQ_ID, shape=shape)
|
|
229
|
+
|
|
230
|
+
assert _call_params(mock_request)["shape"] == shape
|
|
231
|
+
assert row["attachments"][0]["extracted_text"] == "Statement of work"
|
|
232
|
+
assert row["attachments"][1].get("extracted_text") is None
|
|
233
|
+
assert row["attachments"][1]["extracted_text"] is None
|
|
234
|
+
|
|
215
235
|
@patch("tango.client.httpx.Client.request")
|
|
216
236
|
def test_out_of_scope_request_is_not_found(self, mock_request):
|
|
217
237
|
mock_request.return_value = _response(404, {"detail": "No EbuyRequest matches."})
|
|
@@ -310,12 +330,22 @@ class TestEbuyShapes:
|
|
|
310
330
|
ShapeConfig.EBUY_REQUESTS_COMPREHENSIVE,
|
|
311
331
|
"rfq_id,organization(agency_code,office_name),attachments(doc_seq_num,is_link)",
|
|
312
332
|
"rfq_id,amendments,line_items,addresses,oco_aac,ocs_phone",
|
|
333
|
+
"rfq_id,attachments(extracted_text)",
|
|
334
|
+
"rfq_id,attachments(doc_seq_num,doc_name,extracted_text)",
|
|
313
335
|
],
|
|
314
336
|
)
|
|
315
337
|
def test_shape_validates(self, shape):
|
|
316
338
|
parser = ShapeParser(cache_enabled=True)
|
|
317
339
|
parser.validate(parser.parse(shape), EbuyRequest)
|
|
318
340
|
|
|
341
|
+
@pytest.mark.parametrize(
|
|
342
|
+
"shape",
|
|
343
|
+
[ShapeConfig.EBUY_REQUESTS_MINIMAL, ShapeConfig.EBUY_REQUESTS_COMPREHENSIVE],
|
|
344
|
+
)
|
|
345
|
+
def test_default_shapes_leave_extracted_text_opt_in(self, shape):
|
|
346
|
+
assert "extracted_text" not in shape
|
|
347
|
+
assert "attachments(*)" not in shape
|
|
348
|
+
|
|
319
349
|
def test_contract_number_is_a_filter_not_a_response_field(self):
|
|
320
350
|
parser = ShapeParser(cache_enabled=True)
|
|
321
351
|
with pytest.raises(ShapeValidationError):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestAgenciesIntegration.test_get_agency
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestNaicsIntegration.test_list_naics
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestOTAsIntegration.test_get_ota
RENAMED
|
File without changes
|
{tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestOTAsIntegration.test_list_otas
RENAMED
|
File without changes
|
{tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestOTIDVsIntegration.test_get_otidv
RENAMED
|
File without changes
|
{tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestOTIDVsIntegration.test_list_otidvs
RENAMED
|
File without changes
|
{tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestOfficesIntegration.test_get_office
RENAMED
|
File without changes
|
{tango_python-1.15.0 → tango_python-1.16.0}/tests/cassettes/TestOfficesIntegration.test_list_offices
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_edge_cases_integration.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_itdashboard_integration.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_opportunities_integration.py
RENAMED
|
File without changes
|
{tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_organizations_integration.py
RENAMED
|
File without changes
|
{tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_otas_otidvs_integration.py
RENAMED
|
File without changes
|
|
File without changes
|
{tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_reference_data_integration.py
RENAMED
|
File without changes
|
|
File without changes
|
{tango_python-1.15.0 → tango_python-1.16.0}/tests/integration/test_vehicles_idvs_integration.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|