helix.fhir.client.sdk 4.2.8__tar.gz → 4.2.10__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.
- {helix_fhir_client_sdk-4.2.8/helix.fhir.client.sdk.egg-info → helix_fhir_client_sdk-4.2.10}/PKG-INFO +47 -2
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/README.md +46 -1
- helix_fhir_client_sdk-4.2.10/VERSION +1 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10/helix.fhir.client.sdk.egg-info}/PKG-INFO +47 -2
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix.fhir.client.sdk.egg-info/SOURCES.txt +2 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/fhir_client.py +39 -11
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/fhir_merge_resources_mixin.py +191 -3
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/merge/fhir_merge_resource_response_entry.py +30 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/retryable_aiohttp_client.py +1 -2
- helix_fhir_client_sdk-4.2.10/tests/async/test_benchmark_compress.py +448 -0
- helix_fhir_client_sdk-4.2.10/tests/test_fhir_client_clone.py +78 -0
- helix_fhir_client_sdk-4.2.8/VERSION +0 -1
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/LICENSE +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/MANIFEST.in +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/Makefile +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix.fhir.client.sdk.egg-info/dependency_links.txt +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix.fhir.client.sdk.egg-info/not-zip-safe +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix.fhir.client.sdk.egg-info/requires.txt +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix.fhir.client.sdk.egg-info/top_level.txt +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/dictionary_parser.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/dictionary_writer.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/exceptions/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/exceptions/fhir_get_exception.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/exceptions/fhir_sender_exception.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/exceptions/fhir_validation_exception.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/fhir_auth_mixin.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/fhir_bundle_appender.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/fhir_delete_mixin.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/fhir_merge_mixin.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/fhir_patch_mixin.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/fhir_update_mixin.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/filters/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/filters/base_filter.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/filters/identifier_filter.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/filters/last_updated_filter.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/filters/property_filter.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/filters/property_missing_filter.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/filters/security_access_filter.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/filters/security_owner_filter.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/filters/sort_field.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/filters/source_filter.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/filters/version_filter.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/function_types.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/graph/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/graph/fhir_graph_mixin.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/graph/graph_definition.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/graph/graph_link_parameters.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/graph/graph_target_parameters.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/graph/simulated_graph_processor_mixin.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/graph/test/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/graph/test/test_graph_mixin.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/graph/test/test_simulate_graph_processor_mixin.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/graph/test/test_simulate_graph_processor_mixin_caching.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/open_telemetry/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/open_telemetry/attribute_names.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/open_telemetry/span_names.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/py.typed +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/queue/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/queue/request_queue_mixin.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/bundle_expander.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/fhir_client_protocol.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/fhir_delete_response.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/fhir_get_response.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/fhir_merge_response.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/fhir_response_processor.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/fhir_update_response.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/get/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/get/fhir_get_bundle_response.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/get/fhir_get_error_response.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/get/fhir_get_list_by_resource_type_response.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/get/fhir_get_list_response.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/get/fhir_get_response_factory.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/get/fhir_get_single_response.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/get/test/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/get/test/test_get_bundle_response.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/get/test/test_get_error_response.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/get/test/test_get_list_by_resource_type_response.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/get/test/test_get_list_response.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/get/test/test_get_response_factory.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/get/test/test_get_single_response.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/get_result.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/merge/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/merge/base_fhir_merge_resource_response_entry.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/merge/fhir_merge_resource_response.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/merge/fhir_merge_response_entry_issue.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/paging_result.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/resource_separator.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/test/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/test/fhir_response_processor/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/test/fhir_response_processor/test_expand_or_separate_bundle_async.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/test/fhir_response_processor/test_handle_response_200.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/test/fhir_response_processor/test_handle_response_200_non_streaming.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/test/fhir_response_processor/test_handle_response_200_non_streaming_separate_bundle.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/test/fhir_response_processor/test_handle_response_200_streaming.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/test/fhir_response_processor/test_handle_response_200_streaming_separate_bundle.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/test/fhir_response_processor/test_handle_response_200_streaming_separate_bundle_ndjson.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/test/fhir_response_processor/test_handle_response_404.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/test/test_bundle_expander.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/test/test_fhir_get_response.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/responses/test/test_resource_separator.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/structures/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/structures/get_access_token_result.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/test/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/test/test_delete_mixin.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/test/test_fhir_auth_mixin.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/test/test_fhir_bundle_appender.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/test/test_merge_mixin.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/test/test_merge_mixin_resources.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/async_parallel_processor/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/async_parallel_processor/v1/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/async_parallel_processor/v1/async_parallel_processor.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/async_runner.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/cache/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/cache/request_cache.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/cache/request_cache_entry.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/fhir_client_logger.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/fhir_helper.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/fhir_scope_parser.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/fhir_scope_parser_result.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/fhir_server_helpers.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/hash_util.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/list_chunker.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/ndjson_chunk_streaming_parser.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/practitioner_generator.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/retryable_aiohttp_response.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/retryable_aiohttp_url_result.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/size_calculator/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/size_calculator/size_calculator.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/test/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/test/test_async_runner.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/test/test_fhir_scope_parser.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/test/test_fhir_scope_parser_can_parse_scopes.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/test/test_fhir_scope_parser_correct_allow.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/test/test_json_helpers.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/test/test_list_chunker.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/test/test_ndjson_chunk_streaming_parser.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/test/test_retryable_aiohttp_client.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/utilities/url_checker.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/validators/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/validators/async_fhir_validator.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/validators/fhir_validator.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/validators/test/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/validators/test/test_async_fhir_validator.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/well_known_configuration.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/pyproject.toml +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/setup.cfg +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/setup.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/fhir_server/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/fhir_server/test_async_real_fhir_server_get_graph_large.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/fhir_server/test_async_real_fhir_server_get_patients_large.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/graph/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/graph/test_fhir_graph.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/graph/test_fhir_graph_multiple_ids.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/graph/test_fhir_graph_multiple_ids_in_batches.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/simulated_graph/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/simulated_graph/test_fhir_simulated_graph_async.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/simulated_graph/test_fhir_simulated_graph_caching_async.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/simulated_graph/test_fhir_simulated_graph_caching_input_cache_async.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/simulated_graph/test_fhir_simulated_graph_caching_input_cache_if_modified_since_async.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/simulated_graph/test_fhir_simulated_graph_caching_scope_parser_async.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/simulated_graph/test_fhir_simulated_graph_separate_resources_async.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/simulated_graph/test_fhir_simulated_graph_with_errors_async.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/simulated_graph/test_fhir_simulated_graph_with_operation_outcomes_async.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/simulated_graph/test_fhir_simulated_graph_with_url_column_async.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/simulated_graph_practitioner/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/simulated_graph_practitioner/test_fhir_simulated_graph_multiple_practitioner_async.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/simulated_graph_practitioner/test_fhir_simulated_graph_multiple_practitioner_in_one_call_async.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/simulated_graph_practitioner/test_fhir_simulated_graph_multiple_practitioner_in_one_call_async_with_request_size.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/simulated_graph_practitioner/test_fhir_simulated_graph_practitioner_async.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/simulated_graph_practitioner/test_fhir_simulated_graph_practitioner_separate_resources_async.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/test_async_fhir_client_bundle/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/test_async_fhir_client_bundle/not_expanded/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/test_async_fhir_client_bundle/not_expanded/test_fhir_client_bundle_not_expanded.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/test_async_fhir_client_bundle/not_separated/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/test_async_fhir_client_bundle/not_separated/test_fhir_client_bundle_not_separated.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/test_async_fhir_client_bundle/separated/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/test_async_fhir_client_bundle/separated/test_fhir_client_bundle_separated.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/test_async_fhir_client_fetch_response_in_chunks.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/test_async_fhir_client_patient_by_id.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/test_async_fhir_client_patient_by_identifier_missing.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/test_async_fhir_client_patient_delete.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/test_async_fhir_client_patient_list.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/test_async_fhir_client_patient_list_auth_fail.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/test_async_fhir_client_patient_list_auth_fail_retry.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/test_async_fhir_client_patient_list_auth_fail_retry_custom_refresh_function.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/test_async_fhir_client_patient_list_resource_streaming.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/test_async_fhir_client_patient_list_streaming.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/test_async_fhir_client_patient_merge.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/test_async_fhir_client_patient_merge_with_validate.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/test_async_fhir_client_patient_update.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/test_async_real_fhir_server_get_patients.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/async/test_async_real_fhir_server_get_patients_error.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/logger_for_test.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/sync/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/sync/graph/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/sync/graph/test_fhir_graph.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/sync/test_fhir_client_bundle/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/sync/test_fhir_client_bundle/not_expanded/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/sync/test_fhir_client_bundle/not_expanded/test_fhir_client_bundle_not_expanded.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/sync/test_fhir_client_bundle/not_separated/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/sync/test_fhir_client_bundle/not_separated/test_fhir_client_bundle_not_separated.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/sync/test_fhir_client_bundle/separated/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/sync/test_fhir_client_bundle/separated/test_fhir_client_bundle_separated.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/sync/test_fhir_client_logs_not_contains_secret_information.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/sync/test_fhir_client_patient_by_id.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/sync/test_fhir_client_patient_delete.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/sync/test_fhir_client_patient_list.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/sync/test_fhir_client_patient_list_auth_fail.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/sync/test_fhir_client_patient_list_auth_fail_retry.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/sync/test_fhir_client_patient_merge.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/sync/test_fhir_client_patient_update.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/sync/test_fhir_client_patient_update_patch.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests/test_get_nested_property.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests_integration/__init__.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests_integration/test_aetna_server_auth.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests_integration/test_aetna_server_auth_aiohttp.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests_integration/test_aetna_server_auth_httpx.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests_integration/test_dev_server_auth.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests_integration/test_dev_server_no_auth.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests_integration/test_emr_server_auth.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests_integration/test_firely_fhir.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests_integration/test_merge_vs_smart_merge_behavior.py +0 -0
- {helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/tests_integration/test_staging_server_graph.py +0 -0
{helix_fhir_client_sdk-4.2.8/helix.fhir.client.sdk.egg-info → helix_fhir_client_sdk-4.2.10}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: helix.fhir.client.sdk
|
|
3
|
-
Version: 4.2.
|
|
3
|
+
Version: 4.2.10
|
|
4
4
|
Summary: helix.fhir.client.sdk
|
|
5
5
|
Home-page: https://github.com/icanbwell/helix.fhir.client.sdk
|
|
6
6
|
Author: Imran Qureshi
|
|
@@ -115,4 +115,49 @@ For FHIR servers that support data streaming (e.g., b.well FHIR server), you can
|
|
|
115
115
|
The data will be streamed in AsyncGenerators as described above.
|
|
116
116
|
|
|
117
117
|
# Storage Compression
|
|
118
|
-
The FHIR client SDK
|
|
118
|
+
The FHIR client SDK supports two types of compression:
|
|
119
|
+
|
|
120
|
+
1. **HTTP Compression** (`compress`): Compresses HTTP request body when sending data to the server. Default: **enabled**
|
|
121
|
+
2. **In-Memory Storage** (`storage_mode`): Controls how FHIR resources are stored in memory. Default: **raw (no compression)**
|
|
122
|
+
|
|
123
|
+
## Disabling HTTP Compression
|
|
124
|
+
HTTP compression (gzip) is enabled by default for request bodies. To disable it:
|
|
125
|
+
|
|
126
|
+
```python
|
|
127
|
+
from helix_fhir_client_sdk.fhir_client import FhirClient
|
|
128
|
+
|
|
129
|
+
# Disable HTTP compression for requests
|
|
130
|
+
fhir_client = FhirClient().url("https://fhir.example.com").compress(False)
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## In-Memory Storage Modes
|
|
134
|
+
The SDK supports different storage modes for FHIR resources through the `set_storage_mode()` method.
|
|
135
|
+
By default, resources are stored as raw Python dictionaries (no compression).
|
|
136
|
+
|
|
137
|
+
```python
|
|
138
|
+
from helix_fhir_client_sdk.fhir_client import FhirClient
|
|
139
|
+
from compressedfhir.utilities.compressed_dict.v1.compressed_dict_storage_mode import CompressedDictStorageMode
|
|
140
|
+
|
|
141
|
+
# Use raw storage (default) - no compression, resources stored as plain Python dicts
|
|
142
|
+
fhir_client = FhirClient().set_storage_mode(CompressedDictStorageMode(storage_type="raw"))
|
|
143
|
+
|
|
144
|
+
# Use msgpack storage - stores resources in msgpack format
|
|
145
|
+
fhir_client = FhirClient().set_storage_mode(CompressedDictStorageMode(storage_type="msgpack"))
|
|
146
|
+
|
|
147
|
+
# Use compressed msgpack storage - stores resources in compressed msgpack format
|
|
148
|
+
fhir_client = FhirClient().set_storage_mode(CompressedDictStorageMode(storage_type="compressed_msgpack"))
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Available storage types:
|
|
152
|
+
- `raw`: Default. Resources are stored as standard Python dictionaries (no compression)
|
|
153
|
+
- `msgpack`: Resources are serialized using MessagePack for efficient storage
|
|
154
|
+
- `compressed_msgpack`: Resources are serialized using MessagePack and then compressed
|
|
155
|
+
|
|
156
|
+
## Getting Raw Python Dictionaries
|
|
157
|
+
To completely bypass the `compressedfhir` library and get plain Python dictionaries:
|
|
158
|
+
|
|
159
|
+
```python
|
|
160
|
+
# Returns plain Python dicts, not FhirResource objects
|
|
161
|
+
result = await fhir_client.get_raw_resources_async()
|
|
162
|
+
resources = result["_resources"] # list[dict[str, Any]]
|
|
163
|
+
```
|
|
@@ -79,4 +79,49 @@ For FHIR servers that support data streaming (e.g., b.well FHIR server), you can
|
|
|
79
79
|
The data will be streamed in AsyncGenerators as described above.
|
|
80
80
|
|
|
81
81
|
# Storage Compression
|
|
82
|
-
The FHIR client SDK
|
|
82
|
+
The FHIR client SDK supports two types of compression:
|
|
83
|
+
|
|
84
|
+
1. **HTTP Compression** (`compress`): Compresses HTTP request body when sending data to the server. Default: **enabled**
|
|
85
|
+
2. **In-Memory Storage** (`storage_mode`): Controls how FHIR resources are stored in memory. Default: **raw (no compression)**
|
|
86
|
+
|
|
87
|
+
## Disabling HTTP Compression
|
|
88
|
+
HTTP compression (gzip) is enabled by default for request bodies. To disable it:
|
|
89
|
+
|
|
90
|
+
```python
|
|
91
|
+
from helix_fhir_client_sdk.fhir_client import FhirClient
|
|
92
|
+
|
|
93
|
+
# Disable HTTP compression for requests
|
|
94
|
+
fhir_client = FhirClient().url("https://fhir.example.com").compress(False)
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## In-Memory Storage Modes
|
|
98
|
+
The SDK supports different storage modes for FHIR resources through the `set_storage_mode()` method.
|
|
99
|
+
By default, resources are stored as raw Python dictionaries (no compression).
|
|
100
|
+
|
|
101
|
+
```python
|
|
102
|
+
from helix_fhir_client_sdk.fhir_client import FhirClient
|
|
103
|
+
from compressedfhir.utilities.compressed_dict.v1.compressed_dict_storage_mode import CompressedDictStorageMode
|
|
104
|
+
|
|
105
|
+
# Use raw storage (default) - no compression, resources stored as plain Python dicts
|
|
106
|
+
fhir_client = FhirClient().set_storage_mode(CompressedDictStorageMode(storage_type="raw"))
|
|
107
|
+
|
|
108
|
+
# Use msgpack storage - stores resources in msgpack format
|
|
109
|
+
fhir_client = FhirClient().set_storage_mode(CompressedDictStorageMode(storage_type="msgpack"))
|
|
110
|
+
|
|
111
|
+
# Use compressed msgpack storage - stores resources in compressed msgpack format
|
|
112
|
+
fhir_client = FhirClient().set_storage_mode(CompressedDictStorageMode(storage_type="compressed_msgpack"))
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Available storage types:
|
|
116
|
+
- `raw`: Default. Resources are stored as standard Python dictionaries (no compression)
|
|
117
|
+
- `msgpack`: Resources are serialized using MessagePack for efficient storage
|
|
118
|
+
- `compressed_msgpack`: Resources are serialized using MessagePack and then compressed
|
|
119
|
+
|
|
120
|
+
## Getting Raw Python Dictionaries
|
|
121
|
+
To completely bypass the `compressedfhir` library and get plain Python dictionaries:
|
|
122
|
+
|
|
123
|
+
```python
|
|
124
|
+
# Returns plain Python dicts, not FhirResource objects
|
|
125
|
+
result = await fhir_client.get_raw_resources_async()
|
|
126
|
+
resources = result["_resources"] # list[dict[str, Any]]
|
|
127
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
4.2.10
|
{helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10/helix.fhir.client.sdk.egg-info}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: helix.fhir.client.sdk
|
|
3
|
-
Version: 4.2.
|
|
3
|
+
Version: 4.2.10
|
|
4
4
|
Summary: helix.fhir.client.sdk
|
|
5
5
|
Home-page: https://github.com/icanbwell/helix.fhir.client.sdk
|
|
6
6
|
Author: Imran Qureshi
|
|
@@ -115,4 +115,49 @@ For FHIR servers that support data streaming (e.g., b.well FHIR server), you can
|
|
|
115
115
|
The data will be streamed in AsyncGenerators as described above.
|
|
116
116
|
|
|
117
117
|
# Storage Compression
|
|
118
|
-
The FHIR client SDK
|
|
118
|
+
The FHIR client SDK supports two types of compression:
|
|
119
|
+
|
|
120
|
+
1. **HTTP Compression** (`compress`): Compresses HTTP request body when sending data to the server. Default: **enabled**
|
|
121
|
+
2. **In-Memory Storage** (`storage_mode`): Controls how FHIR resources are stored in memory. Default: **raw (no compression)**
|
|
122
|
+
|
|
123
|
+
## Disabling HTTP Compression
|
|
124
|
+
HTTP compression (gzip) is enabled by default for request bodies. To disable it:
|
|
125
|
+
|
|
126
|
+
```python
|
|
127
|
+
from helix_fhir_client_sdk.fhir_client import FhirClient
|
|
128
|
+
|
|
129
|
+
# Disable HTTP compression for requests
|
|
130
|
+
fhir_client = FhirClient().url("https://fhir.example.com").compress(False)
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## In-Memory Storage Modes
|
|
134
|
+
The SDK supports different storage modes for FHIR resources through the `set_storage_mode()` method.
|
|
135
|
+
By default, resources are stored as raw Python dictionaries (no compression).
|
|
136
|
+
|
|
137
|
+
```python
|
|
138
|
+
from helix_fhir_client_sdk.fhir_client import FhirClient
|
|
139
|
+
from compressedfhir.utilities.compressed_dict.v1.compressed_dict_storage_mode import CompressedDictStorageMode
|
|
140
|
+
|
|
141
|
+
# Use raw storage (default) - no compression, resources stored as plain Python dicts
|
|
142
|
+
fhir_client = FhirClient().set_storage_mode(CompressedDictStorageMode(storage_type="raw"))
|
|
143
|
+
|
|
144
|
+
# Use msgpack storage - stores resources in msgpack format
|
|
145
|
+
fhir_client = FhirClient().set_storage_mode(CompressedDictStorageMode(storage_type="msgpack"))
|
|
146
|
+
|
|
147
|
+
# Use compressed msgpack storage - stores resources in compressed msgpack format
|
|
148
|
+
fhir_client = FhirClient().set_storage_mode(CompressedDictStorageMode(storage_type="compressed_msgpack"))
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Available storage types:
|
|
152
|
+
- `raw`: Default. Resources are stored as standard Python dictionaries (no compression)
|
|
153
|
+
- `msgpack`: Resources are serialized using MessagePack for efficient storage
|
|
154
|
+
- `compressed_msgpack`: Resources are serialized using MessagePack and then compressed
|
|
155
|
+
|
|
156
|
+
## Getting Raw Python Dictionaries
|
|
157
|
+
To completely bypass the `compressedfhir` library and get plain Python dictionaries:
|
|
158
|
+
|
|
159
|
+
```python
|
|
160
|
+
# Returns plain Python dicts, not FhirResource objects
|
|
161
|
+
result = await fhir_client.get_raw_resources_async()
|
|
162
|
+
resources = result["_resources"] # list[dict[str, Any]]
|
|
163
|
+
```
|
|
@@ -146,6 +146,7 @@ helix_fhir_client_sdk/validators/test/__init__.py
|
|
|
146
146
|
helix_fhir_client_sdk/validators/test/test_async_fhir_validator.py
|
|
147
147
|
tests/__init__.py
|
|
148
148
|
tests/logger_for_test.py
|
|
149
|
+
tests/test_fhir_client_clone.py
|
|
149
150
|
tests/test_get_nested_property.py
|
|
150
151
|
tests/async/__init__.py
|
|
151
152
|
tests/async/test_async_fhir_client_fetch_response_in_chunks.py
|
|
@@ -163,6 +164,7 @@ tests/async/test_async_fhir_client_patient_merge_with_validate.py
|
|
|
163
164
|
tests/async/test_async_fhir_client_patient_update.py
|
|
164
165
|
tests/async/test_async_real_fhir_server_get_patients.py
|
|
165
166
|
tests/async/test_async_real_fhir_server_get_patients_error.py
|
|
167
|
+
tests/async/test_benchmark_compress.py
|
|
166
168
|
tests/async/fhir_server/__init__.py
|
|
167
169
|
tests/async/fhir_server/test_async_real_fhir_server_get_graph_large.py
|
|
168
170
|
tests/async/fhir_server/test_async_real_fhir_server_get_patients_large.py
|
{helix_fhir_client_sdk-4.2.8 → helix_fhir_client_sdk-4.2.10}/helix_fhir_client_sdk/fhir_client.py
RENAMED
|
@@ -150,9 +150,10 @@ class FhirClient(
|
|
|
150
150
|
self._log_all_response_urls: bool = False
|
|
151
151
|
""" If True, logs all response URLs and status codes. Can take a lot of memory for when there are many responses. """
|
|
152
152
|
|
|
153
|
-
|
|
153
|
+
# Default to "raw" storage mode - no in-memory compression, resources stored as plain Python dicts
|
|
154
|
+
self._storage_mode: CompressedDictStorageMode = CompressedDictStorageMode(storage_type="raw")
|
|
154
155
|
|
|
155
|
-
self._create_operation_outcome_for_error = False
|
|
156
|
+
self._create_operation_outcome_for_error: bool | None = False
|
|
156
157
|
|
|
157
158
|
def action(self, action: str) -> FhirClient:
|
|
158
159
|
"""
|
|
@@ -455,9 +456,14 @@ class FhirClient(
|
|
|
455
456
|
|
|
456
457
|
def compress(self, compress: bool) -> FhirClient:
|
|
457
458
|
"""
|
|
458
|
-
Sets the
|
|
459
|
+
Sets whether to use HTTP compression (gzip) when sending request data to the server.
|
|
459
460
|
|
|
460
|
-
|
|
461
|
+
This controls compression of the HTTP request body only, not in-memory storage.
|
|
462
|
+
Default is True (compression enabled).
|
|
463
|
+
|
|
464
|
+
To disable all compression, call: .compress(False)
|
|
465
|
+
|
|
466
|
+
:param compress: whether to compress HTTP request body (default: True)
|
|
461
467
|
"""
|
|
462
468
|
self._compress = compress
|
|
463
469
|
return self
|
|
@@ -826,17 +832,17 @@ class FhirClient(
|
|
|
826
832
|
Whether to ask the server to include the total count in the result
|
|
827
833
|
|
|
828
834
|
|
|
829
|
-
:param include_total: whether to include total count
|
|
835
|
+
:param include_total: whether to include the total count
|
|
830
836
|
"""
|
|
831
837
|
self._include_total = include_total
|
|
832
838
|
return self
|
|
833
839
|
|
|
834
840
|
def filter(self, filter_: list[BaseFilter]) -> FhirClient:
|
|
835
841
|
"""
|
|
836
|
-
Allows adding in
|
|
842
|
+
Allows adding in custom filters that derive from BaseFilter
|
|
837
843
|
|
|
838
844
|
|
|
839
|
-
:param filter_: list of custom filter instances that
|
|
845
|
+
:param filter_: list of custom filter instances that derive from BaseFilter.
|
|
840
846
|
"""
|
|
841
847
|
assert isinstance(filter_, list), "This function requires a list"
|
|
842
848
|
self._filters.extend(filter_)
|
|
@@ -889,6 +895,16 @@ class FhirClient(
|
|
|
889
895
|
fhir_client._time_to_live_in_secs_for_cache = self._time_to_live_in_secs_for_cache
|
|
890
896
|
fhir_client._validation_server_url = self._validation_server_url
|
|
891
897
|
fhir_client._smart_merge = self._smart_merge
|
|
898
|
+
fhir_client._compress = self._compress
|
|
899
|
+
fhir_client._storage_mode = self._storage_mode
|
|
900
|
+
fhir_client._send_data_as_chunked = self._send_data_as_chunked
|
|
901
|
+
fhir_client._use_post_for_search = self._use_post_for_search
|
|
902
|
+
fhir_client._maximum_time_to_retry_on_429 = self._maximum_time_to_retry_on_429
|
|
903
|
+
fhir_client._retry_count = self._retry_count
|
|
904
|
+
fhir_client._throw_exception_on_error = self._throw_exception_on_error
|
|
905
|
+
fhir_client._trace_request_function = self._trace_request_function
|
|
906
|
+
fhir_client._log_all_response_urls = self._log_all_response_urls
|
|
907
|
+
fhir_client._create_operation_outcome_for_error = self._create_operation_outcome_for_error
|
|
892
908
|
return fhir_client
|
|
893
909
|
|
|
894
910
|
def set_log_all_response_urls(self, value: bool) -> FhirClient:
|
|
@@ -911,18 +927,30 @@ class FhirClient(
|
|
|
911
927
|
|
|
912
928
|
def set_storage_mode(self, value: CompressedDictStorageMode) -> FhirClient:
|
|
913
929
|
"""
|
|
914
|
-
Sets the storage mode
|
|
930
|
+
Sets the in-memory storage mode for FHIR resources.
|
|
931
|
+
|
|
932
|
+
This controls how FHIR resources are stored in memory after being received.
|
|
933
|
+
The default is "raw" (no compression - resources stored as plain Python dicts).
|
|
934
|
+
|
|
935
|
+
Available storage types:
|
|
936
|
+
- "raw": No compression, standard Python dictionaries (default)
|
|
937
|
+
- "compressed": Zlib/gzip compression in memory
|
|
938
|
+
- "msgpack": MessagePack binary serialization
|
|
939
|
+
- "compressed_msgpack": MessagePack + compression
|
|
940
|
+
|
|
941
|
+
Note: This is separate from HTTP compression (controlled by .compress()).
|
|
942
|
+
With default settings, no in-memory compression is applied.
|
|
915
943
|
|
|
916
|
-
:param value: storage mode
|
|
944
|
+
:param value: storage mode (default: raw)
|
|
917
945
|
"""
|
|
918
946
|
self._storage_mode = value
|
|
919
947
|
return self
|
|
920
948
|
|
|
921
|
-
def set_create_operation_outcome_for_error(self, value: bool) -> FhirClient:
|
|
949
|
+
def set_create_operation_outcome_for_error(self, value: bool | None) -> FhirClient:
|
|
922
950
|
"""
|
|
923
951
|
Sets the create_operation_outcome_for_error flag
|
|
924
952
|
|
|
925
|
-
:param value: whether to create operation outcome for error
|
|
953
|
+
:param value: whether to create an operation outcome for error (True, False, or None)
|
|
926
954
|
"""
|
|
927
955
|
self._create_operation_outcome_for_error = value
|
|
928
956
|
return self
|
|
@@ -2,9 +2,7 @@ import json
|
|
|
2
2
|
import time
|
|
3
3
|
from collections import deque
|
|
4
4
|
from collections.abc import AsyncGenerator
|
|
5
|
-
from typing import
|
|
6
|
-
cast,
|
|
7
|
-
)
|
|
5
|
+
from typing import Any, cast
|
|
8
6
|
from urllib import parse
|
|
9
7
|
|
|
10
8
|
import requests
|
|
@@ -45,6 +43,196 @@ from helix_fhir_client_sdk.validators.async_fhir_validator import AsyncFhirValid
|
|
|
45
43
|
|
|
46
44
|
|
|
47
45
|
class FhirMergeResourcesMixin(FhirClientProtocol):
|
|
46
|
+
async def merge_bundle_uncompressed(
|
|
47
|
+
self,
|
|
48
|
+
id_: str | None,
|
|
49
|
+
bundle: FhirBundle,
|
|
50
|
+
) -> FhirMergeResourceResponse:
|
|
51
|
+
"""
|
|
52
|
+
Optimized variant of :meth:`merge_bundle_async` that bypasses storage-mode handling.
|
|
53
|
+
Use this method when you do not need storage-mode behavior, or features such as request/response compression.
|
|
54
|
+
:param id_: id of the resource to merge
|
|
55
|
+
:param bundle: FHIR Bundle to merge
|
|
56
|
+
:return: FhirMergeResourceResponse
|
|
57
|
+
"""
|
|
58
|
+
# Initialize profiling dictionary
|
|
59
|
+
profiling: dict[str, float] = {
|
|
60
|
+
"total_time": 0.0,
|
|
61
|
+
"build_url": 0.0,
|
|
62
|
+
"get_access_token": 0.0,
|
|
63
|
+
"prepare_payload": 0.0,
|
|
64
|
+
"http_post": 0.0,
|
|
65
|
+
"parse_response": 0.0,
|
|
66
|
+
"create_response_objects": 0.0,
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
merge_start_time = time.time()
|
|
70
|
+
|
|
71
|
+
request_id: str | None = None
|
|
72
|
+
response_status: int = 500
|
|
73
|
+
|
|
74
|
+
# Build URL
|
|
75
|
+
build_url_start = time.time()
|
|
76
|
+
full_uri: furl = furl(self._url)
|
|
77
|
+
full_uri /= self._resource
|
|
78
|
+
|
|
79
|
+
# Prepare headers
|
|
80
|
+
headers = {"Content-Type": "application/fhir+json"}
|
|
81
|
+
headers.update(self._additional_request_headers)
|
|
82
|
+
profiling["build_url"] = time.time() - build_url_start
|
|
83
|
+
|
|
84
|
+
# Get access token
|
|
85
|
+
get_token_start = time.time()
|
|
86
|
+
access_token_result: GetAccessTokenResult = await self.get_access_token_async()
|
|
87
|
+
access_token: str | None = access_token_result.access_token
|
|
88
|
+
if access_token:
|
|
89
|
+
headers["Authorization"] = f"Bearer {access_token}"
|
|
90
|
+
profiling["get_access_token"] = time.time() - get_token_start
|
|
91
|
+
|
|
92
|
+
# Prepare JSON payload
|
|
93
|
+
prepare_payload_start = time.time()
|
|
94
|
+
first_resource: FhirResource | None = bundle.entry[0].resource
|
|
95
|
+
assert first_resource is not None
|
|
96
|
+
json_payload: str = first_resource.json() if len(bundle.entry) == 1 else bundle.json()
|
|
97
|
+
|
|
98
|
+
# Build merge URL
|
|
99
|
+
obj_id: str = id_ or "1"
|
|
100
|
+
resource_uri: furl = full_uri / parse.quote(str(obj_id), safe="") / "$merge"
|
|
101
|
+
profiling["prepare_payload"] = time.time() - prepare_payload_start
|
|
102
|
+
|
|
103
|
+
response_text: str | None = None
|
|
104
|
+
responses: list[dict[str, Any]] = []
|
|
105
|
+
errors: list[dict[str, Any]] = []
|
|
106
|
+
|
|
107
|
+
try:
|
|
108
|
+
async with RetryableAioHttpClient(
|
|
109
|
+
fn_get_session=self.create_http_session,
|
|
110
|
+
refresh_token_func=self._refresh_token_function,
|
|
111
|
+
tracer_request_func=self._trace_request_function,
|
|
112
|
+
retries=self._retry_count,
|
|
113
|
+
exclude_status_codes_from_retry=self._exclude_status_codes_from_retry,
|
|
114
|
+
use_data_streaming=self._use_data_streaming,
|
|
115
|
+
send_data_as_chunked=self._send_data_as_chunked,
|
|
116
|
+
compress=self._compress,
|
|
117
|
+
throw_exception_on_error=self._throw_exception_on_error,
|
|
118
|
+
log_all_url_results=self._log_all_response_urls,
|
|
119
|
+
access_token=self._access_token,
|
|
120
|
+
access_token_expiry_date=self._access_token_expiry_date,
|
|
121
|
+
persistent_session=self._persistent_session,
|
|
122
|
+
) as client:
|
|
123
|
+
http_post_start = time.time()
|
|
124
|
+
response: RetryableAioHttpResponse = await client.post(
|
|
125
|
+
url=resource_uri.url,
|
|
126
|
+
data=json_payload,
|
|
127
|
+
headers=headers,
|
|
128
|
+
)
|
|
129
|
+
profiling["http_post"] = time.time() - http_post_start
|
|
130
|
+
|
|
131
|
+
response_status = response.status
|
|
132
|
+
request_id = response.response_headers.get("X-Request-ID", None)
|
|
133
|
+
|
|
134
|
+
parse_response_start = time.time()
|
|
135
|
+
if response.status == 200:
|
|
136
|
+
response_text = await response.get_text_async()
|
|
137
|
+
if response_text:
|
|
138
|
+
try:
|
|
139
|
+
# Parse response as plain dicts for speed
|
|
140
|
+
parsed_response = json.loads(response_text)
|
|
141
|
+
if isinstance(parsed_response, list):
|
|
142
|
+
responses = parsed_response
|
|
143
|
+
else:
|
|
144
|
+
responses = [parsed_response]
|
|
145
|
+
except (ValueError, json.JSONDecodeError) as e:
|
|
146
|
+
errors.append(
|
|
147
|
+
{
|
|
148
|
+
"issue": [
|
|
149
|
+
{
|
|
150
|
+
"severity": "error",
|
|
151
|
+
"code": "exception",
|
|
152
|
+
"diagnostics": f"Failed to parse response: {str(e)}",
|
|
153
|
+
}
|
|
154
|
+
]
|
|
155
|
+
}
|
|
156
|
+
)
|
|
157
|
+
else:
|
|
158
|
+
# HTTP error
|
|
159
|
+
response_text = await response.get_text_async()
|
|
160
|
+
errors.append(
|
|
161
|
+
{
|
|
162
|
+
"issue": [
|
|
163
|
+
{
|
|
164
|
+
"severity": "error",
|
|
165
|
+
"code": "exception",
|
|
166
|
+
"diagnostics": response_text or f"HTTP {response.status}",
|
|
167
|
+
}
|
|
168
|
+
]
|
|
169
|
+
}
|
|
170
|
+
)
|
|
171
|
+
profiling["parse_response"] = time.time() - parse_response_start
|
|
172
|
+
|
|
173
|
+
except requests.exceptions.HTTPError as e:
|
|
174
|
+
raise FhirSenderException(
|
|
175
|
+
request_id=request_id,
|
|
176
|
+
url=resource_uri.url,
|
|
177
|
+
headers=headers,
|
|
178
|
+
json_data=json_payload,
|
|
179
|
+
response_text=response_text,
|
|
180
|
+
response_status_code=response_status,
|
|
181
|
+
exception=e,
|
|
182
|
+
variables=FhirClientLogger.get_variables_to_log(vars(self)),
|
|
183
|
+
message=f"HttpError: {e}",
|
|
184
|
+
elapsed_time=time.time() - merge_start_time,
|
|
185
|
+
) from e
|
|
186
|
+
except Exception as e:
|
|
187
|
+
raise FhirSenderException(
|
|
188
|
+
request_id=request_id,
|
|
189
|
+
url=resource_uri.url,
|
|
190
|
+
headers=headers,
|
|
191
|
+
json_data=json_payload,
|
|
192
|
+
response_text=response_text,
|
|
193
|
+
response_status_code=response_status,
|
|
194
|
+
exception=e,
|
|
195
|
+
variables=FhirClientLogger.get_variables_to_log(vars(self)),
|
|
196
|
+
message=f"Unknown Error: {e}",
|
|
197
|
+
elapsed_time=time.time() - merge_start_time,
|
|
198
|
+
) from e
|
|
199
|
+
|
|
200
|
+
# Convert dict responses to proper objects using fast method
|
|
201
|
+
create_objects_start = time.time()
|
|
202
|
+
response_entries: deque[BaseFhirMergeResourceResponseEntry] = deque()
|
|
203
|
+
|
|
204
|
+
for resp_dict in responses:
|
|
205
|
+
response_entries.append(FhirMergeResourceResponseEntry.from_dict_uncompressed(resp_dict))
|
|
206
|
+
|
|
207
|
+
for error_dict in errors:
|
|
208
|
+
response_entries.append(FhirMergeResponseEntryError.from_dict(error_dict, storage_mode=self._storage_mode))
|
|
209
|
+
profiling["create_response_objects"] = time.time() - create_objects_start
|
|
210
|
+
|
|
211
|
+
profiling["total_time"] = time.time() - merge_start_time
|
|
212
|
+
|
|
213
|
+
# Log profiling information if logger is available
|
|
214
|
+
if self._logger:
|
|
215
|
+
self._logger.debug(
|
|
216
|
+
f"merge_bundle_without_storage profiling: "
|
|
217
|
+
f"total={profiling['total_time']:.3f}s, "
|
|
218
|
+
f"build_url={profiling['build_url']:.3f}s, "
|
|
219
|
+
f"get_token={profiling['get_access_token']:.3f}s, "
|
|
220
|
+
f"prepare_payload={profiling['prepare_payload']:.3f}s, "
|
|
221
|
+
f"http_post={profiling['http_post']:.3f}s, "
|
|
222
|
+
f"parse_response={profiling['parse_response']:.3f}s, "
|
|
223
|
+
f"create_objects={profiling['create_response_objects']:.3f}s"
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
return FhirMergeResourceResponse(
|
|
227
|
+
request_id=request_id,
|
|
228
|
+
url=resource_uri.url,
|
|
229
|
+
responses=response_entries,
|
|
230
|
+
error=None if response_status == 200 else (response_text or f"HTTP {response_status}"),
|
|
231
|
+
access_token=self._access_token,
|
|
232
|
+
status=response_status,
|
|
233
|
+
response_text=response_text,
|
|
234
|
+
)
|
|
235
|
+
|
|
48
236
|
async def merge_bundle_async(
|
|
49
237
|
self,
|
|
50
238
|
id_: str | None,
|
|
@@ -75,6 +75,36 @@ class FhirMergeResourceResponseEntry(BaseFhirMergeResourceResponseEntry):
|
|
|
75
75
|
status=data.get("status"),
|
|
76
76
|
)
|
|
77
77
|
|
|
78
|
+
@classmethod
|
|
79
|
+
def from_dict_uncompressed(cls, data: dict[str, Any]) -> "FhirMergeResourceResponseEntry":
|
|
80
|
+
"""
|
|
81
|
+
Creates a FhirMergeResourceResponseEntry from a dictionary without storage_mode overhead.
|
|
82
|
+
Uses FhirResource.construct for faster object creation.
|
|
83
|
+
|
|
84
|
+
:param data: Dictionary containing the response entry data
|
|
85
|
+
:return: FhirMergeResourceResponseEntry instance
|
|
86
|
+
"""
|
|
87
|
+
resource_payload = data.get("resource")
|
|
88
|
+
resource_obj: FhirResource | None = (
|
|
89
|
+
FhirResource.construct(**resource_payload) if isinstance(resource_payload, dict) else None
|
|
90
|
+
)
|
|
91
|
+
return FhirMergeResourceResponseEntry(
|
|
92
|
+
created=data.get("created"),
|
|
93
|
+
updated=data.get("updated"),
|
|
94
|
+
deleted=data.get("deleted"),
|
|
95
|
+
id_=data.get("id"),
|
|
96
|
+
uuid=data.get("uuid"),
|
|
97
|
+
resource_type=data.get("resourceType"),
|
|
98
|
+
source_assigning_authority=data.get("source_assigning_authority"),
|
|
99
|
+
resource_version=data.get("resource_version"),
|
|
100
|
+
message=data.get("message"),
|
|
101
|
+
issue=data.get("issue"),
|
|
102
|
+
error=data.get("error"),
|
|
103
|
+
token=data.get("token"),
|
|
104
|
+
resource=resource_obj,
|
|
105
|
+
status=data.get("status"),
|
|
106
|
+
)
|
|
107
|
+
|
|
78
108
|
@classmethod
|
|
79
109
|
@override
|
|
80
110
|
def from_json(
|
|
@@ -8,7 +8,7 @@ import async_timeout
|
|
|
8
8
|
from aiohttp import ClientError, ClientResponse, ClientResponseError, ClientSession
|
|
9
9
|
from multidict import MultiMapping
|
|
10
10
|
from opentelemetry import trace
|
|
11
|
-
|
|
11
|
+
|
|
12
12
|
from helix_fhir_client_sdk.function_types import (
|
|
13
13
|
RefreshTokenFunction,
|
|
14
14
|
RefreshTokenResult,
|
|
@@ -130,7 +130,6 @@ class RetryableAioHttpClient:
|
|
|
130
130
|
if self.compress:
|
|
131
131
|
kwargs["compress"] = self.compress
|
|
132
132
|
assert self.session is not None
|
|
133
|
-
logging.info(f"Using Session ID: {id(self.session)} for URL: {url}")
|
|
134
133
|
with TRACER.start_as_current_span(FhirClientSdkOpenTelemetrySpanNames.HTTP_GET) as span:
|
|
135
134
|
span.set_attribute(
|
|
136
135
|
FhirClientSdkOpenTelemetryAttributeNames.URL,
|